見出し画像

MatlabとPythonの連携pyrunfile

Matlabは導入だけでなく維持にも結構な費用がかかります。仕事でダイナミックシミュレーションをメインで、機械学習とかpythonの得意そうな部分だけ連携して使いたいってパターン結構あると思います。

これはpythonに限らずC言語でも同じですが、C言語の場合もともとC言語のプログラムを流用したい。あるいは、取引先との協業で使うのだけれどもソースコードを秘匿化したいってパターンが多いかと思いますが、それは機会あれば書きたいと思うのでとりあえずpythonとの連携です。

連携についてはMatlabでpython使う方法について、特につまづきそうな部分だけ記述します。

個人的な感想として躓きポイントが

  1. 引数と戻り値

  2. データ型

の2点あります。

まずpythonでsample.pyの内容で記述しますが、Matlabのエディタ使って何の問題もありません。


 #sample .py
import numpy as np
a=np.array(a)
b=np.array(b)
c=a+b
d=2*c
e=np.vstack([a,b,c,d])
f=d.tolist()
g=e.tolist()
print("c=",c)
print("d=",d)
print("e=",e)
print("f=",f)
print("g=",g)

これをMatlab上で実行するにはpyrunfileを使います。

%MATLABでの処理
[c,d,e,f,g]=pyrunfile('sample.py',["c","d","e","f","g"],a=[1,2,3],b=[4,5,6])

これで終わりです。

  1. 引数と戻り値
    引数は戻り値として"c"などpythonファイルの内部変数を、pythonファイルに引き渡す引数はa=1などと記述して”,”を使います。ここでaもpythonファイルの内部変数です。もし引き渡す方がMatlabのワークスペース変数matvalueであればa=matvalueなどすればOKです。また戻り値としてMatlabに展開する変数は今回はpythonとセンスを合わせましたが適当な変数名を与えて構いません。戻り値ですが複数ある場合は["c","d","e","f","g"]と”[]"でくくる必要があります。それとダブルクォーテーションがポイントです。

  2. データ型
    細かいことは置いといて、数値のm,n行列形式の場合Matlabに引き渡して からpythonのリスト型を数値配列に戻すとMatlab上での扱いが一旦cell配列にした上、さらなる処理があり結構な時間使うのでndarray形式でpython内で扱った方が良いでしょう。ただ1行ベクトル、1列ベクトル形式であればMatlabに持ってきてからもリスト型での扱いは楽ですがndarrayで統一したほうが良いかと思います。ちなみにリスト型の場合私のPCではもっと大きなデータですがプチフリーズ状態でした。

>> double(f)

ans =

    10    14    18

>> double(g)
使い方によるエラー py.list/double
位置 1 の Python 要素を 'double' 型に変換できませんでした。すべての Python 要素はスカラーとして、要求された型に変
換可能でなければなりません。

関連ドキュメンテーション

これはpythonからの戻り値をMatlab形式に変換した結果です。
行ベクトルfはダブル型に変換できますが行列gはダブル型変換できないためにエラーがでます。

ちなみにリスト型を配列に変えるには下記の処理が必要です、

%pythonリストを変換
G=cell(g)
GG=cellfun(@double,G,'UniformOutput',false)
GGG=vertcat(GG{:})

%ndarrayを変換
E=double(e)

数値配列なのにリスト型の場合とndarrayではMatlabに持ってきた時に処理が多少複雑になるだけでなく処理時間が大幅に変わってきます。数値だけの配列ならndarrayで簡単に扱えますが、文字などいろんなものが扱えるリストは注意が必要ですね。

まとめ
Matlab上でpythonファイルを実行できる。Matlab,python間でデータの受け渡しも可能だが書式に注意。


この記事が気に入ったらサポートをしてみませんか?