将Matlab MEX文件中的函数直接嵌入Python代码

7
我正在使用专有的Matlab MEX文件将一些仿真结果导入到Matlab中(当然没有源代码!)。与Matlab的接口实际上非常简单,因为只有一个函数,返回一个Matlab结构体。我想知道是否有任何方法可以直接从Python中调用MEX文件中的此函数,而不必使用Matlab?
我的想法是例如使用SWIG之类的工具通过提供围绕它的自定义Matlab包装器将C函数导入Python中......顺便说一句,我知道使用scipy.io.loadmat已经可以读取Matlab二进制*.mat数据文件,但我不知道mat文件中的数据表示是否与Matlab内部表示相同(在这种情况下,对于MEX包装器可能会有用)。
当然,想法是能够在系统上没有安装Matlab的情况下使用MEX提供的功能。
谢谢。
4个回答

2

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

让我编辑自己的答案,说以下内容:如果您有MATLAB许可证,则有一个优秀的软件包MLAB wrap可以至少部分实现您想要的功能。


但是Matlab C库不是已经链接在MEX文件中了吗?或者它不能包含在包装器中吗?当然,我假设在这种情况下Matlab已经安装在系统上... - OlivierB
你所说的可能是有可能的,但这并不是你最初所问的。在这种情况下,你需要一份Matlab许可证,并且可以运行与Matlab许可证数量相同的MEX文件会话,即使是从Python中运行也可以。但将Matlab C库绑定到Python仍然具有技术挑战性。 - carlosdc
我不是律师,也没有阅读过Matlab EULA,但这样做可能存在法律问题。 - carlosdc

1

1
Mex函数是一种API,允许Matlab(即Matlab程序)调用用C/C++编写的函数。这个函数反过来又可以调用Matlab自己的内部函数。因此,Mex函数将链接到Matlab库。因此,直接从Python程序中调用Mex函数而不使用Matlab库似乎不可能(也没有意义)。
需要考虑的是,为什么首先创建了Mex函数?是为了使一些非Matlab C库(或C代码)可用于Matlab用户,还是为了隐藏一些专有的Matlab代码,同时仍然使其对Matlab用户可用?如果是第一种情况,那么您可以请求Mex函数的所有者以非Mex动态库形式提供它,以便您可以将其包含在另一个C或Python程序中。如果Mex函数不依赖于Matlab内部函数,这应该很容易实现。
其他人已经提到了Matlab编译器...是的,如果您使用Matlab编译器生成这样的二进制文件,则可以将Mex函数包含在可从Unix调用的独立二进制文件中(因此可以从Python调用)。这将需要部署二进制文件以及Matlab的运行时环境。这与直接从Python调用函数并不完全相同--例如没有返回值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接