首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在Octave/Matlab中传递".mat“文件作为参数

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

Stack Overflow用户
提问于 2014-11-30 15:58:57
回答 1查看 1.5K关注 0票数 1

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

我已经浏览了一下网络,最近的是"feval“函数,如果我有.m文件,它可以很好地工作,但是与.mat文件完全没有关系。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-30 16:28:33

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

代码语言:javascript
代码运行次数:0
运行
复制
load('C:\data\input1.mat'); %// loads x, y into the workspace
z = x + y;
save('C:\data\output1.mat', 'z');

你也想要处理input2.matinput3.mat等等。最好的方法是编写一个函数,将所有这些工作打包到一个整洁的块中-

代码语言:javascript
代码运行次数:0
运行
复制
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

现在你可以这样称呼它了

代码语言:javascript
代码运行次数:0
运行
复制
processData('input1.mat', 'output1.mat')
processData('input2.mat', 'output2.mat')

等等,甚至更好

代码语言:javascript
代码运行次数:0
运行
复制
inputNames = {'input1.mat', 'input2.mat' };
outputNames = {'output1.mat', 'output2.mat'};

for i = 1:length(inputNames)
    processData(inputNames{i}, outputNames{i});
end

或者,如果您的文件名恰好是结构化的,则只需

代码语言:javascript
代码运行次数:0
运行
复制
for i = 1:2
    infile = sprintf('input%d.mat', i);
    outfile = sprintf('output%d.mat', i);
    processData(infile, outfile);
end

另一种可能的解决方案是编写函数,这样它就不会加载或保存任何文件,而是接收一些数据作为输入,并将其作为输出返回。这更灵活,因为现在您可以控制访问数据的方式(例如,在处理任何数据之前,您可能希望将其全部加载到工作区-您现在可以这样做,而在数据加载、处理和保存都绑定在一个函数之前)。processData函数将如下所示

代码语言:javascript
代码运行次数:0
运行
复制
function dataOut = processData(dataIn)
    x = dataIn.x;
    y = dataIn.y;
    dataOut.z = x + y;
end

如果你想要加载文件,然后一次处理一个文件,你就这样使用它,

代码语言:javascript
代码运行次数:0
运行
复制
for i = 1:length(inputNames)
    dataIn = load(fullfile('C:\data', inputNames{i}));
    dataOut = processData(dataIn);
    save(fullfile('C:\data', outputNames{i}), '-struct', 'dataOut');
end

或者像这样,如果你想做所有的装载,然后所有的处理,然后所有的节省-

代码语言:javascript
代码运行次数:0
运行
复制
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. 检查输出是否正确

要简单得多,而且您不必在任何时候乱搞保存/加载文件,也不必在硬盘上创建任何凌乱的文件。如果您需要进行任何调试,这个过程也要容易得多--只需创建一个函数将继续失败的示例,然后逐步遍历代码,查看其实际失败的位置。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27215113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档