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

31 vues (au cours des 30 derniers jours)
qrqr
qrqr le 1 Août 2019
Commenté : Toshihiko Baba le 26 Déc 2022
pythonで定義した変数をMATLABに送る方法がわかりません。
仮に、pythonでA=2と定義した場合、MATLABのワークスペースにA=2をどのように
移転させられますか?

Réponse acceptée

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

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur Python からの MATLAB の呼び出し dans Help Center et File Exchange

Tags

Produits


Version

R2019a

Community Treasure Hunt

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

Start Hunting!