【问题标题】:How to detect equal rows of a matrix compare with another matrix with a 10 per cent of margin?如何检测矩阵的相等行与另一个具有 10% 边距的矩阵进行比较?
【发布时间】:2013-02-07 00:27:59
【问题描述】:

我有一个矩阵,我想将此矩阵的行与另一个矩阵的行进行比较,并验证是否有行与它们匹配。

例如:

A = [ 1 2 3;...
      4 5 6;...
      7 8 9 ];

B = [ 54 23 13;...
      54 32 12;...
      1.1 2.2 2.9];

我需要检测矩阵 A 的第 1 行与矩阵 B 的第 3 行匹配。行不相等,因为我想要 +-10% 的边距。

非常感谢。

【问题讨论】:

  • 如果您发布可以剪切和粘贴的 sn-ps,我们中的一些人会剪切和粘贴。您发布的内容不是有效的 Matlab。帮助我们帮助您。我是懒惰的 SOers 之一,如果我可以避免的话,他们不会为你做太多的打字。
  • 另外,你有没有试过写任何代码?

标签: matlab


【解决方案1】:

此代码未经测试,但应该这样做:

valid = all(abs(A(1,:) - B(3,:)) ./ A(1,:) < 0.1)

解释:

  • A(1,:) 取A 的第一行,B(3,:) 取B 的第三行。
  • abs(...) 取绝对值。
  • abs(...) ./ A(1,:) 给出百分比变化
  • &lt; 0.1 确保每个元素小于 10%。
  • all(...) 汇总上一步的值并测试它们是否为真。

【讨论】:

  • 应该是
  • 感谢您的回答,但我认为我的回答是最完整的,因为它检查了所有可能的行。非常感谢!
【解决方案2】:

一般来说,如果你不知道A的哪一行可能和B匹配,我写了一个for循环,它是Fabian答案的扩展......

for i = 1:size(A,1)
      match(:,i) = sum(abs(ones(size(A,1),1)*A(i,:) - B) ./ (ones(size(A,1),1)*A(i,:)) <= 0.100001, 2) == size(A,2)*ones(size(A,1),1);        
  end

match(i,j) == 1 如果 B 的第 i 行与 A 的第 j 行匹配

【讨论】:

  • 感谢您的回答,但我认为我的回答最清楚,因为它更具可读性。非常感谢!
【解决方案3】:

我在其他论坛上问这个问题,我得到了最好的答案:

margin = 0.1;
A = [1 2 3; 4 5 6; 7 8 9];
B = [7 8 10; 4 5 12; 1.1 2.2 2.9; 1.101 2 3; 6.3 7.2 9.9];
k = 0;
for i = 1:size(A,1)
    for j = 1:size(B,1)
        if all(abs((A(i,:)-B(j,:))./A(i,:)) <= margin+eps)
            k = k+1;
            match(:,k) = [i;j];
        end
    end
end
fprintf('A row %d matches B row %d.\n',match)

我要感谢你所有的回答,我会给你接受的答案,但我认为这对我来说是最好的代码。

【讨论】:

  • 请注意您的嵌套 for 循环 - 它们是导致 matlab 脚本缓慢的典型原因。
猜你喜欢
  • 2019-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-06
  • 2019-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多