【发布时间】:2014-06-19 06:21:46
【问题描述】:
我在 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
Matlab 抱怨这效率低下,我应该尝试使用any,但我不确定如何使用any。有人可以帮我解决这个问题吗? =)
我试过了,但它不起作用:
A(any(A(:,1) == B(:,1) & A(:,2) == B(:,2), 2), :) = [];
它抱怨以下内容:
Error using ==
Matrix dimensions must agree.
我想要的示例:
结果中的A-B表示从A中删除B的行。A-C也是如此。
【问题讨论】:
-
setdiff是最好的解决方案,但是要将您的第一次尝试转换为any(保持您的循环)这是 Matlab 的建议(您实际上想要@ 987654330@ 而不是any在你的情况下):A(all(A == B(k,:),2), :) = []; -
顺便说一句,我没有意识到您只是在比较前两列,所以将我的最后一条评论更新为
A(all(A(:,1:2) == B(k,1:2),2), :) = []; -
谢谢大家的精彩回答 =) 原来的运行时间(我的数据)是:0.198072 秒。通过使用
bsxfun方法,我得到了大约 0.007 秒的运行时间。通过使用setdiff(A(:,1:2),B(:,1:2),'rows'),我得到了运行时间:0.004120 秒。 -
@jjepsuomi 希望你也可以在更大的数据大小上做一些基准测试,看到这些结果也会很有趣。
-
+1 @Divakar 我将尝试使用不同的数据集并发布我的结果 =) 这需要几分钟 =)
标签: performance matlab matrix vectorization