使用 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
的情况下删除结果中的零行。失去透明度并不总是好的。
我要做一些索引,如下所示:
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
.
你可以使用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
的情况下删除结果中的零行。失去透明度并不总是好的。