假设我有一个包含可能的值对的矩阵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,:);
我想创建一种更快的方法,因为此循环当前大大降低了算法的速度。
最佳答案
你很亲密您只需要交换B
和A
,然后使用此输出索引到B
:
L = ismember(B, A, 'rows');
C = B(L,:);
ismember
在这种特殊情况下的工作方式是输出一个logical
vector ,该 vector 具有与B
相同的行数,其中B
中的ith值告诉您我们是否在A
中找到了此ith行(logical
1)还是没有找到该行。找不到此行(logical
0)。您想在
B
中选择那些在A
中看到的条目,因此您只需使用ismember
的输出切成B
即可提取出受影响的行,并获取所有列。我们得到
C
:>> C
C =
1 1
2 2
1 1