如何找到逆置换?

时间:2015-03-17 13:30:51

标签: algorithm matlab permutation

假设我有一个未知的向量v和一个排列p

如何从vv(p)重建p

一个同等的问题是找到q的排列p(q) = [1 2 ... n]

由于这将在一个紧凑的循环中运行,我需要回答是矢量化(并且有效)。

3 个答案:

答案 0 :(得分:7)

要找到我通常使用的逆置换:

[~,q] = sort(p);

这比Divakar建议的方法更快。

答案 1 :(得分:4)

如果您想要q的反向排列p,它将不会比以下方式更有效:

q(p) = 1:numel(p);

您可以通过以下方式从vvp = v(p)重建p

q(p) = 1:numel(p);
v = vp(q);

甚至更快,但没有明确构建q

v(p) = vp;

(您可能已经注意到v = vp(q)对应v == P^(-1)*vpv(p) = vp对应P*v == vp对应适当的排列运算符(矩阵)P = sparse(1:numel(p),p,1)和{{1}因此产生相同的结果。)

如果您在循环中使用此功能,请务必在此操作之前将P^(-1)==P.'==sparse(p,1:numel(p),1)q分别正确地重置为v。如果更改[]的长度,如果新的p比旧的p短,则会出现错误的结果。

答案 2 :(得分:1)

使用ismember -

[~,q] = ismember(1:numel(p),p)

使用intersect -

[~,~,q] = intersect(1:numel(p),p)

使用bsxfun -

[q,~] = find(bsxfun(@eq,[1:numel(p)],p(:)))