如何在Matlab中找到二维矩阵置换后的映射

时间:2013-06-17 13:30:10

标签: matlab matrix permutation repeat

我有两个二维矩阵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

此致

3 个答案:

答案 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()来解决需要生成所有排列的问题的解决方案。

我们的想法是对AB进行排序,这将产生相同的排序矩阵。现在可以使用生成两个排序矩阵的索引IAIB找到排列。

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)