我有两个二维矩阵A,B,其中B由A的(行方式)排列产生。在A中有一些重复记录(在B中也是如此)。我想找到产生B的映射。我正在使用Matlab。只有一种解决方案对我来说已经足够了。
示例:
A = [ 2 3 4; 4 5 6; 2 3 4];
B = [ 4 5 6; 2 3 4; 2 3 4];
映射将是:
p = [3 1 2] // I want this mapping, however the solution p= [2 1 3] is also correct and acceptable
其中A = B(p,:)在Matlab中。 // EDITED
此致
答案 0 :(得分:2)
% compute the permutation matrix
P = all( bsxfun( @eq, permute( A, [1 3 2]),permute(B,[3 1 2]) ), 3 );
[~, p] = max(P, [], 2 ); % gives you what you want
如果有重复项,我们需要在P
的行/列中“断开关系”:
n = size(A,1);
bt = abs( bsxfun(@minus, 1:n, (1:n)' ) )/n; %//'
[~, p] = max( P+bt, [], 2 );
答案 1 :(得分:2)
因为我们知道A和B总是具有相同的行,所以让我们寻找一个转换,将每个转换为一个共同的相同表示。 sort
怎么样?
[As, Ai] = sortrows(A);
[Bs, Bi] = sortrows(B);
现在A(Ai,:) == B(Bi,:)
,所以我们要做的就是找到匹配Ai的Bi的索引。 Bi是前向映射,Ai是反向映射。所以:
p = zeros(size(A,1),1);
p(Ai) = Bi;
(编辑答案以匹配问题陈述的编辑)
答案 2 :(得分:0)
以下是使用sort()
来解决需要生成所有排列的问题的解决方案。
我们的想法是对A
和B
进行排序,这将产生相同的排序矩阵。现在可以使用生成两个排序矩阵的索引IA
和IB
找到排列。
A = [ 2 3 4; 4 5 6; 2 3 4];
B = [ 4 5 6; 2 3 4; 2 3 4];
[CA,IA]=sort(A,1)
[CB,IB]=sort(B,1)
idxA = IA(:,1)
idxB = IB(:,1)
[~, idxB_inverse] = sort(idxB)
idxA(idxB_inverse)