【问题标题】:How to pass a ".mat" file as an argument in Octave/Matlab如何在 Octave/Matlab 中将“.mat”文件作为参数传递
【发布时间】:2014-11-30 15:58:57
【问题描述】:

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

我已经上网了,我得到的最接近的是“feval”函数,如果我有 .m 文件但对于 .mat 文件则完全没有。

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

【问题讨论】:

  • mat文件保存在一个变量中并传递给函数。

标签: matlab function octave


【解决方案1】:

假设您有以下脚本,它只是加载一些 .mat 文件并处理两个变量 -

load('C:\data\input1.mat'); %// loads x, y into the workspace
z = x + y;
save('C:\data\output1.mat', 'z');

并且您还想处理input2.matinput3.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 的一大优点是,如果您想对其进行测试或调试,它会突然变得容易得多。如果文件加载/保存在函数内部,并且您想对其进行测试,则必须

  1. 创建测试数据
  2. 将测试数据保存到文件中
  3. 以文件名作为输入运行processData
  4. 加载包含输出数据的文件
  5. 检查输出数据是否正确
  6. 记得清理包含测试数据的文件,无论您放在哪里

如果您将数据加载/保存与处理分开,那么您的测试程序就变成了

  1. 创建测试数据
  2. 以测试数据作为输入运行processData
  3. 检查输出是否正确

简单得多,您不必在任何时候都在保存/加载文件时搞乱,也不会在硬盘驱动器上创建任何乱七八糟的文件。如果您需要进行任何调试,该过程也容易得多 - 只需创建一个您的函数将失败的示例,然后单步执行代码以查看它实际失败的位置。

【讨论】:

    猜你喜欢
    • 2011-02-13
    • 2016-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多