python调用MATLAB

R2017b之前的版本支持py2.7-py3.5,R2017b以及之后可支持py3.6

安装MATLAB

切换目录至 MATLAB\R2018b\extern\engines\python,执行命令

1
2
3
4
#非默认目录下安装,并把安装信息存至D:\MatlabForPython\files.txt
python setup.py build --build-base="D:\MatlabForPython" install --record D:\MatlabForPython\files.txt
#默认目录下安装
python setup.py install

准备工作

matlab文件 getFromMat.m

1
2
3
function a = getFromMat(x)
a=[1 2 3; 4 5 6]
x

导入包,并启动

1
2
>>> import matlab.engine
>>> eng=matlab.engine.start_matlab()

python获取matlab函数的执行结果

需要将得到的值进行转化,才能得到array类型的数据

1
2
3
4
5
6
7
8
9
10
11
>>> mat=eng.getFromMat(1)
a =
1 2 3
4 5 6
x =
int64
1

>>> np.array(mat._data).reshape(mat.size[::-1]).T
array([[1., 2., 3.],
[4., 5., 6.]])

将python数据传入matlab函数

1
2
3
4
5
6
7
8
9
10
11
>>> aa=np.arange(9).reshape(3,3)
>>> bb=matlab.int8(aa.tolist())
>>> data=eng.triarea(bb)
a =
1 2 3
4 5 6
x =
3x3 int8 矩阵
0 1 2
3 4 5
6 7 8

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import matlab.engine
import numpy as np
eng=matlab.engine.start_matlab()
#得到matlab执行结果,并转化为array数据
mat=eng.getFromMat(1)
pymat=np.array(mat._data).reshape(mat.size[::-1]).T

#将array数据转化为matlab.int,并传入matlab引擎
aa=np.arange(9).reshape(3,3)
bb=matlab.int8(aa.tolist())
data=eng.triarea(bb)

#关闭matlab引擎
eng.quit()