これに対する解決策として、mlabwrap をお勧めします。Linux と Windows の両方で、Python のいくつかの異なるバージョンと Matlab のいくつかの異なるバージョンで、mlabwrap を定期的に (毎週?) 使用しています。特定の質問に答えるには:
- mlabwrap は、プラットフォーム、Python、および Matlab のバージョン間で確実に実行されます。ただし、制限があり、それらの制限を超えると確実に失敗します。通常、これらは回避できます。
- mlabwrap を介した Matlab 関数と Matlab スクリプトの呼び出しの詳細については、こちらの回答を参照してください。この回答では、mlabwrap の主な制限の 1 つを回避する方法についても説明しています。これは、すべての Matlab オブジェクトを Python オブジェクトに直接変換できるわけではないということです。
- win32com を使用して Matlab を呼び出すことについては何も知りません。
私は「Python-primary」スタイルと呼ぶものでmlabwrapを使用しました.Pythonでのプログラミングの大部分は、scipy / numpyでは利用できない特定の数学関数のライブラリとしてMatlabを使用し、「Matlab -primary' スタイルで、プログラミングの大部分は Matlab で行われ、最終結果は Python にインポートされて外部プロセスで使用されます。
Python プライマリの場合、すべての Matlab 関数が Python で読み取り可能なデータを返すわけではないことに注意してください。mlabwrap はMLabObjectProxy
、これらの関数からオブジェクトを返します。これらは通常、Matlab 関数を使用してオブジェクトを作成し、他の Matlab 関数に渡して実際にデータを処理する場合に発生します。たとえば、デジタル信号処理ツールボックスを使用して、データのパワー スペクトルを取得するために使用できるウェルチ スペクトル オブジェクトを作成できます。理論的には、これらの MLabObjectProxies を必要とする Matlab 関数に渡すことができます。私の経験では、これらをやり取りすればするほど、mlabwrap でバグを見つける可能性が高くなります。代わりにできることは、単純な Matlab ラッパー関数を記述して、オブジェクトを取得し、データを処理してから、適切な出力を配列として返すことです。
また、mlabwrap の低レベル コマンドを使用して、MLabObjectProxies の問題を回避することもできます。たとえば、matlab_struct
field を持つ構造体配列である がありmatlab_struct.label
、Python 側のラベルのみが必要な場合は、次のようにできます。
# place matlab_struct into the Matlab workspace
mlab._set('matlab_struct', matlab_struct)
# convert the labels into a cell array
matlab_struct_labels = mlab.eval('{matlab_struct.labels}')
使用可能な主な低レベル コマンドは、、、mlab._set('variable_name', variable)
およびmlab.eval('command string')
ですmlab.get('variable_name')
。
他の場所では利用できないツールボックスやプラグインなど、Matlab で多くの負荷の高い処理を行っている場合は、「Matlab-primary」コードと呼ばれるものを作成し、データを返さないようにします。代わりに、.m スクリプトを呼び出して Matlab ワークスペースの変数を操作し、結果の出力をデータ ファイルに保存して、それを Python コードにインポートします。
幸運を!