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),:);