我正在寻找一种从python访问matlab模块的方法。我目前的情况是:
ctypes
并作为指向Lapack例程的指针传递。 我现在的问题是:
什么是保持python中所有主要工作的有效方法,同时利用matlab / octave模块提供的可能性。如果我的ctype数组不必转换为其他对象以便运行八度音程,那么它也会很好。但是,我可以看到最后一点很难实现。
我目前的研究向我展示了两种可能的选择:
答案 0 :(得分:20)
您可以使用oct2py,其中IIUC由其作者启动,因为pytave在win32上无效。它通过octavemagic extension在IPython中成功使用,我可以说它很容易单独使用,代码得到维护(我报告了一点点的Unicode错误,作者在一天内修复了它)并且效果很好。大多数时候都很简单:
>>> from oct2py import octave
>>> octave.run("cos(pi / 3)")
'ans = 0.50000'
>>> octave.call("foo", a, b) # Function in foo.m
有关更多示例,请查看this blog article。
答案 1 :(得分:8)
您是否考虑过使用OMPC,http://ompc.juricap.com/?当我不想重写一些数值线性代数例程时,我已经非常成功地使用了它。我可以想象,Matlab命令越是深奥,翻译起来就越难......但是值得一试。最后,您将要将Matlab代码转换为Python,因为它将成为速度和性能的瓶颈。将Matlab代码保留为Matlab格式的唯一理由是,如果将所有内容翻译成一个巨大的前期成本,那么OMPC应该会有所缓解。否则,完全摆脱Matlab / Octave依赖性的前期成本几乎总是值得的。
答案 2 :(得分:3)
我在使用OMPC时遇到了一些麻烦,因为(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)我用google搜索了byteplay,并用新版本替换了现有的脚本。