假设我有一个矩阵A,包含可能的值对和一个包含所有值对的矩阵B:
A = [1,1;2,2;3,3];
B = [1,1;3,4;2,2;1,1];
我想创建一个矩阵C,它包含A允许的所有对(即C = [1,1; 2,2; 1,1])。
使用C = ismember(A,B,'rows')只显示1,1的第一次出现,但我需要两者。
目前我使用for循环创建C,如下所示:
TFtot = false(size(B(:,1,1),1);
for i = 1:size(a(:,1),1)
TF1 = A(i,1) == B(:,1) & A(i,2) = B(:,2);
TFtot = TF1 | TFtot;
end
C = B(TFtot,:);
我想创建一个更快的方法,因为这个循环目前大大减慢了算法。
答案 0 :(得分:2)
你非常接近。您只需要交换B
和A
,然后使用此输出转换为B
:
L = ismember(B, A, 'rows');
C = B(L,:);
ismember
在这种特殊情况下的工作原理是它输出一个logical
向量,其行数与B
相同,其中i th 值在B
中告诉您我们是否在A
(logical
1)中找到了此 th 行,或者我们是否找到了这一行({{ 1}} 0)。
您希望在logical
中选择B
中显示的A
中的条目,因此您只需使用ismember
的输出切片到B
即可摘出受影响的行,并抓住所有列。
我们选择C
:
>> C
C =
1 1
2 2
1 1
答案 1 :(得分:2)
以下是使用bsxfun
的替代方法:
C = B(all(any(bsxfun(@eq, B, permute(A, [3 2 1])),3),2),:);
或者您可以使用pdist2
(统计工具箱):
B(any(~pdist2(A,B),1),:);
答案 2 :(得分:2)
使用matrix-multiplication based euclidean distance calculations
-
Bt = B.'; %//'
[m,n] = size(A);
dists = [A.^2 ones(size(A)) -2*A ]*[ones(size(Bt)) ; Bt.^2 ; Bt];
C = B(any(dists==0,1),:);