26

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

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

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

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

  1. Pytave:但是,这个包似乎有点像 pre alpha?!
  2. 走这条崎岖的道路:ctypes -> *.mat 文件(通过 numpy)-> octave -> *.mat 文件 -> ctypes(通过 numpy)
4

3 回答 3

21

您可以使用oct2py,IIUC 是由其作者启动的,因为 pytave 在 win32 上不起作用。它通过其octavemagic 扩展在 IPython 中成功使用,我可以说它很容易单独使用,代码得到维护(我报告了一个 Unicode 小错误,作者在一天内修复了它)并且运行良好。大多数时候很简单:

>>> 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

我在让 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),我搜索了 byteplay,并将现有脚本替换为较新的版本。

于 2012-06-05T18:23:28.997 回答