我有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的第二列比匹配第一列更重要,比匹配第三列更重要。 我
答案 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),:);