1

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

例如:

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

非常感谢你。

4

3 回答 3

3

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

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

一个解释:

  • A(1,:)取第一行AB(3,:)取第三行B
  • abs(...)取绝对值。
  • abs(...) ./ A(1,:)给出百分比变化
  • < 0.1确保每个元素小于 10%。
  • all(...)聚合上一步的值并测试它们是否为真。
于 2013-02-06T12:23:29.533 回答
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

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

于 2013-02-06T12:55:26.487 回答
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)

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

于 2013-02-06T16:27:59.827 回答