假设我有一个未知的向量v
和一个排列p
。
如何从v
和v(p)
重建p
?
一个同等的问题是找到q
的排列p(q) = [1 2 ... n]
?
由于这将在一个紧凑的循环中运行,我需要回答是矢量化(并且有效)。
答案 0 :(得分:7)
要找到我通常使用的逆置换:
[~,q] = sort(p);
这比Divakar建议的方法更快。
答案 1 :(得分:4)
如果您想要q
的反向排列p
,它将不会比以下方式更有效:
q(p) = 1:numel(p);
您可以通过以下方式从v
和vp = v(p)
重建p
:
q(p) = 1:numel(p);
v = vp(q);
甚至更快,但没有明确构建q
:
v(p) = vp;
(您可能已经注意到v = vp(q)
对应v == P^(-1)*vp
而v(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(:)))