我在Matlab A和B中有两个矩阵,它们的列数相等,但行数不同。 B中的行数也小于A中的行数。B实际上是A的子集。
在A的第1列和第2列的值等于矩阵B的第1列和第2列的值的情况下,如何有效地从A中删除这些行?
目前,我正在这样做:
for k = 1:size(B, 1)
A(find((A(:,1) == B(k,1) & A(:,2) == B(k,2))), :) = [];
end
Matlab提示这效率低下,我应该尝试使用
any
,但是我不确定如何使用any
来做到这一点。有人可以帮我这个忙吗? =)我试过了,但是不起作用:
A(any(A(:,1) == B(:,1) & A(:,2) == B(:,2), 2), :) = [];
它提示以下内容:
Error using ==
Matrix dimensions must agree.
我想要的例子:
结果中的A-B表示B的行已从A中删除。A-C也是如此。
最佳答案
尝试使用 setdiff
。例如:
c=setdiff(a,b,'rows')
注意,如果顺序很重要,请使用:
c = setdiff(a,b,'rows','stable')
编辑:阅读已编辑的问题和对此答案的评论,您所寻找的
setdiff
的特定用法是(如Shai所注意到的):[temp c] = setdiff(a(:,1:2),b(:,1:2),'rows','stable')
c = a(c,:)
替代解决方案:
您可以只使用
ismember
:a(~ismember(a(:,1:2),b(:,1:2),'rows'),:)
关于performance - 如何删除在Matlab的指定列中矩阵A与矩阵B具有相等值的那些行?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24299982/