“Desort”向量(撤消排序)

时间:2012-11-15 22:03:22

标签: matlab sorting vectorization

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

[v, ix] = sort(u);

此处,v是包含u的所有元素但已排序的向量。 ix是一个向量,显示vu的每个元素的原始位置。使用Matlab的语法u(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程序,该程序根据向量调整向量的每个元素排序后的位置,但调整后恢复原始订单对我来说很重要。

1 个答案:

答案 0 :(得分:6)

解决方案是:

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

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