web-dev-qa-db-ja.com

Pythonからmatlab / octaveモジュールにアクセスするにはどうすればよいですか?

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

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

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

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

  1. Pytave :しかし、このパッケージは一種のプレアルファのようです?!
  2. このでこぼこの道を行く:ctypes-> * .matファイル(numpy経由)->オクターブ-> * .matファイル-> ctypes(numpy経由)
25
Woltan

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

8
ely

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

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

その他の例については、 このブログ記事 を確認できます。

21
astrojuanlu

(I)md5モジュールが非推奨になり、(II)Python 2.6以降、Object .__ new __()またはObject .__ init __()の引数を受け入れなくなったため、OMPCを機能させるのに問題がありました。 、および(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をグーグルで検索し、既存のスクリプトを新しいバージョンに置き換えました。

3
cjohnson318