我要做一些索引,如下所示:
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次。
答案 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
。放松透明度并不总是好事。