在Matlab中,sort
返回已排序的向量和一个索引向量,显示哪个向量元素已被移动到:
[v, ix] = sort(u);
此处,v
是包含u
的所有元素但已排序的向量。 ix
是一个向量,显示v
中u
的每个元素的原始位置。使用Matlab的语法u(ix) == v
。
我的问题:如何从u
和v
获取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程序,该程序根据向量调整向量的每个元素排序后的位置,但调整后恢复原始订单对我来说很重要。
答案 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
(为琐碎的问题答案道歉,但我在输入问题时意识到解决方案,并认为这可能对某人有用。)