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),:)=[];