更新:私はいくつかのテストを行いました.Jonasのソリューションは、さまざまなサイズの入力ベクトルの範囲で最速です. 特に、Angainor が指摘するように、ソリューションは非常にうまく大きなサイズにスケールアップします。これは重要なテストであり、通常、SO についてこの種の質問を投げかけるのは大きなサイズの問題です。Jonas と tmpearce の両方のソリューションに感謝します。大規模な問題のソリューションの効率に基づいて、Jonas に答えを与えています。
私の質問:私はこの列ベクトルを持っています:
Vec = [0; 1; 2; -1; -3; 0; 0; 2; 1; -1];
1より大きいすべての要素を、要素の値と同じ長さを持つ一連の要素に変換したいと思います。同様に、マイナス 1 未満のすべての要素をマイナス 1 のシーケンスに変換したいと考えています。したがって、私の出力ベクトルは次のようになります。
VecLong = [0; 1; 1; 1; -1; -1; -1; -1; 0; 0; 1; 1; 1; -1];
各 2 は 2 つの 1 に変更され、-3 は 3 つの -1 に変更されていることに注意してください。現在、次のように問題を解決しています。
VecTemp = Vec;
VecTemp(VecTemp == 0) = 1;
VecLong = NaN(sum(abs(VecTemp)), 1);
c = 1;
for n = 1:length(Vec)
if abs(Vec(n)) <= 1
VecLong(c) = Vec(n);
c = c + 1;
else
VecLong(c:c + abs(Vec(n))) = sign(Vec(n));
c = c + abs(Vec(n));
end
end
これはあまりエレガントではありません。誰でもより良い方法を提案できますか? 注:Vec
には整数値のみが含まれると想定できます。すべての提案を前もって感謝します。