假设我有一个未知的向量
如何从
等价的问题是找到一个置换
由于这将在紧密的循环中运行,所以需要答案向量化(并且高效)。
v
和一个置换p
。如何从
v(p)
和p
重构出v
?等价的问题是找到一个置换
q
,使得p(q)=[1 2 ... n]
?由于这将在紧密的循环中运行,所以需要答案向量化(并且高效)。
v
和一个置换p
。v(p)
和p
重构出v
?q
,使得p(q)=[1 2 ... n]
?我通常使用以下方法来找到逆排列:
[~,q] = sort(p);
如果您想要数组 p
的逆置数组 q
,最高效的方法如下:
q(p) = 1:numel(p);
因此,您可以通过vp = v(p)
和p
来重建v
:
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)
和 P^(-1)==P.'==sparse(p,1:numel(p),1)
。因此得到相同的结果。q
或 v
重置为 []
。如果 p
的长度发生变化,如果新的 p
比旧的 p
短,否则会得到错误的结果。1:numel(P)
可以存储在向量中,并在该紧密循环中迭代使用!因此,这样可以更有效率。 - Divakarq=q(1:numel(p));
的内容,它将被修复(并且仍然比我的方法更快)。 - Jens Boldsenq
或v
应为空,以使其正常工作。我将其添加到答案中以进行澄清。 - knedlseppp(1:4) = [4,3,2,1]
,逆置换可以定义为:q([4,3,2,1]) = 1:4
。更具体地说,p:(4->1,3->2,2->3,1->4)
,而q:(4<-1,3<-2,2<-3,1<-4)
。 - knedlsepp[~,q] = ismember(1:numel(p),p)
[~,~,q] = intersect(1:numel(p),p)
[q,~] = find(bsxfun(@eq,[1:numel(p)],p(:)))
ndims(v)
是多少? - Divakarv
是一个向量,因此 ndims(v) = 2
。 - amitnumel(p)
会更合适。已经进行了编辑。 - Divakar