繁体   English   中英

如何在Octave / Matlab中将“ .mat”文件作为参数传递

[英]How to pass a “.mat” file as an argument in Octave/Matlab

我有许多.mat文件。 我写了一个简短的脚本,在其中我使用file1.mat并分析了数据。 该过程的下一步将是对file2.mat做同样的事情。 一种方法是简单地复制我以前的代码,并用“ file2.mat”替换所有的“ file1.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.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. 检查输出是否正确

简单得多,而且您不必在任何时候都忙于保存/加载文件,也无需在硬盘驱动器上创建任何混乱的文件。 如果您需要进行任何调试,则过程也将更加容易-只需创建一个函数将失败的示例,然后逐步执行代码以查看其实际失败的地方。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM