我有两个相同的变量列表的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
中输入变量名?
答案 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_1
,Time_2
和Time_3
的后缀。对于每次迭代,我通过在字符串中手动构建变量的名称,然后使用Time_x
函数将其分配给CurTime
来获取相关的eval
变量。然后使用CurTime
当然,由于All
在循环中增长,因此此代码效率不高。如果您事先知道All
的大小,那么您可以预先分配它。如果在事实之前大小未知,您可以实现解决方案here(或者只是将其预先分配为任意大,然后在循环完成后将其剪切为大小)。
如果我误解了您所遇到的问题,请告诉我,我会尝试提供更有帮助的内容。
另外,有些人认为eval
是邪恶的。当然,如果您的代码包含10个不同的eval
来电,那么您可能做错了。