【问题标题】:"Desort" a vector (undo a sorting)"Desort" 一个向量(撤消排序)
【发布时间】:2012-11-17 20:12:06
【问题描述】:

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

[v, ix] = sort(u);

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

我的问题:如何从vix获取u

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

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 过程,该过程根据矢量的位置调整矢量的每个元素排序后,但调整后恢复原始顺序对我来说很重要。

【问题讨论】:

    标签: matlab sorting vectorization


    【解决方案1】:

    解决办法是:

    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
    

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

    【讨论】:

    • “为琐碎的问答道歉” - 没问题。在 StackOverflow 上自我回答(或者甚至只是为了自己回答而提出问题)非常好,因为它可以帮助未来的访问者。
    猜你喜欢
    • 1970-01-01
    • 2017-07-27
    • 1970-01-01
    • 2017-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    相关资源
    最近更新 更多