我仍然建议使用mlabwrap作为解决方案。我经常(每周?)在Linux和Windows上使用mlabwrap,在几个不同版本的Python和Matlab上使用它。回答您的具体问题:
1. mlabwrap可以可靠地跨平台、Python和Matlab版本执行。但是它有一些限制,当超出这些限制时,它会可靠地失败。通常,这些可以解决。
2. 有关通过mlabwrap调用Matlab函数与Matlab脚本的更多信息,请参见我的答案
here。此答案还描述了如何解决mlabwrap的主要限制之一,即并非所有Matlab对象都可以直接转换为Python对象。
3. 我不知道如何使用win32com调用Matlab。
我已经以“Python-primary”风格和“Matlab-primary”风格使用过mlabwrap。在“Python-primary”风格中,大部分编程使用Python完成,使用Matlab作为库来处理一些在scipy/numpy中不可用的数学函数;在“Matlab-primary”风格中,大部分编程是在Matlab中完成,并将最终结果导入Python以供外部进程使用。
对于Python主要的问题,需要记住的是并非所有Matlab函数都会返回Python可读取的数据。在这些函数中,mlabwrap将返回一个
MLabObjectProxy
对象。当您使用Matlab函数创建对象并将其传递到其他Matlab函数来实际处理数据时,通常会出现这种情况。例如,您可以使用数字信号处理工具箱创建一个Welch频谱对象,然后使用它来获取您的数据的功率谱。理论上,您可以将这些MLabObjectProxies传递给需要它们的Matlab函数。根据我的经验,您传递得越多,就越有可能在mlabwrap中发现错误。相反,您可以编写一个简单的Matlab包装函数,获取对象、处理数据,然后将适当的输出作为数组返回。
您还可以通过使用mlabwrap中的低级命令来解决MLabObjectProxies的问题。例如,如果我有一个
matlab_struct
是一个带有字段
matlab_struct.label
的结构体数组,而我只想在Python端获取标签,我可以执行以下操作:
mlab._set('matlab_struct', matlab_struct)
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代码中。
祝你好运!