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

时间:2015-07-30 14:29:53

标签: performance matlab matrix indices

假设我有一个矩阵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,:);

我想创建一个更快的方法,因为这个循环目前大大减慢了算法。

3 个答案:

答案 0 :(得分:2)

你非常接近。您只需要交换BA,然后使用此输出转换为B

L = ismember(B, A, 'rows');
C = B(L,:);

ismember在这种特殊情况下的工作原理是它输出一个logical向量,其行数与B相同,其中i th 值在B中告诉您我们是否在Alogical 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),:);