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

29 ビュー (過去 30 日間)
qrqr
qrqr 2019 年 8 月 1 日
コメント済み: Toshihiko Baba 2022 年 12 月 26 日
pythonで定義した変数をMATLABに送る方法がわかりません。
仮に、pythonでA=2と定義した場合、MATLABのワークスペースにA=2をどのように
移転させられますか?

採用された回答

Kojiro Saito
Kojiro Saito 2019 年 8 月 2 日
こちらのドキュメントが一番近い例だと思います。
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 件のコメント
交感神経優位なあかべぇ
交感神経優位なあかべぇ 2022 年 12 月 25 日
編集済み: 交感神経優位なあかべぇ 2022 年 12 月 25 日
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 2022 年 12 月 26 日
毎回丁寧なご回答ありがとうございます。上記の教えていただいたevalinを使った方法で、リアルタイムでワークスペースからデータを取得することができました。ありがとうございました。ただ、高速でワークスペースのデータを書き換えようとすると動作が安定しないことが分かりました。また試行錯誤していきたいと思います。
>>また、ベースワークスペースの値の更新とは異なるアプローチになりますが、pythonコードでeng.workspace['data'] = Aを使用したベースワークスペースの更新ではなく、eng.update_plot(A, nargout = 0)のように、PythonからMATLAB関数を呼び出して、MATLABのグラフの更新を行うという方法もいいのではと思います。
こちらの方法でも試してみましたが、関数を呼ぶたびに軸の設定やカラーマップの設定を行わなければいけなく、結果として高速な動作は実現できませんでした。
しかし、調べてもすぐ出てこないような、とても参考になることを教えていただき感謝しています。私が作るプログラムにもまだ荒があると思うので、直していけたらと思います。ありがとうございました。

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangePython からの MATLAB の呼び出し についてさらに検索

タグ

製品


リリース

R2019a

Community Treasure Hunt

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

Start Hunting!