Python での MATLAB エラーのトラブルシューティング
Python での MATLAB エラー
MATLAB® 関数でエラーが発生すると、Python® 用 MATLAB エンジンはその関数を停止し、MATLAB が発行した例外を受け取ります。エンジンはエラー メッセージを新しい Python 例外にコピーします。エンジンは Python 例外を発行します。
Python インタープリターが例外を受け取った場合、インタープリターは MATLAB からのエラー メッセージを表示します。エンジンが発行した例外を Python コードで処理することもできます。エンジンが発行できる例外のタイプは、matlab.engine.MatlabEngine
および matlab.engine.FutureResult
のリファレンス ページを参照してください。
MatlabExecutionError: 未定義の関数
Python から、整数に対して MATLAB 関数 sqrt
を呼び出します (次のコード サンプルは Python トレース バックを省略し、エラー メッセージのみを表示します)。
import matlab.engine
eng = matlab.engine.start_matlab()
print(eng.sqrt(4))
matlab.engine.MatlabExecutionError: Undefined function 'sqrt' for input arguments of type 'int64'.
MATLAB は 関数 sqrt
を定義しますが、入力引数は整数ではなく、double
データ型であることを求めます。ただし、入力引数は 4 で、MATLAB に渡される前に Python は 4 を整数として解釈します。エンジンは、Python の整数を int64
MATLAB データ型に変換します。
数値について MATLAB と Python の既定の型は異なります。MATLAB コマンド ラインに「x = 4
」と入力した場合、x
は MATLAB の double
です。Python コマンド ラインに「x = 4
」と入力した場合、x
は Python の int
です。
このエラーを回避するには、Python データ型 float
の入力引数を指定します。エンジンはこの型を MATLAB double
に変換します。
print(eng.sqrt(4.0))
2.0
構文エラー: 式が有効なターゲットではない
MATLAB 関数 eval
を Python から呼び出して MATLAB 変数を作成できます (次のコード サンプルは Python トレース バックを省略し、エラー メッセージのみを表示します)。
import matlab.engine
eng = matlab.engine.start_matlab()
eng.eval("x = 4;")
SyntaxError: Error: The expression to the left of the equals sign is not a valid target for an assignment.
エンジンが eval
を呼び出すと、実行するステートメントが MATLAB に渡されます。入力引数 nargout
を指定しない場合、エンジンは 1 つの出力引数を想定します。ただし、この MATLAB ステートメントは出力引数を返しません。
このエラーを回避するには、呼び出す MATLAB 関数が出力引数を返さないときは、nargout
を 0 と指定します。
eng.eval("x = 4;",nargout=0)
Python で MATLAB セッションを検出できない
MATLAB でオペレーティング システムの環境変数 TEMP
または TMP
をオーバーライドした場合、Python は Python 用の MATLAB エンジンに接続できないことがあります。たとえば、Python プロンプトで次を入力します。
matlab.engine.find_matlab()
Python は ()
を表示します。
Python 用の MATLAB エンジンは一時フォルダーを使用して MATLAB の共有セッションの情報を記録します。この問題を回避するには、Python で環境変数に次の変更を加えます。temp_folder
は MATLAB で設定したフォルダーのパスです。
os.environ['TMP'] = r'temp_folder'
os.environ['TEMP'] = r'temp_folder'
eng=matlab.engine.find_matlab()