我有一个矩阵,我想将此矩阵的行与另一个矩阵的行进行比较,并验证是否有与它们匹配的行。
例如:
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% 的边距。
非常感谢你。
我有一个矩阵,我想将此矩阵的行与另一个矩阵的行进行比较,并验证是否有与它们匹配的行。
例如:
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% 的边距。
非常感谢你。
此代码未经测试,但应该这样做:
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(...)
聚合上一步的值并测试它们是否为真。一般来说,如果你不知道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
我在其他论坛上问这个问题,我得到了最好的答案:
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)
我要感谢你所有的答案,我会给你接受的答案,但我认为这对我来说是最好的代码。