如何连接两个不同的matlab文件的所有变量?

时间:2012-09-24 01:08:59

标签: matlab concatenation

我有两个相同的变量列表的mat文件。

在file1.mat

*Variables*       *Value*       *Type*       

Time              [100X1]       double

Force             [100x1]       double

在file2.mat

*Variables*      *Value*       *Type*       

Time_1           [90X1]        double

Force_1          [90x1]        double

我想垂直连接这两个文件。添加到文件2的后缀_1更改为_2_32等。

如何引用变量并将它们连接在一个循环中,这样我就不必每次都打开文件并在vertcat中输入变量名?

2 个答案:

答案 0 :(得分:2)

您可以为此任务使用load命令的两个不错的属性。首先,带有输出参数的load创建一个字段名称等于变量名称的结构,这意味着您可以在不必事先知道变量命名的情况下加载数据。其次,字段按字母顺序分配,这意味着force将始终是第一个字段,time是第二个字段。

结合这些属性,您可以执行以下操作:

%# get a listing of all save files
fileList = dir('file*');
nFiles = length(fileList);

loadedData = cell(nFiles,2); %# for storing {force,time}

%# loop through files and write results into loadedData
for iFile = 1:nFiles
    tmp = load(fileList{iFile});
    loadedData(iFile,:) = struct2cell(tmp)';
end

%# catenate
time = cat(1,loadedData(:,2));
force = cat(1,loadedData(:,1));

请注意,如果您的文件名为file1 ... file10,而不是file001 ... file010,则使用{{dir的字母顺序1}}命令可能不太理想。在这种情况下,您可能必须提取文件名末尾的数字并重新排序列表。

答案 1 :(得分:0)

以下代码段是否有助于解决您的问题?

Time_1 = [1; 2];
Time_2 = [2; 3];
Time_3 = 4;
All = [];
for i = 1:3
    CurTime = eval(horzcat('Time_', num2str(i)));
    All = [All; CurTime];
end

基本上发生的事情是我循环遍历Time_1Time_2Time_3的后缀。对于每次迭代,我通过在字符串中手动构建变量的名称,然后使用Time_x函数将其分配给CurTime来获取相关的eval变量。然后使用CurTime

简单地执行所需的连接

当然,由于All在循环中增长,因此此代码效率不高。如果您事先知道All的大小,那么您可以预先分配它。如果在事实之前大小未知,您可以实现解决方案here(或者只是将其预先分配为任意大,然后在循环完成后将其剪切为大小)。

如果我误解了您所遇到的问题,请告诉我,我会尝试提供更有帮助的内容。

另外,有些人认为eval是邪恶的。当然,如果您的代码包含10个不同的eval来电,那么您可能做错了。