直接在Python中嵌入Matlab MEX文件中的函数

时间:2011-07-27 17:42:57

标签: python matlab mex

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

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

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

感谢。

4 个答案:

答案 0 :(得分:2)

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

让我编辑自己的答案,说出以下内容:如果你有可用的MATLAB许可证,那么优秀的软件包MLAB wrap至少可以完成您想要的部分。

答案 1 :(得分:2)

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

另见stackoverflow topic

答案 2 :(得分:1)

  1. 您可以通过Mauro指出的mex文件构建库
  2. 您可以安全地使用scipy.io.loadmat,数据表示:
  3. 从:

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

    返回:

    mat_dict:dict

    字典,变量名称作为键,加载矩阵作为值

    加载的矩阵就像你保存它们一样,即数据表示应该是连贯的。

答案 3 :(得分: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调用函数并不完全相同 - 例如,没有返回值。