LoginSignup
18
9

More than 1 year has passed since last update.

PythonからMatlabを動かす話

Posted at

まえがき

公式の記事が正しいし、情報も多いです。
ただし詰まった時に同じ詰まり方をしている記事があまりなかったので、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ってするとモジュールが見つからないと怒られてしまいます。

以下のようなコードを記述することでこれを回避します。

test.py
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 からのユーザー スクリプトと関数の呼び出し
の公式リファレンスままで、以下のように書きました。

triarea.m
function a = triarea(b,h)
a = 0.5*(b.* h);
test.py
# パス追加用に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 関数の呼び出し

18
9
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
9