如何找到逆置换?

ami*_*mit 3 algorithm matlab permutation

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

我怎样才能重建vv(p)p

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

由于这将在一个紧密的循环中运行,我需要回答是矢量化(和高效).

Jen*_*sen 7

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

[~,q] = sort(p);
Run Code Online (Sandbox Code Playgroud)

这比Divakar建议的方法更快.


kne*_*epp 5

如果你想逆置换qp,也不会获得比更有效:

q(p) = 1:numel(p);
Run Code Online (Sandbox Code Playgroud)

你可以这样重建vvp = v(p),并p通过:

q(p) = 1:numel(p);
v = vp(q);
Run Code Online (Sandbox Code Playgroud)

甚至在不显式构造的情况下更快q

v(p) = vp;
Run Code Online (Sandbox Code Playgroud)

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

如果您在循环中使用它,请注意在此操作之前正确重置qv分别为[]。在改变长度的情况下,p如果新的p比旧的短,你会得到错误的结果p