我编写了一个将数据存储在矩阵中的代码,但我想缩短它以便迭代自己。 创建的矩阵数是已知变量。如果是3,则代码为:
for i = 1:31
if idx(i) == 1
C1 = [C1; Output2(i,:)];
end
if idx(i) == 2
C2 = [C2; Output2(i,:)];
end
if idx(i) == 3
C3 = [C3; Output2(i,:)];
end
end
答案 0 :(得分:0)
正如patrik在评论中所说,这样的命名变量是不好的做法。最好使用单元格数组M{1}=C1
,或者所有Ci
的大小相同,即使只是一个3D数组M
,例如M(:,:,1)=C1
。< / p>
如果您真的想使用C1
,C2
,......作为变量名称,我认为您必须使用eval
,如arielnmz所述。在matlab中执行此操作的一种方法是
for i=1:3
eval(['C' num2str(idx(i)) '=[C' num2str(idx(i)) ';Output2(' num2str(i) ',:)];'])
end
编辑添加测试代码:
idx=[2 1 3 2 2 3];
Output2=rand(6,4);
C1a=[];
C2a=[];
C3a=[];
for i = 1:length(idx)
if idx(i) == 1
C1a = [C1a; Output2(i,:)];
end
if idx(i) == 2
C2a = [C2a; Output2(i,:)];
end
if idx(i) == 3
C3a = [C3a; Output2(i,:)];
end
end
C1=[];
C2=[];
C3=[];
for i=1:length(idx)
eval(['C' num2str(idx(i)) '=[C' num2str(idx(i)) ';Output2(' num2str(i) ',:)];'])
end
all(C1a(:)==C1(:))
all(C2a(:)==C2(:))
all(C3a(:)==C3(:))
答案 1 :(得分:0)
如果我理解正确,你想根据idx值从Output2中提取行到新变量?如果是这样,您可以执行以下操作:
Output2 = rand(5, 10); % example
idx = [1,1,2,2,3];
% get rows from Output which numbers correspond to those in idx with given value
C1 = Output2(find(idx==1),:);
C2 = Output2(find(idx==2),:);
C3 = Output2(find(idx==3),:);
答案 2 :(得分:0)
与Marcin类似,我有另一个解决方案。在这里,我预定义my_C
作为单元格数组。 Output2和idx是随机生成的,而不是find我只使用逻辑地址。您必须将数据转换为类型单元格{}
Output2 = round(rand(31,15)*10);
idx = uint8(round(1+rand(1,31)*2));
my_C = cell(1,3);
my_C(1,1) = {Output2(idx==1,:)};
my_C(1,2) = {Output2(idx==2,:)};
my_C(1,3) = {Output2(idx==3,:)};
如果您想要恢复数据,只需使用例如my_C{1,1}
为第一组。
如果您没有3个但是n个结果矩阵,您可以使用:
Output2 = round(rand(31,15)*10);
idx = uint8(round(1+rand(1,31)*(n-1)));
my_C = cell(1,n);
for k=1:n
my_C(1,k) = {Output2(idx==k,:)};
end
其中n是正整数
答案 3 :(得分:0)
我会推荐一种略微不同的方法。除了使其余代码更易于维护之外,它还可以稍微加快执行速度。这是由于matlab使用JIT编译器,每次都必须重新编译eval
。试试这个:
nMatrices = 3
for k = 1:nMatrices
C{k} = Output2(idx==k,:);
end