2015-10-12 31 views
0

我在Matlab中编写了一个软件。在这里,用户可以定义一个尺寸,例如3.向量中分割非连续大小的矩阵

该维度随后是for循环的迭代次数。在这个循环中,我构造了一个矩阵来存储在每次迭代过程中生成的结果。所以,每次迭代的数据都存储在一行矩阵中。

因此,矩阵的大小取决于循环的大小以及用户输入。

现在,我要分开这个矩阵(cl_matrix)的每一行和每一行自动生成不同的载体。如何继续下去?我至今坚持在这里......

我:

Angle = [1 7 15]; 
for i = 1:length(Angle) 
    %% do some calculations here %% 
    cl_matrix(i,:) = A.data(:,7); 
end 

我想基于角的长度,自动完成:

length(Angle) 
cl_1 = cl_matrix(1,:); 
cl_7 = cl_matrix(2,:); 
cl_15= cl_matrix(3,:); 

谢谢!

+0

不清楚你在问什么。为什么矩阵不连续? – natario

+1

你为什么要这么做?这是非常糟糕的做法,只会导致未来更令人头痛。你有一个完美可用的矩阵,具有明智的索引:我建议你使用它。 – beaker

+0

由于尺寸变化,它取决于“角度”的长度。因此,输出矢量的量变化 –

回答

2

workspace变量中动态生成变量的唯一方法是使用eval函数通过汇总字符串和数字值构建名称(如您的问题)。

尽管如此,eval是只有一个字符远离“邪恶”的,诱人的,因为它是和危险的,因为它是为好。

之间与cl_matrix直接工作,并产生所述一组阵列cl_1cl_7cl_15可以创建一个structure卫生组织fieldsdynamically generated一种可能的折衷。

实际上,你可以生成一个struct卫生组织场均cl_1cl_7cl_15这样:

cl_struct.(['cl_' num2str(Angle(i))])=cl_matrix(i,:) 

(您可能会注意到的字段名称,如cl_1,你可以通过生成同样的方式产生使用eval)。

使用这种方法通过使用eval提供了一个显着的优势,相对于阵列的一代:您可以访问到field OD的struct(也就是他们的内容),甚至不知道他们的名字。

在下面,你可以在其中找到这种方法已经实现你的脚本的修改版本。

脚本生成两个结构:

  • 第一个,cl_struct_same_length用于存储的cl_matrix
  • thesecond一个行,cl_struct_different_length用于不同长度的存储阵列

在脚本中有关于如何访问文件(即数组)以执行一些计算的示例(在该示例中,用于评估每个文件的mean)。

您可以通过使用功能接入到结构域:

  • getfield得到的值存储在它
  • fieldnames获取字段的名称(动态生成的)

更新的脚本

Angle = [1 7 15]; 
for i = 1:length(Angle) 
    % do some calculations here %% 
% % % cl_matrix(i,:) = A.data(:,7); 
    % Populate cl_matrix 
    cl_matrix(i,:) = randi(10,1,10)*Angle(i); 
    % Create a struct with dinamic filed names 
    cl_struct_same_length.(['cl_' num2str(Angle(i))])=cl_matrix(i,:) 
    cl_struct_different_length.(['cl_' num2str(Angle(i))])=randi(10,1,Angle(i)) 
end 
% Use "fieldnames" to get the names of the dinamically generated struct's field 
cl_fields=fieldnames(cl_struct_same_length) 
% Loop through the struct's fileds to perform some calculation on the 
% stored values 
for i=1:length(cl_fields) 
    cl_means(i)=mean(cl_struct_same_length.(cl_fields{i})) 
end 
% Assign the value stored in a struct's field to a variable 
row_2_of_cl_matrix=getfield(cl_struct_different_length,(['cl_' num2str(Angle(2))])) 

希望这有助于。

+1

“eval”与“邪恶”之间的好比喻 – hbaderts