Matlab 使用for循环和if条件的矩阵索引问题
我需要做一些索引,类似于以下内容:Matlab 使用for循环和if条件的矩阵索引问题,matlab,if-statement,for-loop,matrix,indexing,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
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双精度)
参数(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
值1、值2和值3的预期输出应为24x15。这是因为数据中有15列,值1、2、3在
params
的第8列中出现24次。您可以使用bsxfun
来避免for循环(请注意,它实际上没有垂直化):
但它仍然提供零行的结果。因此,您可以通过以下方式删除零行:
value1(all(value1==0,2),:)=[];
value2(all(value2==0,2),:)=[];
value3(all(value3==0,2),:)=[];
您还可以使用上述命令删除结果中的零行,而无需使用
bsxfun
。放松透明度并不总是好的。我认为如果不是零,你需要用一些东西来填充,如果不是在间隙中,你需要在某处填充。假设一个最小的数据
,并向我们展示预期的输出值-value1、value2、value3如何?您能发布一个样本数据集吗?谢谢。我想去掉零。如果我使用value1(all(value1==0,2),:)=[]
这是否意味着仅当行中的所有值都为零时才删除该行?当我测试它时,似乎是这样。对于某些行中的某些单元格(但不是所有单元格),可能会有零作为值。是的,它将仅删除包含所有零的行。如果一行有一些零,一些非零,那么它仍然存在。太好了。非常感谢你,scmg。
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),:)=[];