我在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/

10-14 18:16
查看更多