如何检测矩阵的相等行与另一个具有10%边际的矩阵相比?

时间:2013-02-06 12:16:42

标签: matlab

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

例如:

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%的边距。

非常感谢。

3 个答案:

答案 0 :(得分:3)

此代码未经测试,但应该执行此操作:

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

解释:

  • A(1,:)占据A的第一行,B(3,:)占据B的第三行。
  • abs(...)取绝对值。
  • abs(...) ./ A(1,:)给出了百分比变化
  • < 0.1确保每个元素低于10%。
  • all(...)汇总了最后一步的值,并测试它们都是真的。

答案 1 :(得分:3)

一般来说,如果你不知道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行匹配

答案 2 :(得分:0)

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

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)

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