用于在许多不同矩阵中存储值的循环

时间:2014-06-05 06:03:20

标签: matlab for-loop matrix

我编写了一个将数据存储在矩阵中的代码,但我想缩短它以便迭代自己。 创建的矩阵数是已知变量。如果是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

4 个答案:

答案 0 :(得分:0)

正如patrik在评论中所说,这样的命名变量是不好的做法。最好使用单元格数组M{1}=C1,或者所有Ci的大小相同,即使只是一个3D数组M,例如M(:,:,1)=C1。< / p>

如果您真的想使用C1C2,......作为变量名称,我认为您必须使用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