删除符合特定条件的行

时间:2014-12-31 17:06:02

标签: arrays matlab loops matrix

我在MATLAB中有一个矩阵如下:

A = [ 0, 0, 0;
      1, 2, 3;
      4, 2, 3;
      0, 0, 0;
      1, 3, 4 ];

我想从第1行和第4行删除零,这样我就可以得到以下矩阵:

B = [ 1, 2, 3;
      4, 2, 3;
      1, 3, 4 ];

我所做的是以下内容:

for i = 1:length(A)
    if (sum(A(i, :)) == 0)
        A(i, :) = [];
    end
end

我知道问题是A的大小发生了变化,这就是问题所在。不幸的是,我无法解决它。你能不能给我一些提示。

2 个答案:

答案 0 :(得分:5)

如果你想删除零和的行,这可能有帮助,

A(sum(A,2)==0,:)=[];

如@LuisMendo所述,您可以使用

A(all(A,2)==0,:)=[];

取决于您的标准。

答案 1 :(得分:3)

假设您没有总计为零的行,那么Kamtal的方法就可以了。为了更安全,您应该检查一行是否包含仅为零。换句话说,尝试这样做:

A(~any(A,2), :) = [];

any检查数组或矩阵的任何元素是否为非零,否则输出逻辑truefalse。如果在矩阵上使用any,则可以指定是要在any的第二个参数中的行还是列上检查此项。在您的情况下,您希望对每行的列进行操作,因此您要将第二个参数指定为2.

因为您要检查是否有任何行包含全部零,所以您将在列上使用any并检查相反的情况。因此,如果所有行仅包含零any将输出逻辑false。这是我们正在寻找的,但您希望这是true而不是false,因此我们使用~进行反转,因为我们寻求的是相反的。


但是,如果要使方法正常工作,则不会使用for循环,而是使用while循环作为访问每行的索引不断变化。因此,一旦删除一行,就不会增加索引以访问下一行,直到您成功找到一个不总和为零的行。请记住,当您删除一行时,它下方的行会移动到已删除的位置,因此您仍然会检查此行的相同位置是否未达到零。一旦找到没有总和为零的行,您将移动到下一行。

换句话说,这样做:

i = 1;
while i < length(A)
    if (sum(A(i, :)) == 0)
        A(i, :) = [];
        continue;
    end
    i = i + 1;
end