查找矩阵中多个值对的所有索引

find all indices of multiple value pairs in a matrix

假设我有一个包含可能值对的矩阵 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-loop 来创建 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 向量,该向量的行数与 B 相同,其中第 i B 中的值告诉您我们是否在 A (logical 1) 的某处找到了第 ith 行,或者我们是否没有找不到此行 (logical 0)。

您想 select 取出 B 中出现在 A 中的那些条目,因此您只需使用 ismember 的输出切入 B 提取受影响的行,并获取所有列。

我们得到 C:

>> C

C =

     1     1
     2     2
     1     1

这是使用 bsxfun 的替代方法:

C = B(all(any(bsxfun(@eq, B, permute(A, [3 2 1])),3),2),:);

或者您可以使用 pdist2(统计工具箱):

B(any(~pdist2(A,B),1),:);

使用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),:);