Unknown Region

プログラムでハマったエラーとその解決方法についての備忘録メモ

【MATLAB】nchoosekによる[組み合わせ]の利用

今回は以前に記事を書いた記事の、MATLAB版。

plugout.hateblo.jp

MATLAB[組み合わせ]の処理実装するためには[nchoosek]を利用するのが一番スマート。

jp.mathworks.com

 

例: 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]を拡張するのではなく、予め計算してサイズを確保しておくことをオススメする。

 

連絡先: plugout777★yahoo.co.jp (クローラー対策のため★を@に変更してください)