8

Python スクリプト用のプラットフォームがあり、内部で matlab 関数を呼び出したいと考えています。この問題に取り組んでいるスレッドがいくつか見つかりました。そのうちの 2 つ

Python から MATLAB を操作するにはどうすればよいですか?

Python からの m ファイルの実行

ただし、スレッドは最近のものではないか、あまり詳細ではありません。

  1. mlabwrap は信頼できますか?
  2. Pythonスクリプトでmatlab関数/ .mファイルを呼び出すソリューションとして何を提唱しますか?
  3. Python から win32com を使用して matlab セッションを呼び出す --> これは良い考えですか? このトピックに関するドキュメントや例をもっと教えてください。

sourceForge へのリンクが最新ではないようです。最終更新は 2010 年です。

http://sourceforge.net/projects/mlabwrap/

  1. 最新バージョンを教えていただけますか?

ありがとう

4

4 に答える 4

7

これに対する解決策として、mlabwrap をお勧めします。Linux と Windows の両方で、Python のいくつかの異なるバージョンと Matlab のいくつかの異なるバージョンで、mlabwrap を定期的に (毎週?) 使用しています。特定の質問に答えるには:

  1. mlabwrap は、プラットフォーム、Python、および Matlab のバージョン間で確実に実行されます。ただし、制限があり、それらの制限を超えると確実に失敗します。通常、これらは回避できます。
  2. mlabwrap を介した Matlab 関数と Matlab スクリプトの呼び出しの詳細については、こちらの回答を参照してください。この回答では、mlabwrap の主な制限の 1 つを回避する方法についても説明しています。これは、すべての Matlab オブジェクトを Python オブジェクトに直接変換できるわけではないということです。
  3. 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_structfield を持つ構造体配列である があり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 コードにインポートします。

幸運を!

于 2012-11-19T18:58:26.093 に答える
1

質問に答えるには:

  1. mlabwrap を使用しましたが、信頼性がありました。唯一の困難は、それをコンパイルすることでした。それにはいくつかの問題がありました。ただし、コンパイルすると、正常に動作します。
  2. インストールがはるかに簡単で (純粋な Python、コンパイルなし)、さまざまなデータ構造 (数値、論理、構造体、セル配列) をサポートし、GNU/Linux、Windows、OSX で実行できるので、matlab_wrapperをお勧めします。
  3. win32com を使用した MATLAB との通信は機能するはずですが、これは非常に低レベルであり、移植性がありません。

免責事項: 私は matlab_wrapper の作成者です。

于 2014-07-20T13:59:03.347 に答える