6

Matlabでsort、ソートされたベクトルと、どのベクトル要素がどこに移動されたかを示すインデックスベクトルの両方を返します。

[v, ix] = sort(u);

ここで、vはのすべての要素を含むuがソートされたベクトルです。ixの各要素の元の位置を示すベクトルvですu。Matlabの構文を使用して、u(ix) == v

私の質問:uからどのように取得しますか?vix

もちろん、私は単に使用することができます:

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;

wこれは、少なくともと同じ大きさvであるか、まだ宣言されていない場合に限り、有効なMatlab操作です。

例:

>> 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 に答える