为了方便在Python中调用MATLAB,MATLAB提供了一组面向Python的MATLAB引擎API。该引擎API提供了一个名为MATLAB的Python包,利用它,可以从Python中调用MATLAB函数。安装该包以后,可以在当前或以后的Python中调用MATLAB引擎。注意,MATLAB和Python之间有一定的版本对应关系,本书主要基于R2023b介绍,对应的Python版本是3.9, 3.10和3.11。[大谦MATLAB,dqmatlab点com]
MATLAB包的安装、导入和退出
在Python中启动MATLAB引擎,必须首先为Python包安装引擎API。MATLAB提供一个标准的Python安装文件setup.py来创建和安装该引擎。使用同样的setup.py命令,可以在Windows, Mac或Linux系统上安装该引擎。
安装MATLAB包,要求MATLAB版本R2014b以上,需要将包含Python解释器的目录添加到路径中。在MATLAB命令窗口键入matlabroot,复制matlabroot返回的路径。
在Windows系统上,以管理员模式打开PowerShell命令提示符窗口,进入到setup.py所在目录,然后输入下面的语句执行安装。
cd "matlabroot\extern\Engines\python"
python setup.py install
在Mac或Linux系统上
cd "matlabroot/extern/Engines/python"
python setup.py install
其中,matlabroot为MATLAB的安装路径。注意上面斜杠的方向是不同的。
安装完成后,就可以开始使用该引擎。在Python IDLE Shell窗口输入下面的语句,导入MATLAB引擎。
>>> import matlab.engine
继续输入下面的语句启动引擎。
>>> eng=matlab.engine.start_matlab()
可以运行多个引擎。
>>> eng1=matlab.engine.start_matlab()
>>> eng2=matlab.engine.start_matlab()
处理完成后,调用exit或quit函数退出。
>>> eng.quit()
如果退出Python时,引擎仍然运行,Python会自动停止引擎和它的MATLAB进程。
从Python调用MATLAB函数
安装MATLAB引擎API以后,可以直接调用任何MATLAB函数,并将结果返回给Python。例如,下面用引擎调用magic函数,生成3阶魔方矩阵。
>>> import matlab.engine
>>> eng=matlab.engine.start_matlab()
>>> tf=eng.magic(3)
>>> print(tf)
[[8.0,1.0,6.0],[3.0,5.0,7.0],[4.0,9.0,2.0]]
返回3阶魔方矩阵。
从引擎调用函数时,默认时引擎返回单个输出变量。如果已经知道函数返回多个变量,使用nargout变量指定输出变量的个数。
下面用eig函数求矩阵的特征值和特征向量。设置nargout变量,从eig函数返回2个输出变量,分别保存特征值矩阵和特征向量矩阵。
>>> import matlab.engine
>>> eng=matlab.engine.start_matlab()
>>> A=matlab.double([[1,2,0],[2,5,-1],[4,10,-1]])
>>> t=eng.eig(A,nargout=2)
>>> print(t)
(matlab.double([[-0.24401693585629244,-0.9106836025229589,0.4472135954999575],[-0.333333333333333,0.3333333333333331,3.0337068460183253e-16],[-0.9106836025229591,-0.24401693585629367,0.8944271909999162]]), matlab.double([[3.7320508075688745,0.0,0.0],[0.0,0.2679491924311226,0.0],[0.0,0.0,0.999999
9999999999]]))
如果函数没有返回变量,将nargout设置为0。下面从Python打开MATLAB帮助浏览器。
>>> import matlab.engine
>>> eng=matlab.engine.start_matlab()
>>> eng.doc(nargout=0)
MATLAB的doc函数打开浏览器,但是不返回输出变量。如果不指定nargout=0,引擎将抛出一个错误。
同时按下Ctrl和C键,停止MATLAB函数的执行。控制权交给Python。
在函数结束前停止执行,调用future.cancel()。