【问题标题】:Comparing matrices of different size in matlab and storing values that are close在matlab中比较不同大小的矩阵并存储接近的值
【发布时间】:2017-04-27 15:57:01
【问题描述】:

我有两个矩阵A和B。A(:,1)对应一个x坐标,A(:,2)对应一个y坐标,A(:,3)对应某个半径。一行中的所有三个值都描述了同一个圆圈。现在让我们说......

A =

[1,4,3]

[8,8,7]

[3,6,3]

B =

[1,3,3]

[1, 92,3]

[4,57,8]

[5,62,1]

[3,4,6]

[9,8,7]

我需要的是能够遍历矩阵 A 并确定矩阵 B 中是否有任何行“相似”,因为 x 值在 x 值的范围 (-2,2) 内A(同样具有 y 坐标和半径)。如果它满足所有这三个条件,它将被添加到具有 A 中的值的新矩阵中。因此,例如,我需要返回上述数据。 .

ans =

[1,4,3]

[8,8,7]

请帮助并提前感谢任何愿意花时间的人!

【问题讨论】:

    标签: matlab for-loop matrix


    【解决方案1】:

    您可以使用ismembertol

    result = A(ismembertol(A,B,2,'ByRows',1,'DataScale',1),:)
    

    【讨论】:

      【解决方案2】:

      手动方法

      A = [1,4,3;
           8,8,7;
           3,6,3];
      B = [1,3,3;
           1,92,3;
           4,57,8;
           5,62,1;
           3,4,6;
           9,8,7]; % example matrices
      t = 2;       % desired threshold
      m = any(all(abs(bsxfun(@minus, A, permute(B, [3 2 1])))<=t, 2), 3);
      result = A(m,:);
      

      关键是使用permuteB的第一个维度移动到第三个维度。然后bsxfun 计算原始矩阵中所有行对的元素差异。如果all 相对于Bany 列的绝对差异小于所需的阈值t,则应选择一行A。结果变量mlogical index,用于选择这些行。

      使用pdist2(统计和机器学习工具箱)

      m = any(pdist2(A, B, 'chebychev')<=t, 2);
      result = A(m,:);
      

      带有chebychev 选项的pdist2 函数计算行对之间的最大坐标差(Chebychev distanceL metric)。

      【讨论】:

        【解决方案3】:

        带有for循环

        它应该可以工作:

        A = [1,4,3;
             8,8,7;
             3,6,3]
        B = [1,3,3;
             1,92,3;
             4,57,8;
             5,62,1;
             3,4,6;
             9,8,7]
        index = 1;
        for i = 1:size(A,1) 
          C = abs(B - A(i,:));
          if any(max(C,[],2)<=2)
            out(index,:) = A(i,:);
            index = index + 1
          end
        end
        

        对于 A 的每一行,计算 B 与该行之间的绝对差,然后检查是否存在最大值小于 2 的行。

        没有for循环

        ind = any(max(abs(B - permute(A,[3 2 1])),[],2)<=2);
        out = A(ind(:),:);
        

        【讨论】:

        • 这似乎刚刚返回了矩阵 A。此外,我确实不想让我使用的矩阵更大,A 和 B 只是示例。在我的实际脚本中,A 是 628 x 3 矩阵,B 是 1200 x 3 矩阵
        • 哪种方法似乎只返回矩阵 A?
        • 好吧,我发现,实际上它并没有返回 A,而是由于 out(i,:) 导致了一些不必要的 [0 0 0] 的正确结果(因此它的行数取决于 A 中完成的最后一行条件)。无论如何,我建议您使用@rahnema1 答案,即使用内置函数,并且相对于提出的其他答案具有更好的计算时间。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-27
        • 1970-01-01
        • 2015-09-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多