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

 

【Lua × Java】LuaJのメモ

LuaJについて、軽く触ったのでメモ。

LuaJは、LuaJava上で動かせるようにするJavaのライブラリ。

C系だと気軽に使えて重宝するLuaですが、Javaでも使えるとなるとアプリのパッチなどで活躍するかも。

www.luaj.org

 

Javaのプロジェクト内に組み込むのが一番適した使い方だとは思うけれど、気軽に試したければMaven RepositoryからJarをダウンロードしてきてコマンドとして実行すると良いかと。

mvnrepository.com

 

例: hello.lua

print("Hello World!")

 

実行例:

$ java -cp luaj-jse-3.0.1.jar lua hello.lua
Hello World!

公式サイトでは、SwingのクラスをLuaから利用する例なんかも紹介されていて良い感じ。

Kotlinに組み込んで、Android上で面白い事ができそうな予感。

 

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