Matlab 向量中非连续大小矩阵的分裂
我正在用Matlab编写一个软件。在这里,用户可以定义一个维度,比如3 该维度随后是for循环的迭代次数。在这个循环中,我构造了一个矩阵来存储每次迭代期间生成的结果。因此,每次迭代的数据都存储在矩阵的一行中 因此,矩阵的大小取决于循环的大小以及用户输入 现在,我想分离这个矩阵(cl_矩阵)的每一行,并自动为每一行创建单独的向量。一个人将如何继续?我被困在这里 到目前为止,我已经:Matlab 向量中非连续大小矩阵的分裂,matlab,matrix,Matlab,Matrix,我正在用Matlab编写一个软件。在这里,用户可以定义一个维度,比如3 该维度随后是for循环的迭代次数。在这个循环中,我构造了一个矩阵来存储每次迭代期间生成的结果。因此,每次迭代的数据都存储在矩阵的一行中 因此,矩阵的大小取决于循环的大小以及用户输入 现在,我想分离这个矩阵(cl_矩阵)的每一行,并自动为每一行创建单独的向量。一个人将如何继续?我被困在这里 到目前为止,我已经: Angle = [1 7 15]; for i = 1:length(Angle) %% do some c
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,:);
谢谢 在
工作区中动态生成通过聚合字符串和数值(如您的问题所示)来生成其名称的变量的唯一方法是使用eval
函数
然而,eval
仅仅是一个远离“邪恶”的角色,它既诱人又危险
直接使用cl_矩阵
和生成数组集cl_1
、cl_7
和cl_15
之间的一种可能的折衷方法是创建一个结构
whos字段
实际上,您可以通过以下方式生成struct
whos字段cl\u 1
、cl\u 7
和cl\u 15
:
cl_struct.(['cl_' num2str(Angle(i))])=cl_matrix(i,:)
(您可能会注意到字段名,例如,cl_1
,其生成方式与使用eval
生成它的方式相同)
使用这种方法在使用eval
生成数组方面具有显著优势:您可以访问字段od结构(即它们的内容),甚至不知道它们的名称
在下面的代码中,您可以找到实现此方法的脚本的修改版本
脚本将生成两个结构:
- 第一个,
cl\u struct\u same\u length
用于存储cl\u矩阵的行
- 第二种方法,
cl\u struct\u different\u length
用于存储不同长度的数组
在脚本中,有一些关于如何访问文件(即数组)以执行某些计算的示例(在示例中,评估每个文件的平均值
)
您可以使用以下函数访问结构字段:
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))]))
希望这能有所帮助。我不清楚你在问什么。为什么矩阵是非连续的?你为什么要这样做?这是非常糟糕的做法,将来只会导致更多的头痛。你有一个完全可用的矩阵和合理的索引:我建议你使用它。由于大小变化,它取决于“角度”的长度。因此,输出向量的数量会发生变化,使用单元数组如何?我同意比克的观点,这可能会导致未来的其他问题。如果您真的需要,我所能想到的就是使用eval
。但这既慢又难看。@BalrajBoyal当Angle
的长度改变时,cl\u矩阵的长度也会改变。如果你担心的话,请给我们看看你的插值代码。我不明白为什么cl_457
比cl_矩阵(42,:)
容易。特别是当你的下一个问题可能是“我如何迭代所有这些变量名,c1
,c1\u7
…”。在eval
和“邪恶”之间有一个很好的类比