まえがき
公式の記事が正しいし、情報も多いです。
ただし詰まった時に同じ詰まり方をしている記事があまりなかったので、matlabに詳しくはないですが書きます。
わからない時は直接質問ください、一緒に考えます。
前提(自環境)
名称 | バージョン |
---|---|
Ubuntu | 18.04 |
matlab | R2020b |
python | 3.8 |
1. APIインストール
[1]Python 用の MATLAB エンジン API のインストールを見ながらやっていきます。
この内容そのままなので今回は割愛します。
ただしmatlabエンジンのビルドができたら、lsとかで本当にあるかは確認してください
(公式にもありますが、matlabroot/extern/engines/python/build/lib/matlab/
に_init_.py
がいるってのが今回の肝です)。
2. pythonからmatlabを呼び出す
1の補足に書いた通り、公式そのままpath通さないでimport matlab
ってするとモジュールが見つからないと怒られてしまいます。
以下のようなコードを記述することでこれを回避します。
import sys
# matlabAPIのパスを追加
sys.path.append('matlabroot/extern/engines/python/build/lib/')
# APIのインポート
import matlab.engine
# matlabのファイル確認
print(matlab.__file__)
matlabroot/extern/engines/python/build/lib/matlab/__init__.py
このコードでmatlabのファイルとバージョンを確認しています。
自分はpip install matlab
ができてしまったせいでこのファイルがcondaを指すようになってました。
一度pip install matlab
してしまった人はpip remove matlab
をしてからpythonコードを走らせてみてください。
3. matlabで書かれたコードを呼び出してpythonから実行する
呼び出し側のpythonコードと同じ階層にmatlabのユーザースクリプトを置きます。
以下のような階層ができれば正解です。
実行場所はカレントディレクトリで行ってください。外から実行するとmatlab engineが.mファイルを探せなくてエラーを吐きました。
.
│──test.py
└──triarea.m
スクリプトは[2]Python からのユーザー スクリプトと関数の呼び出し
の公式リファレンスままで、以下のように書きました。
function a = triarea(b,h)
a = 0.5*(b.* h);
# パス追加用にsysをインポート
import sys
# matlabAPIのパスを追加
sys.path.append('matlabroot/extern/engines/python/build/lib/')
# モジュールをインポート
import matlab.engine
# matlabエンジンをスタート
eng = matlab.engine.start_matlab()
# 自分のスクリプトに引数を渡して戻り値を変数に格納
res = eng.triarea(1.0, 5.0)
# 結果を出力
print(res)
eng.quit()
2.5
エンジンの実行中に Python を終了すると、Python はエンジンとその MATLAB プロセスを自動的に停止します。
[3]Python 用 MATLAB エンジンの起動と停止
と、あるようにpythonスクリプトが終了するとmatlabプロセスも終了しますが心配なのでeng.quit()としました。
まとめ
同じようにしてeng.matlab関数()
としてあげれば、matlabにしかない組み込み関数とかも動かせます。
詳しくは[4]Python からの MATLAB 関数の呼び出しの公式リファレンスが読みやすいかと思います。
ぜひやってみてください。
(祈願) 卒論うまく書けますように
参考文献
[1]Python 用の MATLAB エンジン API のインストール
[2]Python からのユーザー スクリプトと関数の呼び出し
[3]Python 用 MATLAB エンジンの起動と停止
[4]Python からの MATLAB 関数の呼び出し