pythonからMATLABにデータを送る方法

30 views (last 30 days)
qrqr
qrqr on 1 Aug 2019
Commented: Toshihiko Baba on 26 Dec 2022
pythonで定義した変数をMATLABに送る方法がわかりません。
仮に、pythonでA=2と定義した場合、MATLABのワークスペースにA=2をどのように
移転させられますか?

Accepted Answer

Kojiro Saito
Kojiro Saito on 2 Aug 2019
こちらのドキュメントが一番近い例だと思います。
2通り紹介します。
どちらも前提としてPython用MATLABエンジンを使用しますので、まず、こちらのドキュメントを参考に、Pythonでインストールを行います。
ここではWindowsの場合を紹介します。コマンドプロンプトを起動し、以下のコマンドを実行します。
cd "$MATLAB_INSTALL\extern\engines\python"
python setup.py install
ここで、$MATLAB_INSTALLはMATLABのインストールフォルダー(例: C:\Program Files\MATLAB\R2019a)です。
これで、Pythonでimport matlab.engineが使えるようになります。
(1) 起動中のMATLABのワークスペースにPythonから変数を送る場合
起動したMATLABで、セッションを共有セッションにします。
【MATLAB側で実行】
% MATLABセッションを共有セッションにする
matlab.engine.shareEngine
次に、Pythonからmatlab.engine.connect_matlab()で接続し、eng.workspace['A'] = Aの形でPythonの変数をMATLABに送ります。
【Python側で実行
sample.py
import matlab.engine
eng = matlab.engine.connect_matlab()
A = 2.0
eng.workspace['A'] = A
# セッションへの接続を切断
eng.quit()
sample.pyをPythonで実行すると、MATLABのワークスペースに変数が追加されます。
Capture.PNG
(2) MATLABを起動してワークスペースにPythonから変数を送る場合
MATLABを新規に起動させるにはmatlab.engine.start_matlab()を使います。
【Python側で実行】
import matlab.engine
eng = matlab.engine.start_matlab()
A = 2.0
eng.workspace['A'] = A
# 確認用(MATLABのワークスペースから変数Aを取得して、Python側で表示)
B = eng.workspace['A']
print(B)
# エンジンの停止
eng.quit()
  9 Comments
交感神経優位なあかべぇ
Edited: 交感神経優位なあかべぇ on 25 Dec 2022
update_plotの関数ですが、データが更新されているのはベースワークスペースの変数なので、下記のようにevalinを使用してベースワークワークスペースからデータを取得すると、うまく行くかもしれません。
function update_plot(~,~)
if evalin('base', "exist('data', 'var')") == 1
data = evalin('base', 'data');
set(H,'XData',data);
set(H,"CData",data);
drawnow;
%pause(0.001);
end
end
>> MATLABでプログラム動作中にも(外部からの干渉による)ワークスペースの値の変動を反映できるようにしたいです。
→ 私は試みたことはなく、上手くいくかは分かりませんが、backgroundPool(R2021b~)のバックグラウンド実行やparallelComputingtoolboxを使用した並列処理などを利用したら、プログラム動作中にもワークスペース値の変動ができるかもしれません。
また、ベースワークスペースの値の更新とは異なるアプローチになりますが、pythonコードでeng.workspace['data'] = Aを使用したベースワークスペースの更新ではなく、eng.update_plot(A, nargout = 0)のように、PythonからMATLAB関数を呼び出して、MATLABのグラフの更新を行うという方法もいいのではと思います。
Toshihiko Baba
Toshihiko Baba on 26 Dec 2022
毎回丁寧なご回答ありがとうございます。上記の教えていただいたevalinを使った方法で、リアルタイムでワークスペースからデータを取得することができました。ありがとうございました。ただ、高速でワークスペースのデータを書き換えようとすると動作が安定しないことが分かりました。また試行錯誤していきたいと思います。
>>また、ベースワークスペースの値の更新とは異なるアプローチになりますが、pythonコードでeng.workspace['data'] = Aを使用したベースワークスペースの更新ではなく、eng.update_plot(A, nargout = 0)のように、PythonからMATLAB関数を呼び出して、MATLABのグラフの更新を行うという方法もいいのではと思います。
こちらの方法でも試してみましたが、関数を呼ぶたびに軸の設定やカラーマップの設定を行わなければいけなく、結果として高速な動作は実現できませんでした。
しかし、調べてもすぐ出てこないような、とても参考になることを教えていただき感謝しています。私が作るプログラムにもまだ荒があると思うので、直していけたらと思います。ありがとうございました。

Sign in to comment.

More Answers (0)

Tags

Products


Release

R2019a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!