假设我有一个包含可能的值对的矩阵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,:);

我想创建一种更快的方法,因为此循环当前大大降低了算法的速度。

最佳答案

你很亲密您只需要交换BA,然后使用此输出索引到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

10-06 08:07