直接在Python中嵌入Matlab MEX文件中的函数
我正在使用一个专有的 Matlab MEX 文件来导入一些模拟结果到 Matlab 中(当然没有源代码可用!)。这个与 Matlab 的接口其实很简单,因为只有一个函数,它返回一个 Matlab 的结构体。我想知道有没有办法直接从 Python 调用这个 MEX 文件中的函数,而不需要使用 Matlab?
我想到的办法是,比如使用 SWIG 这样的工具,把 C 函数导入到 Python 中,前提是我需要为它提供一个自定义的 Matlab 包装器……顺便提一下,我知道使用 scipy.io.loadmat 已经可以读取 Matlab 的二进制 *.mat 数据文件,但我不确定 mat 文件中的数据表示是否和 Matlab 内部的表示一样(如果一样的话,这可能对 MEX 包装器有帮助)。
当然,我的想法是能够在系统上没有安装 Matlab 的情况下,使用 MEX 中提供的函数。
谢谢。
4 个回答
- 正如Mauro提到的,你可以通过一个mex文件来构建一个库。
- 你可以安全地使用scipy.io.loadmat来加载数据,数据的表现形式是:
来自:
http://docs.scipy.org/doc/scipy/reference/generated/scipy.io.loadmat.html
返回结果:
mat_dict : dict
这是一个字典,里面的键是变量名,值是加载的矩阵。
加载的矩阵和你保存时的样子是一样的,也就是说,数据的表现形式应该是一致的。
你可以从Matlab代码创建独立的共享库,比如可以参考这个链接:http://www.mathworks.com/help/toolbox/compiler/mbuild.html。这些共享库可以在Python中调用。不过,你需要有Matlab Compiler这个工具,不过看起来有一个免费的试用版本可以使用。
你也可以看看这个StackOverflow的话题。
除非我对Matlab的工作原理或你的问题有误解,否则这几乎是不可能的。从技术角度来看,任何解决方案都需要完全重新实现Matlab的C库,确保二进制兼容,也就是说要逐个修复bug,逐个实现功能(比如实现mxGetPr、mxGetN等等),然后再与Python连接。
让我修改一下我的回答:如果你有Matlab的许可证,可以使用一个很棒的工具包MLAB wrap,它至少能部分满足你的需求。