私がこの実用的な例を持っているとしましょう:
lover_bound = 10;
upper_bound = 180;
steps = 10;
NumeroCestelli = 8;
livello = [lover_bound:steps:upper_bound];
L = length(livello);
n_c = ceil((factorial(L+NumeroCestelli-1))/(factorial(NumeroCestelli)*factorial(L-1)));
randIdxs = randi([1,L],n_c,NumeroCestelli);
PianoSperimentale = single(livello(randIdxs));
各行が一意であるn_c x NumeroCestelli
マトリックス ( と呼ばれる)を実行する必要があります。PianoSperimentale
いかなる形式の順列も許可されていません。randi を使用すると、私が求めていることを実行できません。
[10 20 30 40 50 60 70 80] is equal to [80 70 60 50 40 30 20 10]
PianoSperimentale
1081575x8
マトリックスでなければなりません。以前はCombinator ) 関数を使用していましたが、行列が非常に大きい場合は非常に遅くなります。
[PianoSperimentale] = combinator(L,NumeroCestelli,'c','r');
for i=1:L
PianoSperimentale(PianoSperimentale==i)=livello(i);
end
それで、同じマトリックスを実行する方法がありcombinator
ますが、randi
速度はありますか?
編集: 同じ番号を 2 回選択できるようにします ( NumberOfCombinations = (NumeroCestelli+L-1)!/(NumeroCestelli!(L-1)!
)
提案された編集
18 要素のベクトルから任意の 8 つの数値を選択するときに得られる組み合わせの完全なセット (重複あり) を生成する必要があります。これはCombinator関数を使用して実行できますが、行列が非常に大きい場合は非常に遅くなります。これを生成するためのより高速な方法を提案できる人はいますか?
例:「4 のベクトルからのサンプル 3」を使用すると、次の結果が得られます。
1 1 1
1 1 2
1 1 3
1 1 4
1 2 2
1 2 3
1 2 4
1 3 3
1 3 4
1 4 4
2 2 2
2 2 3
2 2 4
2 3 3
2 3 4
2 4 4
3 3 3
3 3 4
3 4 4
4 4 4
18 個の要素からなるベクトルから 8 個を選択すると、(18+8-1)!/8!*(18-1)!
可能な組み合わせの合計、つまり 8 個の値の 1081578 行が得られることがわかっています。これを行うための高速なアルゴリズムを見つけるのを手伝ってくれる人はいますか?