我要做一些索引,如下所示:
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、.行中的所有零。谁能告诉我如何索引,使我在行之间没有“空白”的零?谢谢!
编辑;下面是一个示例数据集:
data (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 68params (72x12 double -我们只对第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 151value1、value2和value3的预期输出应为24x15。这是因为数据中有15列,而在params的第8列中,值1、2、3每列发生24次。
发布于 2015-06-01 13:53:39
您可以使用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。不透明并不总是好的。
https://stackoverflow.com/questions/30565868
复制相似问题