7

我正在使用专有的 Matlab MEX 文件在 Matlab 中导入一些模拟结果(当然没有可用的源代码!)。Matlab 的接口实际上非常简单,因为只有一个函数,返回一个 Matlab 结构。我想知道是否有任何方法可以直接从 Python 调用 MEX 文件中的这个函数,而不必使用 Matlab?

我想到的是例如使用 SWIG 之类的东西通过提供一个自定义的 Matlab 包装器来将 C 函数导入 Python ......顺便说一下,我知道使用 scipy.io.loadmat 已经可以阅读Matlab 二进制 *.mat 数据文件,但我不知道 mat 文件中的数据表示是否与 Matlab 中的内部表示相同(在这种情况下,它可能对 MEX 包装器有用)。

这个想法当然是能够使用 MEX 中提供的功能,而系统上没有安装 Matlab。

谢谢。

4

4 回答 4

2

您可以从 Matlab 代码创建独立的共享库,例如http://www.mathworks.com/help/toolbox/compiler/mbuild.html。这些你应该可以从 python 调用。但是您需要 Matlab 编译器,但是,它似乎有免费的试用版。

另请参阅此stackoverflow 主题

于 2011-08-12T17:23:52.543 回答
2

除非我对 Matlab 的工作原理或您的问题有误解,否则这是不可能的。从技术的角度来看,任何解决方案都需要是一个完整的、二进制兼容的、对错误的错误、对 Matlab C 库的功能重新实现的功能(实现 mxGetPr、mxGetN 等),但要绑定到 Python。

让我编辑我自己的答案,说以下内容:如果您确实有可用的 MATLAB 许可证,则可以使用出色的MLAB wrap 包,它至少可以完成您想要的部分功能。

于 2011-07-27T18:10:38.593 回答
1

mex函数是一个api,它允许Matlab(即matlab程序)调用用c/c++编写的函数。这个函数又可以调用 Matlab 自己的内部函数。因此,mex 函数将链接到 Matlab 库。因此,直接从没有 Matlab 库的 Python 程序调用 mex 函数看起来是不可能的(并且对此没有意义)。

需要考虑的是,为什么首先要创建 mex 函数?是让 matlab 用户可以使用一些非 matlab c 库(或 c 代码),还是隐藏一些专有的 matlab 代码,同时仍然让 matlab 用户可以使用它?如果是第一种情况,那么您可以请求 mex 函数的所有者以非 mex 动态库形式提供它,您可以将其包含在另一个 c 或 python 程序中。如果 mex 函数不依赖于 Matlab 内部函数,这应该很容易。

上面的其他人提到了matlab编译器......是的,如果您使用Matlab编译器生成这样的二进制文件,您可以在可从unix调用的独立二进制文件中包含一个mex函数(因此来自python但作为unix调用)。这需要二进制文件与 Matlab 的运行时环境一起部署。这与直接从 python 调用函数并不完全相同——例如,没有返回值。

于 2012-06-23T22:40:18.673 回答
1
  1. 正如 Mauro 指出的那样,您可以从 mex 文件构建一个库
  2. 您可以安全地使用 scipy.io.loadmat,数据表示:

从:

http://docs.scipy.org/doc/scipy/reference/generated/scipy.io.loadmat.html

返回:

mat_dict : 字典

以变​​量名作为键的字典,并将加载的矩阵作为值

加载的矩阵与您保存的一样,即数据表示应该是一致的。

于 2011-12-02T01:16:45.463 回答