我有一个矩阵,我希望将此矩阵的行与另一个矩阵的行进行比较,并验证是否存在与它们匹配的行。
例如:
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%的边距。
非常感谢。
答案 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)
我要感谢你的所有答案,我会给你接受的答案,但我认为这对我来说是最好的代码。