Python和Matlab混合编程问题
一年多以前就搞过python和matlab混合编程的问题,但是由于python驱动安装不成功以及python其它驱动matlab的第三方包不维护等等原因,这个问题一直没有得到妥善解决。近期也是需要迫切的解决这个问题,笔者花了一天的时间解决掉了这个顽固的问题。尽管网络上好多解决方法看起来花里胡哨的,但按照他们的做法一点用没有(因为我都试过了)。在这里笔者记录下我解决问题的过程希望大家少走弯路。 1、版本问题 搞混合编程首先要知道matlab跟python版本的对应问题,这个问题很重要。一般来说matlab2016b以及之前的版本支持python2.7、python3.3和python3.4,当你按照这个配置装matlab驱动的时候没有问题不会报错,但是要命的是pycharm已经不支持python3.4及其以前的版本了!!!,而且pip对于python3.4已经不支持了!!!。所以果断抛弃网络上这些版本及其之前版本的经验贴。 笔者使用的matlab版本是matlab2017b记住一定是matlab2017b(资源在文末)其它的版本我没有尝试过不知道效果咋样,有探索心的同志可以尝试更高的版本并在博客下面留言大家一起分享。对于python的版本我用的是python3.6系列(更高版本的没试过python3.6肯定行)。最后总结一下matlab2017b-python3.6系列。 2、最重要的问题------安装路径 虽然网上花里胡哨的搞了一大堆写的确实是那么一回事儿,能够在前期python安装matlab驱动等方面帮到忙。但是安装完之后根据给的测试用例会一直报错:ImportError: No module named matlab.engine.这个问题十分令人头疼matlab-python混合编程主要解决的就是这个报错问题时间也就是花到这儿了。虽然有的解决方案写的很漂亮怎么怎么来就OK了,后面给了用例这让我十分的羡慕。一旦你按照他们给的来就歇菜了。这些解决方案虽然确实是成功的,只不过他们忽略了最重要的一点matlab的安装路径问题,因为matlab太大了一般都不会安装到C盘,这就是导致我一直搞失败的原因,怎么解决?matlab安装到C盘!!!(matlab安装到C盘的默认路径,python安装的路径无所谓,我的是安装到D盘了)这样问题就解决大半了。 3、安装MATLAB Engine API for python
cd "matlabrootexternenginespython" # 用cmd进入matlab的安装路径下的externenginespython # 运行下面四条语句 python setup.py build --build-base="builddir" install python setup.py install --prefix="installdir" python setup.py build --build-base="builddir" install --prefix="installdir" python setup.py install --user
测试用例:
#coding=utf-8 import matlab.engine from numpy import * if __name__ == __main__: eng = matlab.engine.start_matlab(MATLAB_R2016b) A = matlab.double([[1,2],[5,6]]) print(type(A),A.size,A) print(eng.eig(A)) eng.quit() pass # 正常输出就没问题了
4、运行matlab脚本并返回值到python 将运行的matlab脚本跟python文件放到同一个路径下如下图所示: matlab项目文件放到pycharm中然后调用。值得注意的是想要python接受matlab的返回值matlab里的脚本应当封装成一个函数,用变量接受这个函数的返回值。进一步的要使用python处理matlab返回值要注意两种语言变量的映射问题,matlab中大多数是double,在python中可以用np.array接受这个返回值。 测试用例:
import matlab.engine import numpy as np if __name__ == __main__: eng = matlab.engine.start_matlab() a = eng.Demo_OMC2() # 此处matlab脚本被封装成了函数,如果不封装去掉输出的引号,也能输出结果但不能被python接受 print(np.array(a)) print(np.array(a).shape) eng.quit()
matlab2017b链接:https://pan.baidu.com/s/1maW0R-wXgwK4rgK64DVjmw 提取码:9ejz
参考文献