【问题标题】:find all indices of multiple value pairs in a matrix在矩阵中查找多个值对的所有索引
【发布时间】:2015-10-21 23:25:56
【问题描述】:

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

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

【问题讨论】:

  • TFTot 将是01,具体取决于您是否使用A 中的任何行在B 中找到任何 匹配项。如果有的话,您的代码只会选择出B 的第一行。您可能应该使TFtot 成为一个数组,以跟踪我们是否在A 中找到了B 中的特定行。此外,A(i,2) = B(:,2) 确实应该是 A(i,2) == B(:,2).... 但是将标量与向量进行比较将产生真 除非比较结果中的所有 值都是 0。您应该在其中使用 any/all案例。

标签: performance matlab matrix indices


【解决方案1】:

你已经很接近了。你只需要交换BA,然后使用这个输出来索引B

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

ismember 在这种特殊情况下的工作原理是它输出一个与B 具有相同行数的logical 向量,B 中的 ith 值告诉你我们是否在A (logical 1) 的某处找到了第 ith 行,或者我们没有找到这一行 (logical 0)。

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

我们得到C

>> C

C =

     1     1
     2     2
     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),:);

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-19
      • 2013-04-20
      • 1970-01-01
      • 2015-07-28
      • 2023-03-24
      • 2012-09-12
      相关资源
      最近更新 更多