如何删除矩阵A的那些行,它们与Matlab中指定列中的矩阵B具有相等的值?

jje*_*omi 5 performance matlab matrix vectorization

我在Matlab A和B中有两个矩阵,它们具有相同的列数但行数不同.B中的行数也小于A中的行数.B实际上是A的子集.

如何从A中有效地删除这些行,其中A的第1列和第2列中的值等于矩阵B的第1列和第2列中的值?

目前我正在这样做:

for k = 1:size(B, 1)
     A(find((A(:,1) == B(k,1) & A(:,2) == B(k,2))), :) = [];
end
Run Code Online (Sandbox Code Playgroud)

和Matlab抱怨这是低效的,我应该尝试使用any,但我不知道如何使用它any.有人可以帮我解决这个问题吗?=)

我试过这个,但它不起作用:

A(any(A(:,1) == B(:,1) & A(:,2) == B(:,2), 2), :) = [];
Run Code Online (Sandbox Code Playgroud)

它抱怨如下:

Error using  == 
Matrix dimensions must agree.
Run Code Online (Sandbox Code Playgroud)

我想要的例子:

在此输入图像描述

在此输入图像描述

结果中的AB表示从A中删除B行.与AC相同.

bla*_*bla 4

尝试使用setdiff. 例如:

c=setdiff(a,b,'rows')
Run Code Online (Sandbox Code Playgroud)

请注意,如果顺序很重要,请使用:

c = setdiff(a,b,'rows','stable')
Run Code Online (Sandbox Code Playgroud)

编辑:阅读编辑后的问题和对此答案的评论,setdiff您寻找的具体用法是(正如 Shai 注意到的):

[temp c] = setdiff(a(:,1:2),b(:,1:2),'rows','stable')
c = a(c,:)
Run Code Online (Sandbox Code Playgroud)

替代解决方案:

你可以使用ismember

a(~ismember(a(:,1:2),b(:,1:2),'rows'),:)
Run Code Online (Sandbox Code Playgroud)

  • +1但是您不需要 `setdiff(A(:,1:2),B(:,1:2),'rows')` 吗? (3认同)