我在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
的大小发生了变化,这就是问题所在。不幸的是,我无法解决它。你能不能给我一些提示。
答案 0 :(得分:5)
如果你想删除零和的行,这可能有帮助,
A(sum(A,2)==0,:)=[];
如@LuisMendo所述,您可以使用
A(all(A,2)==0,:)=[];
取决于您的标准。
答案 1 :(得分:3)
A(~any(A,2), :) = [];
any
检查数组或矩阵的任何元素是否为非零,否则输出逻辑true
和false
。如果在矩阵上使用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