我仍然会推荐 mlabwrap 作为解决方案。我在 Linux 和 Windows 上定期(每周?)使用 mlabwrap,跨越几个不同版本的 Python 和几个不同版本的 Matlab。要回答您的具体问题:
- mlabwrap 将可靠地跨平台、Python 和 Matlab 版本执行。然而,它确实有限制,并且当超过这些限制时它会可靠地失败。通常,这些都可以解决。
- 有关通过 mlabwrap 调用 Matlab 函数与 Matlab 脚本的更多信息,请参阅我的答案。该答案还描述了如何解决 mlabwrap 的主要限制之一,即并非所有 Matlab 对象都可以直接转换为 Python 对象。
- 我对使用 win32com 调用 Matlab 一无所知。
我以我将称之为“Python-primary”风格的方式使用了 mlabwrap,其中大部分编程使用 Python,使用 Matlab 作为特定数学函数的库,这些函数在 scipy/numpy 和“Matlab”中不可用-primary'风格,大部分编程都是在Matlab中,最终的结果被导入到Python中用于一些外部过程。
对于 Python-primary,要记住的是,并非所有的 Matlab 函数都会返回 Python 可读的数据。mlabwrapMLabObjectProxy
将从这些函数返回一个对象。当您使用 Matlab 函数创建传递给其他 Matlab 函数以实际处理数据的对象时,通常会发生这些情况。例如,您可以使用数字信号处理工具箱创建一个 Welch 频谱对象,然后您可以使用它来获取数据的功率谱。理论上,您可以将这些 MLabObjectProxies 传递给需要它们的 Matlab 函数。根据我的经验,您来回传递这些内容越多,您就越有可能在 mlabwrap 中找到错误。您可以做的是编写一个简单的 Matlab 包装函数,获取对象、处理数据,然后将适当的输出作为数组返回。
您还可以通过使用 mlabwrap 中的低级命令来解决 MLabObjectProxies 的问题。例如,如果我有一个matlab_struct
带有 field 的结构数组matlab_struct.label
,并且我只想要 Python 端的标签,我可以执行以下操作:
# place matlab_struct into the Matlab workspace
mlab._set('matlab_struct', matlab_struct)
# convert the labels into a cell array
matlab_struct_labels = mlab.eval('{matlab_struct.labels}')
可用的主要低级命令是mlab._set('variable_name', variable)
、mlab.eval('command string')
和mlab.get('variable_name')
。
如果我在 Matlab 中进行大量繁重的处理,比如在其他地方没有的工具箱或插件中,我将编写我称之为“Matlab-primary”的代码,在那里我尽量避免将数据传回来回通过 mlabwrap,而不是通过调用 .m 脚本来操作 Matlab 工作区中的变量,将结果输出保存到数据文件中,然后将其导入我的 Python 代码中。
祝你好运!