使用 for 循环和 if 条件的矩阵索引问题

Problems with matrix indexing using for loop and if condition

我要做一些索引,如下所示:

for c=1:size(params,1)
    for d=1:size(data,2)
        if params(c,8)==1
            value1(c,d)=data(params(c,11),d);
        elseif params(c,8)==2
            value2(c,d)=data(params(c,11),d);
        elseif params(c,8)==3
            value3(c,d)=data(params(c,11),d);
        end
    end
end

问题在于,如果我们有 params(:,8)=1,3,1,3,2,3,1...,那么 value1 将包含第 2、4、5、6 等行中的所有零。这些是params 中第 8 列中没有 1 的行。类似地,value2 将包含第 1、2、3、4、6、7 行中的所有零...并且 value3 将包含所有零第 1、3、5、7 行,.... 谁能告诉我如何编制索引,这样我就不会在行与行之间有 'gaps' 个零?谢谢!

编辑;下面是一个示例数据集:

数据(1080x15 双)

168 432 45  86
170 437 54  82
163 423 52  83
178 434 50  84
177 444 42  87
177 444 58  85
175 447 48  77
184 451 59  86
168 455 52  104
174 437 62  88
175 443 55  85
179 456 51  92
168 450 73  82
175 454 60  68

params(72x12 double - 我们只对第 8 列和第 11 列感兴趣)所以为了 space,我只显示第 8-11 列:

1   10  15  1
3   12  16  16
2   10  15  32
3   12  16  47
1   8   14  63
2   10  15  77
2   8   14  92
3   10  15  106
1   12  16  121
3   8   14  137
2   10  15  151

value1、value2 和 value3 的预期输出应为 24x15。这是因为数据中有 15 列,值 1、2、3 在 params.

的第 8 列中各出现 24 次

你可以使用bsxfun来避免for循环(注意它实际上不是vertorizing):

value1 = bsxfun(@times,data(params(:,11),:),(params(:,8)==1));
value2 = bsxfun(@times,data(params(:,11),:),(params(:,8)==2));
value3 = bsxfun(@times,data(params(:,11),:),(params(:,8)==3));

但它仍然为您提供零行的结果。所以你可以通过以下方式删除零行:

value1(all(value1==0,2),:)=[];
value2(all(value2==0,2),:)=[];
value3(all(value3==0,2),:)=[];

您也可以使用上述命令在不使用 bsxfun 的情况下删除结果中的零行。失去透明度并不总是好的。