对向量进行去排序(取消排序)。

6
在Matlab中,sort函数返回已排序的向量和一个索引向量,显示哪个向量元素被移动到了哪里:
[v, ix] = sort(u);

这里的v是一个包含所有元素按顺序排列的向量uix是一个向量,展示了每个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我正在尝试实现本杰明尼-霍赫伯格过程,该过程基于排序后的每个向量元素进行调整,但在调整后恢复原始顺序对我很重要。

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

(抱歉这个问题有点微不足道,但是在我打这个问题的时候,我发现了解决方法,并且认为它可能对某些人有用。)


4
抱歉提出这个琐碎的问题和答案,没关系。在StackOverflow上自问自答(甚至为了自己回答一个问题而提出一个问题)是完全可以的,因为它有助于未来的访问者。 - user529758

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接