0

我有两个具有相同变量列表的 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

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

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

4

2 回答 2

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));

Note that if your files are called file1...file10, instead of file001...file010, the alphabetical ordering you get from using the dir command may not be ideal. In that case, you may have to extract the number at the end of the file name and re-order the list.

于 2012-09-24T02:48:02.227 回答
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_2Time_3. 对于每次迭代,我Time_x通过在字符串中手动构建变量的名称来获取相关变量,然后将其分配给CurTime使用eval函数。然后只需使用执行所需的连接CurTime

当然,这段代码效率不是很高,因为All它在循环中增长。如果你All事先知道它的大小,那么你可以预先分配它。如果实际大小未知,您可以在此处实现解决方案(或者只是将其预先分配为任意大,然后在循环完成后将其缩减为大小)。

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

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

于 2012-09-24T01:47:46.020 回答