如何从python访问matlab / octave模块?

时间:2011-05-26 07:06:29

标签: python matlab octave lapack

我正在寻找一种从python访问matlab模块的方法。我目前的情况是:

  • 我有一个python代码,通过调用Lapack例程进行数值计算,同时将内存分配为ctypes并作为指向Lapack例程的指针传递。
  • 我还有一个matlab模块,它与八度音程兼容,可以做一些我想要使用的数学技巧。

我现在的问题是:
什么是保持python中所有主要工作的有效方法,同时利用matlab / octave模块提供的可能性。如果我的ctype数组不必转换为其他对象以便运行八度音程,那么它也会很好。但是,我可以看到最后一点很难实现。

我目前的研究向我展示了两种可能的选择:

  1. Pytave:但是看起来这个软件包有点像pre alpha?!
  2. 走这条笨拙的道路:ctypes - > * .mat文件(通过numpy) - >八度 - > * .mat文件 - > ctypes(通过numpy)

3 个答案:

答案 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,并用新版本替换了现有的脚本。