在作实验的时候,须要用到python和matlab工具来进行不一样的处理,好比在run神经网络的时候,须要使用pytorch框架获得网络的各个参数,在获得参数后须要使用matlab进行聚类规划。以前的作法是用python脚本耦合其联系,二者通讯的方式是经过文件。后来发现matlab有针对于python的api引擎,瞬间感受打开了新世界的大门,只须要在python中调用相关的api,就能够完成matlab的工做,不再用一个一个复制文件了。html
首先,我安装的是matlab R2015b,对应的python版本为3.4,原本一开始的版本是python36,可是因为matlab2015并不兼容py36,解决方法是,一方面能够经过从新安装高版本的matlab来解决,在高版本的matlab中已经使用了py36的接口。另外一方面能够经过修改python版原本实现,经过anconda,能够很简便地安装一个新的py版本,具体的使用状况能够查看conda的帮助文档。python
1. 安装matlab engine的py packageapi
在matlab的官方帮助文档里:https://ww2.mathworks.cn/help/matlab/matlab_external/install-the-matlab-engine-for-python.html,能够找到bash
cd "matlabroot/extern/engines/python" python setup.py install
即切换到对应matlab的engines目录,而后运行安转脚本。须要注意的是,在安装以前须要切换py版本到3.4,不然默认是base的python,那样会出现错误。网络
2. 在py脚本里调用matlab engine框架
在matlab 文档 里https://ww2.mathworks.cn/help/matlab/matlab_external/get-started-with-matlab-engine-for-python.html,声明了对应的matlab engine的启动和使用,其中包含了matlab数据和python数据类型的对应关系。函数
在文档https://ww2.mathworks.cn/help/matlab/matlab_external/call-matlab-functions-from-python.html里,能够更详细地看到如何使用matlab engine:工具
import matlab.engine eng = matlab.engine.start_matlab() tf = eng.isprime(37) print(tf) #True
上述的例子是调用了matlab'的判断素数的接口,首先须要在py文件里导入对应的matlab engine包,而后调用start_matlab()来启动引擎,而后使用引擎来获得返回值,须要注意的是,eng下的函数调用不会有提示,须要参照matlab的接口。spa
上述的是有返回值的调用,当函数具备多个返回值时,那么对应的调用方式以下:code
import matlab.engine eng = matlab.engine.start_matlab() t = eng.gcd(100.0,80.0,nargout=3) print(t)
注意当使用具备多个返回值函数的时候,会返回一个python cell,对于含有矩阵的数据,会转换成python的list数据。
当函数没有返回值时,须要使用如下的方式调用:
import matlab.engine eng = matlab.engine.start_matlab() eng.doc(nargout=0)
即要声明nargout=0,此时函数不会返回任何参数,若是不声明,就会报错。
3. 在python脚本里调用matlab脚本
该文档的帮助信息在https://ww2.mathworks.cn/help/matlab/matlab_external/call-user-script-and-function-from-python.html,能够看到有两种方式的调用1.直接调用2.调用函数
若是是直接的脚本,好比在triarea.m里写下如下内容:
b = 5; h = 3; a = 0.5*(b.* h)
那么在python里就能够直接调用:
import matlab.engine eng = matlab.engine.start_matlab() eng.triarea(nargout=0)
就会获得py的打印输出,a=7.5000,这是由于虽然无返回值,可是matlab的输出仍然会显示在py里。固然更方便的方法是调用函数的形式,生成如下的文件:
function a = triarea(b,h) a = 0.5*(b.* h);
在python中执行如下的调用:
ret = eng.triarea(1.0,5.0) print(ret)
就会获得2.5,须要注意的是,该函数仅返回一个值,所以无需指定nargout的值。