2012-09-24 57 views
0

我有两个具有相同变量列表的mat文件。如何连接两个不同matlab文件的所有变量?

在file1.mat

*Variables*  *Value*  *Type*  

Time    [100X1]  double 

Force    [100x1]  double 

在file2.mat

*Variables*  *Value*  *Type*  

Time_1   [90X1]  double 

Force_1   [90x1]  double 

我想垂直串联这两个文件。后缀_1添加到文件2更改_2_32

如何可以参考我的变量和一个循环将它们连接起来,所以我不必打开文件,每次和vertcat输入变量的名字呢?

回答

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,数字字母顺序从使用get dir命令可能并不理想。在这种情况下,您可能需要在文件名末尾提取数字并重新排列列表。

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_2,并且Time_3后缀。对于每次迭代,通过我在一个字符串中手动构建的变量的名称,然后使用eval函数它分配给CurTime获得相关Time_x变量。然后只需使用CurTime

简单地执行所需的级联当然,此代码效率不高,因为All正在循环中增长。如果您事先知道All的大小,则可以预先分配它。如果在事实之前未知大小,则可以实施解决方案here(或者只是预先将其分配为任意大,然后在完成循环后将其减小到最小)。

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

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

+0

感谢您的回复。我遇到的问题是,我有100多个变量,我想保留第一个文件的变量名(即没有后缀的变量)而不引入新变量。 – Prasanna

+0

@Prasanna:那么只需使用'Time = [Time; Curdate];' –

+0

@Prasanna您可以通过读取循环中的每个文件来保持工作空间不变,像上面那样应用'eval'命令,然后清除使用类似'eval(['clear' ,horzcat('Time_',num2str(i)]);'。然而,这涉及到另一个'eval'的使用,一个更好的解决方案是Jonas建议的方法(+1给你,先生),我建议你接受回答并花费时间学习如何使用这个答案中建议的结构 –

相关问题