【问题标题】:How can I access a matlab/octave module from python?如何从 python 访问 matlab/octave 模块?
【发布时间】:2011-09-02 08:36:06
【问题描述】:

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

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

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

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

  1. Pytave: 不过这个包好像是pre alpha?!
  2. 走这条崎岖的路:ctypes -> *.mat 文件(通过 numpy)-> octave -> *.mat 文件 -> ctypes(通过 numpy)

【问题讨论】:

  • @gnovice 我部分同意,但是这个问题不是关于访问 matlab(因为它对我不可用),而是一个以八度音阶运行的 matlab 模块!它也是关于 Python 中的 Lapack 和 ctypes 的。谢谢链接^^。
  • 我为此付出了很多,因为我很想自己知道这个,但没有时间做研究。
  • 查看我的答案以获得另一种选择。我在此处添加了它,而不是在@gnovice 指出的重复问题中添加了它,因为它基于 Octave,但此处未提及。
  • @Juanlu001 如果发布了我的问题的新答案,我无论如何都会收到通知^^。

标签: python matlab octave lapack


【解决方案1】:

你可以使用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

【讨论】:

  • 感谢您这么晚的答复!它似乎是 Pytave 的一个非常好的替代品!幸运的是,我不再那么依赖 octave,因为我将大部分东西移植到了 numpy。不过我会试一试...
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    您是否考虑过使用 OMPC,http://ompc.juricap.com/?当我不想重写一些数值线性代数例程时,我使用它取得了巨大的成功。我可以想象,Matlab 命令越深奥,翻译起来就越困难……但这可能值得一试。最后,您将希望将您的 Matlab 代码转换为 Python,因为这将成为速度和性能的瓶颈。将 Matlab 代码保留为 Matlab 格式的唯一原因是,如果将其全部翻译成巨大的前期成本,那么 OMPC 应该会有所减轻。否则,完全摆脱对 Matlab/Octave 的依赖几乎总是值得的。

    【讨论】:

    • 这不适用于 python >= 2.6(自 2010 年起承认)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-20
    • 2013-06-06
    • 1970-01-01
    相关资源
    最近更新 更多