【问题标题】:Create a total data with different subdata in MATLAB在 MATLAB 中创建具有不同子数据的总数据
【发布时间】:2012-11-27 03:48:20
【问题描述】:

我在 Workspace 中有几个名为 ET1_A_C1_l1ET1_A_C2_l1ET1_A_C3_l1、...、ET1_A_C63_l1 的数据。除此之外,我还有另一组名为ET1_H_C1_l1ET1_H_C2_l1、...、ET1_A_C63_l1的数据

现在我需要将 2 组数据合并为一个名为 Total_data.mat 的数据;例如,

Total_data=[ET1_A_C1_l1 ET1_A_C2_l1 ET1_A_C3_l1 ..... ET1_A_63_l1;ET1_H_C1_l1 ET1_H_C2_l1 ....ET1_H_C63_l1]

并且需要花费大量时间来逐一键入代码。有什么想法可以使用loop 来做到这一点吗??

谢谢。

【问题讨论】:

  • ET1_A_C1 是数字矩阵吗?什么尺寸?所有剩余的变量也是数字矩阵吗?它们的大小都一样吗?这是回答问题的必要信息。
  • 所有变量都是 6x2 数字矩阵,并且大小相同。
  • 我已经提供了答案。如果它解决了您的问题,请随时通过单击我的解决方案旁边的勾号来标记已回答的问题。干杯。

标签: matlab loops for-loop octave inner-classes


【解决方案1】:

我不会直接跳上我的马车,而是从解决方案开始(已通过示例设置):

%# State the size of each matrix
T = 6; N = 2;

%# State the number of matrices in category A and H (63 in your case - but 2 in my example) 
K = 2;

%# Set up some example matrices
ET1_A_C1_l1 = rand(T, N); ET1_A_C2_l1 = 1 + rand(T, N);
ET1_H_C1_l1 = 2 + rand(T, N); ET1_H_C2_l1 = 3 + rand(T, N);

%# Preallocate a matrix to hold the output
M = NaN(2 * T, K * N);

%# Loop over the variables and add them to the matrix using the evil eval
for k = 1:K
    M(1:T, (k*N)-1:k*N) = eval(['ET1_A_C', num2str(k), '_l1']);
    M(T+1:2*T, (k*N)-1:k*N) = eval(['ET1_H_C', num2str(k), '_l1']);
end

%# Save to a mat file
save('Total_Data.mat', 'M');

现在,马车时间:如果您已经以您现在拥有的形式获得了数据,而您对此无能为力,并且您意识到处于多么可怕的境地,那么您现在可以停止阅读了。

但是,如果您首先负责创建所有这些 E_blah 变量,那么您需要查看@jerad 的答案并开始考虑存储数据的不同方式。单元阵列或结构是实现它的一种方法。或者首先从一个大矩阵开始。但请记住以下两条一般规则:

1) 如果您的工作区中有超过 20 个变量,那么您可能做错了。

2) 如果你发现自己经常使用邪恶功能eval,那么你几乎肯定是做错了。

【讨论】:

    【解决方案2】:

    遇到此类问题表明您对 matlab 中可用的其他数据结构还不太熟悉……例如元胞数组和结构。您可以通过将数据存储在较少的数组中,然后在需要时正确索引它们来轻松解决此问题。

    阅读 matlab 文档中的structures (this tutorial is excellent),然后尝试使用其中一个来存储您的所有数据。我认为这将解决这个问题以及您不知道的许多其他问题。

    您应该使用类似以下的内容。

    ET = struct;
    ET.A.C(1) = ET1_A_C1;
    ET.A.C(2)  = ET1_A_C2;
             ...
    ET.A.C(N)  = ET1_A_CN;
    
    ET.H.C(1)  = ET1_H_C1;
    ET.H.C(2)  = ET1_H_C2;
              ...
    ET.H.C(N)  = ET1_H_CN;
    

    现在每件事都是一个变量,您无需输入任何额外内容即可保存。

    【讨论】:

      【解决方案3】:

      filename=Total_data.mat;

      for i=1:63
      J(i,1)=ET1_A_C{i};
      J(i,2)=ET1_H_C{i};
      end
      

      save(filename,'J(1:63,1)','J(1:63,2)');

      【讨论】:

      • 代码中的{}是什么意思??我通过在每个数据中添加术语“_l1”将数据名称更改为 ET1_A_C1_l1,它将显示无效字符并无法运行..
      • 我没有看到添加“_I1”的目的。你能说说它的用途吗?我实际上给出了一个类似结构的伪代码。就像您需要使用 eval 命令将字符串转换为变量名,然后将数据存储在其中。
      猜你喜欢
      • 1970-01-01
      • 2021-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-28
      相关资源
      最近更新 更多