matlab在2个矩阵中找到最相似的行

时间:2015-03-05 18:46:34

标签: matlab matrix matching

我有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]

我想找到匹配行的indeces。

indx = [1 1;
        2 4;
        3 2;
        4 3]

idx表示A的row1与B的row1匹配,A的row2与B的row4等匹配。 它应该是成对匹配的(1行A只有1行B) 对于第2列中的值,它应该是严格匹配。对于第1列和第3列的值,它应该是最佳匹配...(即,如果它存在一对具有相同值的对,那么我们应该选择最接近的值。)

你能帮帮我吗? TNX

编辑:对ANDREW评论中提出的问题的更多见解

第3行无法匹配第4行,因为第4行已与A的第2行匹配.A的第2行与B的第4行匹配,因为前两个元素80,0匹配,然后出现小错误在最后一个元素(29.4-22.4 = 7)。 我们可以说正确匹配A和B的第二列比匹配第一列更重要,比匹配第三列更重要。 我

2 个答案:

答案 0 :(得分:0)

这个问题给想象留下了很多:

  • 两行相似的标准是什么? (指标?)
  • 如果几行匹配完美且一些匹配正常或者所有行匹配得很好,那会更好吗?

解决问题的一种方法是使用pdist2计算成对距离,然后根据这些距离计算stable matching/marriage。这比很多好的比赛更喜欢几个完美的比赛。您可以使用此类匹配算法的现有实现。 Hanan Kavitz 在文件交换中提供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的指标。已经实施了很多指标,但您也可以提供自己的指标。

答案 1 :(得分:0)

编辑2:解决方案

感谢所提供的评论,我设法提出了一个不优雅的"但工作解决方案。

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),:);
相关问题