3

我有两个二维矩阵 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 中。// 已编辑

问候

4

3 回答 3

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 );
于 2013-06-17T14:02:56.073 回答
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;

(答案已编辑以匹配问题陈述的编辑)

于 2013-06-17T14:33:51.930 回答
0

这是一个解决方案,sort()用于解决需要生成所有排列的问题。

这个想法是对两者进行排序AB这将产生相同的排序矩阵。现在可以通过使用产生两个排序矩阵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)
于 2013-06-17T14:34:18.710 回答