6

在 Matlab 中,sort返回排序后的向量和一个索引向量,显示哪个向量元素被移动到哪里:

[v, ix] = sort(u);

这里,v是一个向量,包含 的所有元素u,但已排序。是一个向量,表示inix的每个元素的原始位置。使用 Matlab 的语法,.vuu(ix) == v

我的问题:我如何uv和获得ix

当然,我可以简单地使用:

w = zero(size(v));

for i = 1:length(v)
    w(ix(i)) = v(i)
end

if nnz(w == u) == length(u)
    print('Success!');
else
    print('Failed!');
end

但我有一种舌尖上的感觉,即有一种更优雅、单一语句、矢量化的方式来做这件事。


如果您想知道为什么需要这样做而不是仅仅使用u:我正在尝试实现 Benjamini-Hochberg 过程,该过程在排序后根据向量的位置调整向量的每个元素,但在调整后恢复原始顺序对于我。

4

1 回答 1

9

解决方案是:

w(ix) = v;

这是一个有效的 Matlab 操作,只要它w至少与 一样大v,或者尚未声明。

例子:

>> u = [4 8 10 6 2];
>> [v, ix] = sort(u)

    v = 2 4 6 8 10        
    ix = 5 1 4 2 3

>> u(ix)

    ans = 2 4 6 8 10

>> w(ix) = v

    w = 4 8 10 6 2

(为微不足道的问题答案道歉,但我在输入问题时意识到了解决方案,并认为它可能对某人有用。)

于 2012-11-15T22:03:21.990 回答