在MATLAB中使用不同的子数据创建总数据

时间:2012-11-27 03:48:20

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

我在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来做这个?

感谢。

3 个答案:

答案 0 :(得分:2)

我不会马上跳上我的马车,而是从解决方案开始(已经设置了一个示例):

%# 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那么你几乎肯定做错了。

答案 1 :(得分:1)

有这样的问题告诉我,你还不熟悉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;

现在每件事都是一个变量,你可以保存而无需输入任何额外的东西。

答案 2 :(得分:0)

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