26

Python から matlab モジュールにアクセスする方法を探しています。私の現在の状況は次のとおりです。

  • ctypesメモリが割り当てられ、Lapack ルーチンへのポインタとして渡されている間に、Lapack ルーチンを呼び出して数値計算を行う Python コードがあります。
  • また、オクターブと互換性のある matlab モジュールもあり、使用したい数学的トリックを実行します。

私の質問は次のとおりです。
すべての主要な作業をPythonで維持しながら、同時にmatlab / octaveモジュールが提供する可能性を活用する効率的な方法は何ですか. また、octave を実行するために ctype 配列を他のオブジェクトに変換する必要がなければ、それはちょっといいことです。ただし、最後のポイントを達成するのは難しいことがわかります。

私の現在の調査では、2 つの可能なオプションが示されています。

  1. Pytave : しかし、このパッケージはプレ アルファ版のようです?!
  2. ctypes -> *.mat ファイル (numpy 経由) -> octave -> *.mat ファイル -> ctypes (numpy 経由)
4

3 に答える 3

21

pytaveが wi​​n32 で動作しなかったため、作成者によって IIUC が開始されたoct2pyを使用できます。それはoctavemagic 拡張機能を介して IPython で正常に使用されており、単独で使用するのは簡単であり、コードは維持されており (小さな Unicode バグを報告し、著者は 1 日で修正しました)、うまく機能します。ほとんどの場合、次のように単純です。

>>> from oct2py import octave
>>> octave.run("cos(pi / 3)")
'ans =  0.50000'
>>> octave.call("foo", a, b)  # Function in foo.m

その他の例については、このブログ記事を参照してください

于 2013-05-05T11:09:45.093 に答える
8

OMPC ( http://ompc.juricap.com/ ) の使用を検討しましたか? いくつかの数値線形代数ルーチンを書き直したくない場合に、私はそれを使用して大成功を収めました。Matlab コマンドが難解であるほど、翻訳が難しくなると想像できますが、試してみる価値はあるかもしれません。最終的には、速度とパフォーマンスのボトルネックになるため、Matlab コードを Python に変換する必要があります。Matlab コードを Matlab 形式のままにしておく唯一の理由は、すべてを変換するのに莫大な初期費用がかかる場合であり、OMPC はそれをいくらか軽減する必要があります。それ以外の場合は、ほとんどの場合、Matlab/Octave への依存を完全に取り除くための先行投資の価値があります。

于 2011-05-31T21:44:32.173 に答える
3

(I) md5 モジュールは非推奨であり、(II) Python 2.6 以降では Object.__new__() または Object.__init__() の引数を受け入れなくなり、(III) byteplay.pyスクリプトを更新する必要がありました。

問題 (I) を解決するために、ompc/ ディレクトリにある yacc.py の 74 行目を変更しました。この行は特に md5 をインポートします。md5 モジュールを削除し、以下の行を追加しました。

from hashlib import md5

yacc.py スクリプトの後半の 1160 行で、次のように変更しました。

Signature = md5.new()

以下に、

Signature = md5()

ompcply.py によって生成されたコードを実行するには、「from ompc import *」をファイルの先頭に追加し、次のように以前のバージョンの Python で実行します。

$ python2.5 ompcply.py script.m > newscript.pym
$ python2.5 newscript.pym

バージョン 2.5 以降の Python を使用すると、次のエラーが発生します。

/home/connor/downloads/OMPC/ompclib/ompclib_numpy.py:66: DeprecationWarning: object.__new__() takes no parameters
  a = super(mvar, cls).__new__(cls, *args, **kwargs)

問題 (III) を解決するために、byteplay をググって、既存のスクリプトを新しいバージョンに置き換えました。

于 2012-06-05T18:23:28.997 に答える