matlab在2个矩阵中找到最相似的行
matlab find most similar rows in 2 matrices
我有 2 个矩阵
A = [66 1 29.2;
80 0 29.4;
80 0 29.4;
79 1 25.6];
B = [66 1 28.2;
79 0 28.4;
66 1 27.6;
80 0 22.4]
我想找到匹配行的索引。
indx = [1 1;
2 4;
3 2;
4 3]
idx 表示 A 的第 1 行与 B 的第 1 行匹配,A 的第 2 行与 B 的第 4 行等匹配。
它应该是成对匹配(1 行 A 仅 1 行 B)
对于第 2 列中的值,它应该是严格匹配的。对于第 1 列和第 3 列的值,它应该是最佳匹配..(即如果它存在一对具有相同值的好,否则我们应该选择最接近的)。
你能帮帮我吗?发送
编辑:对源自 ANDREW 评论的问题的更多见解
A 的第 3 行无法匹配第 4 B 行,因为第 4 B 行已经与 A 的第 2 行匹配。A 的第 2 行与 B 的第 4 行匹配,因为前两个元素 80,0 匹配,然后有一个最后一个元素中的小错误 (29.4-22.4=7)。
我们可以说正确匹配 A 和 B 的第 2 列比匹配第 1 列更重要,第 1 列比匹配第 3 列更重要。
我
问题想象空间很大:
- 两行相似的标准是什么? (什么公制?)
- 是有几行匹配完美,有几行匹配正常,还是所有行匹配都很好?
解决它的一种方法是使用 pdist2
计算成对距离,然后在文件交换上计算 stable matching/marriage based on those distances. This prefers few perfect matches over lots of good matches. You could use an existing implementation of such a matching algorithm. Hanan Kavitz provides one of those。
% Compute distances
D = pdist2(A, B, 'euclidean');
% Compute preference based on distance
[~,A2B] = sort(D,2); A2B = A2B(:,end:-1:1);
% Compute Matching
J = stableMatching(A2B,A2B.');
matches = [(1:size(A,1)).',J]
这非常灵活,因为您可以根据您定义 相似度 的方式更改 pdist2
的指标。已经实施了相当多的指标,但您也可以提供自己的指标之一。
编辑 2:解决方案
感谢提供的评论,我设法想出了一个 "not elegant" 但可行的解决方案。
B_rem = B;
weights_error = [2 4 1];
match = zeros(size(A,1),2);
for i = 1 : size(A,1)
score = zeros(size(B_rem,1),1);
for j =1 : size(B_rem,1)
score(j) = sum(abs(A(i,:) - B_rem(j,:)).*weights_error);
end
[~,idxmin] = min(score);
match(i,:) = [i,idxmin];
B_rem(idxmin,:)=[1000 1000 1000];
end
indx = match;
table_match = zeros(size(A,1),7);
table_match(:,1:3) = A(match(:,1),:);
table_match(:,5:7) = B(match(:,2),:);
我有 2 个矩阵
A = [66 1 29.2;
80 0 29.4;
80 0 29.4;
79 1 25.6];
B = [66 1 28.2;
79 0 28.4;
66 1 27.6;
80 0 22.4]
我想找到匹配行的索引。
indx = [1 1;
2 4;
3 2;
4 3]
idx 表示 A 的第 1 行与 B 的第 1 行匹配,A 的第 2 行与 B 的第 4 行等匹配。 它应该是成对匹配(1 行 A 仅 1 行 B) 对于第 2 列中的值,它应该是严格匹配的。对于第 1 列和第 3 列的值,它应该是最佳匹配..(即如果它存在一对具有相同值的好,否则我们应该选择最接近的)。
你能帮帮我吗?发送
编辑:对源自 ANDREW 评论的问题的更多见解
A 的第 3 行无法匹配第 4 B 行,因为第 4 B 行已经与 A 的第 2 行匹配。A 的第 2 行与 B 的第 4 行匹配,因为前两个元素 80,0 匹配,然后有一个最后一个元素中的小错误 (29.4-22.4=7)。 我们可以说正确匹配 A 和 B 的第 2 列比匹配第 1 列更重要,第 1 列比匹配第 3 列更重要。 我
问题想象空间很大:
- 两行相似的标准是什么? (什么公制?)
- 是有几行匹配完美,有几行匹配正常,还是所有行匹配都很好?
解决它的一种方法是使用 pdist2
计算成对距离,然后在文件交换上计算 stable matching/marriage based on those distances. This prefers few perfect matches over lots of good matches. You could use an existing implementation of such a matching algorithm. Hanan Kavitz provides one of those。
% Compute distances
D = pdist2(A, B, 'euclidean');
% Compute preference based on distance
[~,A2B] = sort(D,2); A2B = A2B(:,end:-1:1);
% Compute Matching
J = stableMatching(A2B,A2B.');
matches = [(1:size(A,1)).',J]
这非常灵活,因为您可以根据您定义 相似度 的方式更改 pdist2
的指标。已经实施了相当多的指标,但您也可以提供自己的指标之一。
编辑 2:解决方案
感谢提供的评论,我设法想出了一个 "not elegant" 但可行的解决方案。
B_rem = B;
weights_error = [2 4 1];
match = zeros(size(A,1),2);
for i = 1 : size(A,1)
score = zeros(size(B_rem,1),1);
for j =1 : size(B_rem,1)
score(j) = sum(abs(A(i,:) - B_rem(j,:)).*weights_error);
end
[~,idxmin] = min(score);
match(i,:) = [i,idxmin];
B_rem(idxmin,:)=[1000 1000 1000];
end
indx = match;
table_match = zeros(size(A,1),7);
table_match(:,1:3) = A(match(:,1),:);
table_match(:,5:7) = B(match(:,2),:);