【问题标题】:Finding equal rows in Matlab在 Matlab 中找到相等的行
【发布时间】:2019-02-06 15:37:17
【问题描述】:

我在 Matlab 中有一个大小为 GxN 的矩阵 suppX 和一个大小为 MxN 的矩阵 A。如果A(m,:) 行等于suppX(g,:) 行,否则我希望您帮助构造一个大小为GxMXresponse(g,m)=1 的矩阵Xresponse,否则为零。

让我用一个例子更好地解释一下。

suppX=[1 2 3 4; 
       5 6 7 8; 
       9 10 11 12]; %GxN

A=[1 2 3 4; 
   1 2 3 4; 
   9 10 11 12; 
   1 2 3 4]; %MxN

Xresponse=[1 1 0 1; 
           0 0 0 0;
           0 0 1 0]; %GxM

我已经编写了一个代码来做我想做的事。

Xresponsemy=zeros(size(suppX,1), size(A,1));
for x=1:size(suppX,1)
    Xresponsemy(x,:)=ismember(A, suppX(x,:), 'rows').'; 
end

我的代码使用循环。我想避免这种情况,因为在我的真实情况下,这段代码是另一个大循环的一部分。你有没有循环的建议?

【问题讨论】:

    标签: matlab


    【解决方案1】:

    执行此操作的一种方法是将每个矩阵视为N 维空间中的向量,您可以找到每个向量的 L2 范数(或欧几里得距离)。之后,检查距离是否为 0。如果是,那么你有一个匹配。具体来说,您可以创建一个矩阵,使该矩阵中的元素(i,j) 计算一个矩阵中的行i 与另一个矩阵中的行j 之间的距离。

    您可以通过修改由此问题产生的距离矩阵来解决您的问题,使得 1 表示两个向量完全相似,否则为 0。

    这篇文章应该很有趣:Efficiently compute pairwise squared Euclidean distance in Matlab

    我会专门看看 Shai Bagon 使用矩阵乘法和广播的答案。然后,您将对其进行修改,以便找到等于 0 的距离:

    nA = sum(A.^2, 2); % norm of A's elements
    nB = sum(suppX.^2, 2); % norm of B's elements
    Xresponse = bsxfun(@plus, nB, nA.') - 2 * suppX * A.';
    Xresponse = Xresponse == 0;
    

    我们得到:

    Xresponse =
    
      3×4 logical array
    
       1   1   0   1
       0   0   0   0
       0   0   1   0
    

    浮点效率注意事项

    因为您在实现中使用ismember,所以对我来说,您希望所有值都是整数是隐含的。在这种情况下,您可以非常直接地与零距离进行比较而不会损失准确性。如果您打算使用浮点数,则应始终与一些小的阈值而不是 0 进行比较,例如 Xresponse = Xresponse <= 1e-10; 或类似的东西。我认为您的方案不需要这样做。

    【讨论】:

      【解决方案2】:

      这是@rayryeng's answer 的替代方法:使用带有'rows' 输入标志的unique 的第三个输出将两个矩阵的每一行减少为唯一标识符,然后使用单例扩展(广播)比较标识符bsxfun:

      [~, ~, w] = unique([A; suppX], 'rows');
      Xresponse = bsxfun(@eq, w(1:size(A,1)).', w(size(A,1)+1:end));
      

      【讨论】:

      • @user3285148 抱歉,我的代码错误地使用了unique 的第二个输出,而不是第三个。现已更正
      猜你喜欢
      • 2019-03-08
      • 2015-02-16
      • 2015-05-07
      • 1970-01-01
      • 1970-01-01
      • 2021-02-15
      • 2013-11-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多