Pythonからmatlabモジュールにアクセスする方法を探しています。私の現在の状況はこれです:
ctypes
として割り当てられ、Lapackルーチンへのポインタとして渡されている間に、Lapackルーチンを呼び出すことによって数値計算を行うpythonコードがあります。私の質問はこれです:
すべての主要な作業をpythonで維持しながら、同時にmatlab/octaveモジュールが提供する可能性を活用する効率的な方法は何ですか。また、それは一種の素晴らしいでしょう、オクターブを実行するためにctype配列を他のオブジェクトに変換する必要がない場合。ただし、最後のポイントを達成するのは難しいことがわかります。
私の現在の調査では、2つの可能なオプションが示されています。
OMPCの使用を検討しましたか http://ompc.juricap.com/ ?いくつかの数値線形代数ルーチンを書き直したくないときに、私はそれを大成功で使用しました。 Matlabコマンドが難解であるほど、翻訳が難しくなると想像できますが、試してみる価値があるかもしれません。最終的には、MatlabコードをPythonに変換する必要があります。これは、速度とパフォーマンスのボトルネックになるためです。MatlabコードをMatlab形式のままにする唯一の理由は次の場合です。すべてを翻訳するのは莫大な初期費用であり、OMPCはそれをいくらか軽減する必要があります。そうでなければ、Matlab/Octaveの依存関係を完全に取り除くことは、ほとんどの場合、その初期費用の価値があります。
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
その他の例については、 このブログ記事 を確認できます。
(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をグーグルで検索し、既存のスクリプトを新しいバージョンに置き換えました。