【问题标题】:How to concatenate several .mat files into one如何将多个 .mat 文件合并为一个
【发布时间】:2014-04-13 11:51:10
【问题描述】:

我有几个 mat 文件,例如:first.mat ,second.mat ,third.mat,...

所有这些文件都具有相同的内容,例如: variable1 , variable2 , variable3 , ...

所有 mat 文件的内容相同,但每个 mat 文件中每个变量的大小不同。我需要连接所有 mat 文件中的所有相同变量,以便只有一个 mat 文件。

谁能告诉我我能做什么?我应该使用哪个功能?

非常感谢。

【问题讨论】:

  • 你想要的非常具体,我怀疑是否有内置函数可以做到这一点。
  • “所有相同的变量”是什么意思?从您的示例看来,变量并不相同。你能举一个更清楚的例子来说明你想要完成什么吗?

标签: matlab


【解决方案1】:

没有matlab函数可以做到这一点,你需要打开所有单独的向量,以你想要的方式组合它们,然后将它们保存回磁盘。像这样的东西(未经测试):

filenames = {'file1.mat', 'file2.mat', ...};

data = cell(length(filenames), 1); % cell array to store all vectors

for i = 1:length(filenames)
    var = load(filenames{i});
    data{i} = var; % store single vector into cell array
end
data = cell2mat(data); % combine all small column vectors into one big one
save('combined_vars.mat', data)

【讨论】:

  • var 将是一个结构,所以我不确定cell2mat 是否会起作用。这就是我在回答中使用fieldnamesgetfield 的原因。
  • 然后每次迭代都从struct中取出数据,存入元胞数组,思路不变。
  • 更正 - save('combined_vars.mat', 'data')。 +1 经测试,有效!
  • 您不需要在data(1,1).variable1data(2,1).variable1data(3,1).variable1等之间垂直连接数据吗?
  • 我将所有列向量放入一个列形单元数组中,然后在循环后使用cell2mat 将其连接起来。这比通过每次迭代连接一次来增长数组要快,因为这样您需要在每次迭代时为更大的向量分配越来越多的内存,这是二次行为,应该不惜一切代价避免。
【解决方案2】:

感谢大家的回答,这是正常工作的最终代码。

clear
PathName = uigetdir;
file_all = dir(fullfile(PathName,'*.mat'));
matfile = file_all([file_all.isdir] == 0); 
clear file_all PathName

x=[];                               % start w/ an empty array
for i=1:length(matfile)
    x=[x; load(matfile(i).name)];   % read/concatenate into x
end

b=[];
for j=1:length(x)
    b=[b; x(j, 1).variable1];
end

FileName = [matfile(i,1).name(1:end-9),'.mat'];
save(FileName,'matfile','x','b');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    • 2014-05-17
    • 2014-01-20
    相关资源
    最近更新 更多