我有很多.mat文件。我写了一个简短的脚本,我使用file1.mat并分析数据。该过程的下一步是为file2.mat做同样的事情。一种方法是简单地复制我以前的代码并用“file2.mat”替换所有“file1.mat”并为3,4做同样的事情....但是,我觉得必须有一个更优雅的解决方案最佳情况是,如果我可以编写一个函数,将文件名(最好不是整个路径)作为参数。这可能吗?
我已经匆匆上网了,我得到的最接近的是“feval”功能,如果我有.m文件但是根本没有.mat文件,它可以正常工作。
有没有办法将.mat文件传递给matlab函数?
答案 0 :(得分:1)
假设您有以下脚本,它只加载一些.mat文件并处理两个变量 -
load('C:\data\input1.mat'); %// loads x, y into the workspace
z = x + y;
save('C:\data\output1.mat', 'z');
并且您还希望处理input2.mat
,input3.mat
等。最好的方法是编写一个将所有这些工作包装成一个整齐的blob的函数 -
function processData(fnameIn, fnameOut)
pathIn = fullfile('C:\data', fnameIn);
pathOut = fullfile('C:\data', fnameOut);
load(pathIn); %// loads x, y into the workspace
z = x + y;
save(pathOut, 'z');
end
现在你可以这样称呼它
processData('input1.mat', 'output1.mat')
processData('input2.mat', 'output2.mat')
等,甚至更好
inputNames = {'input1.mat', 'input2.mat' };
outputNames = {'output1.mat', 'output2.mat'};
for i = 1:length(inputNames)
processData(inputNames{i}, outputNames{i});
end
或者,如果您的文件名恰好是结构化的,那么您可以这样做
for i = 1:2
infile = sprintf('input%d.mat', i);
outfile = sprintf('output%d.mat', i);
processData(infile, outfile);
end
另一种可能的解决方案是编写函数,使其根本不进行任何文件加载或保存,而是接收一些数据作为输入并将其作为输出返回。这更灵活,因为现在您可以控制访问数据的方式(例如,您可能希望在处理任何数据之前将其全部加载到工作区中 - 您现在可以这样做,而在数据加载,处理和保存之前都是在一个功能中捆绑在一起)。 processData
函数看起来像这样
function dataOut = processData(dataIn)
x = dataIn.x;
y = dataIn.y;
dataOut.z = x + y;
end
如果你想加载文件然后一次处理一个文件,你可以像这样使用它,
for i = 1:length(inputNames)
dataIn = load(fullfile('C:\data', inputNames{i}));
dataOut = processData(dataIn);
save(fullfile('C:\data', outputNames{i}), '-struct', 'dataOut');
end
或者像这样,如果你想做所有的加载,然后是所有的处理,那么所有的保存 -
for i = 1:length(inputNames)
dataIn(i) = load(fullfile('C:\data', inputNames{i}));
end
for i = 1:length(inputNames)
dataOut(i) = processData(dataIn);
end
for i = 1:length(inputNames)
tmp = dataOut(i);
save(fullfile('C:\data', outputNames{i}), '-struct', 'tmp');
end
以这种方式编写processData
的一个重要优点是,如果您想要测试或调试它,它会突然变得更加容易。如果文件加载/保存在函数内部,并且您想要测试它,则必须
processData
如果将数据加载/保存与处理分开,那么您的测试程序将变为
processData
更简单,您不必随时保存/加载文件,并且您没有在硬盘上创建任何杂乱的文件。如果您需要进行任何调试,那么该过程也会更容易 - 只需创建一个函数将失败的示例,然后逐步执行代码以查看它实际失败的位置。