今回は以前に記事を書いた記事の、MATLAB版。
MATLABで[組み合わせ]の処理実装するためには[nchoosek]を利用するのが一番スマート。
例: Demo1.m
data = ["A", "B", "C", "D", "E"]; patterns = nchoosek(data, 3); [m, ~] = size(patterns); for i = 1: m pattern = patterns(i, :); disp(mat2str(pattern)); end
上記コードを実行すると以下が出力される。
>> Demo1 ["A" "B" "C"] ["A" "B" "D"] ["A" "B" "E"] ["A" "C" "D"] ["A" "C" "E"] ["A" "D" "E"] ["B" "C" "D"] ["B" "C" "E"] ["B" "D" "E"] ["C" "D" "E"]
つまりは[patterns]には[5C3]の組み合わせが、以下のような行列として格納されていることがわかる。
"A" "B" "C" "A" "B" "D" "A" "B" "E" "A" "C" "D" "A" "C" "E" "A" "D" "E" "B" "C" "D" "B" "C" "E" "B" "D" "E" "C" "D" "E"
さらに[「A, A, A, A, B, C」の中から3つ取り出す際にAの重複を排除する]ような場合には、以下の様に[unique()]を使用すると良い。
例: Demo2.m
data = ["A", "A", "A", "A", "B", "C"]; patterns = nchoosek(unique(data), 3); [m, ~] = size(patterns); for i = 1: m pattern = patterns(i, :); disp(mat2str(pattern)); end
上記コードを実行すると以下が出力される。
>> Demo2 ["A" "B" "C"]
ちなみに[組み合わせ]ではなく[順列]を求めたい場合には以下のようにすれば良い。
例: Demo3.m
data = ["A", "B", "C", "D", "E"]; patterns = []; init_patterns = nchoosek(data, 3); [m, ~] = size(init_patterns); for i = 1: m tmp_pattern = perms(init_patterns(i, :)); [n, ~] = size(tmp_pattern); for j = 1: n pattern = tmp_pattern(j, :); disp(mat2str(pattern)); patterns = [patterns; pattern]; end end
上記コードを実行すると以下が出力される。
>> Demo3 ["C" "B" "A"] ["C" "A" "B"] ["B" "C" "A"] ["B" "A" "C"] ["A" "C" "B"] ["A" "B" "C"] ["D" "B" "A"] ["D" "A" "B"] ["B" "D" "A"] ["B" "A" "D"] ["A" "D" "B"] ["A" "B" "D"] ["E" "B" "A"] ["E" "A" "B"] ["B" "E" "A"] ["B" "A" "E"] ["A" "E" "B"] ["A" "B" "E"] ["D" "C" "A"] ["D" "A" "C"] ["C" "D" "A"] ["C" "A" "D"] ["A" "D" "C"] ["A" "C" "D"] ["E" "C" "A"] ["E" "A" "C"] ["C" "E" "A"] ["C" "A" "E"] ["A" "E" "C"] ["A" "C" "E"] ["E" "D" "A"] ["E" "A" "D"] ["D" "E" "A"] ["D" "A" "E"] ["A" "E" "D"] ["A" "D" "E"] ["D" "C" "B"] ["D" "B" "C"] ["C" "D" "B"] ["C" "B" "D"] ["B" "D" "C"] ["B" "C" "D"] ["E" "C" "B"] ["E" "B" "C"] ["C" "E" "B"] ["C" "B" "E"] ["B" "E" "C"] ["B" "C" "E"] ["E" "D" "B"] ["E" "B" "D"] ["D" "E" "B"] ["D" "B" "E"] ["B" "E" "D"] ["B" "D" "E"] ["E" "D" "C"] ["E" "C" "D"] ["D" "E" "C"] ["D" "C" "E"] ["C" "E" "D"] ["C" "D" "E"]
[patterns]には[5P3]の各通りが格納される。
尚、パフォーマンスが気になる場合には[patterns]を拡張するのではなく、予め計算してサイズを確保しておくことをオススメする。