如何通过a";。垫;在Octave/Matlab中作为参数的文件

如何通过a";。垫;在Octave/Matlab中作为参数的文件,matlab,function,octave,Matlab,Function,Octave,我有许多.mat文件。我已经编写了一个简短的脚本,使用file1.mat分析数据。该过程的下一步是对file2.mat执行相同的操作。一种方法是简单地复制我以前的代码,将所有的“file1.mat”替换为“file2.mat”,并对3、4……执行相同的操作。。。。然而,我觉得必须有一个更优雅的解决方案。最佳情况是,如果我可以编写一个函数,将文件名(最好不是整个路径)作为参数。这可能吗 我在网上匆匆忙忙,最近得到的是“feval”函数,如果我有.m文件,它可以很好地工作,但没有.mat文件 有没有

我有许多.mat文件。我已经编写了一个简短的脚本,使用file1.mat分析数据。该过程的下一步是对file2.mat执行相同的操作。一种方法是简单地复制我以前的代码,将所有的“file1.mat”替换为“file2.mat”,并对3、4……执行相同的操作。。。。然而,我觉得必须有一个更优雅的解决方案。最佳情况是,如果我可以编写一个函数,将文件名(最好不是整个路径)作为参数。这可能吗

我在网上匆匆忙忙,最近得到的是“feval”函数,如果我有.m文件,它可以很好地工作,但没有.mat文件


有没有办法将.mat文件传递给matlab函数?

假设您有以下脚本,它只加载一些.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')
function dataOut = processData(dataIn)
    x = dataIn.x;
    y = dataIn.y;
    dataOut.z = x + y;
end
等等,甚至更好

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
函数如下所示

processData('input1.mat', 'output1.mat')
processData('input2.mat', 'output2.mat')
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
  • 检查输出是否正确

  • 更简单,您不必在任何时候乱动保存/加载文件,也不必在硬盘上创建任何乱七八糟的文件。如果您需要进行任何调试,这个过程也会简单得多——只需创建一个函数将失败的示例,然后逐步检查代码,看看它实际失败的地方

    mat
    文件保存在变量中,并将其传递给函数。