【问题标题】:How to concatenate all the variables of two different matlab files?如何连接两个不同matlab文件的所有变量?
【发布时间】:2012-09-24 01:08:59
【问题描述】:

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

【问题讨论】:

    标签: matlab concatenation


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      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 变量,然后使用eval 函数将其分配给CurTime。然后只需使用CurTime 执行所需的连接

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

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

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

      【讨论】:

      • 感谢您的回复。我遇到的问题是,我有 100 多个变量,我想保留第一个文件的变量名(即没有后缀的变量)而不引入新变量。
      • @Prasanna:那就用Time = [Time; CurTime];
      • @Prasanna 你可以通过读取循环中的每个文件来保持工作空间的精简,像上面一样应用eval 命令,然后清除使用eval(['clear ', horzcat('Time_', num2str(i)]); 之类的东西加载的变量。但是,这涉及到eval 的另一种用法。 Jonas 建议的一个更简洁的解决方案(+1 先生)。我建议您接受该答案并花时间学习使用该答案中建议的结构。
      • 这是一个好的开始。正在研究与大量未知变量一起使用的动态字段名称。谢谢
      猜你喜欢
      • 2016-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多