Python调用MATLAB

为了方便在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所在目录,然后输入下面的语句执行安装。

code.python
cd "matlabroot\extern\Engines\python"
python setup.py install

在Mac或Linux系统上

code.python
cd "matlabroot/extern/Engines/python"
python setup.py install

其中,matlabroot为MATLAB的安装路径。注意上面斜杠的方向是不同的。

安装完成后,就可以开始使用该引擎。在Python IDLE Shell窗口输入下面的语句,导入MATLAB引擎。

code.python
>>> import matlab.engine

继续输入下面的语句启动引擎。

code.python
>>> eng=matlab.engine.start_matlab()

可以运行多个引擎。

code.python
>>> eng1=matlab.engine.start_matlab()
>>> eng2=matlab.engine.start_matlab()

处理完成后,调用exit或quit函数退出。

code.python
>>> eng.quit()

如果退出Python时,引擎仍然运行,Python会自动停止引擎和它的MATLAB进程。

从Python调用MATLAB函数

安装MATLAB引擎API以后,可以直接调用任何MATLAB函数,并将结果返回给Python。例如,下面用引擎调用magic函数,生成3阶魔方矩阵。

code.python
>>> 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个输出变量,分别保存特征值矩阵和特征向量矩阵。

code.python
>>> 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帮助浏览器。

code.python
>>> import matlab.engine
>>> eng=matlab.engine.start_matlab()
>>> eng.doc(nargout=0)

MATLAB的doc函数打开浏览器,但是不返回输出变量。如果不指定nargout=0,引擎将抛出一个错误。

同时按下Ctrl和C键,停止MATLAB函数的执行。控制权交给Python。

在函数结束前停止执行,调用future.cancel()。