【问题标题】:Embed a function from a Matlab MEX file directly in Python直接在 Python 中嵌入来自 Matlab MEX 文件的函数
【发布时间】:2011-10-14 11:53:57
【问题描述】:

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

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

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

谢谢。

【问题讨论】:

    标签: python matlab mex


    【解决方案1】:

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

    让我编辑我自己的答案,说出以下内容:如果您确实有 MATLAB 许可证可用,那么优秀的包 MLAB wrap 至少可以满足您的部分需求。

    【讨论】:

    • 但是MEX文件中不是已经链接了Matlab C库吗?还是不能将其包含在包装器中?当然我假设在这种情况下系统上安装了 Matlab...
    • 您所说的可能是可能的,但这不是您最初要求的。在这种情况下,您将需要 Matlab 许可证,并且能够运行与拥有 Matlab 许可证一样多的 MEX 文件会话,即使从 Python 执行此操作也是如此。将 Matlab C 库绑定到 Python 在技术上仍然具有挑战性。
    • 另外,我不是律师,也没有阅读 Matlab EULA,但这样做的合法性可能存在问题。
    【解决方案2】:

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

    另见stackoverflow topic

    【讨论】:

      【解决方案3】:
      1. 正如 Mauro 指出的那样,您可以从 mex 文件构建库
      2. 您可以安全地使用 scipy.io.loadmat,数据表示:

      来自:

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

      返回:

      mat_dict : 字典

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

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

      【讨论】:

        【解决方案4】:

        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 调用函数不太一样——例如没有返回值。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-07-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-22
          • 2011-03-01
          相关资源
          最近更新 更多