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

时间:2015-06-01 04:58:05

标签: matlab if-statement for-loop matrix indexing

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

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,....任何人都可以告诉我如何索引所以我在行之间没有零“零”吗?谢谢!

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

数据(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双 - 我们只对第8和第11列感兴趣)所以我只是为了空间而只显示第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}}中第1列中的值为1,2,3,每列出现24次。

1 个答案:

答案 0 :(得分:0)

您可以使用bsxfun来避免for循环(请注意它实际上不是顶点):

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。放松透明度并不总是好事。