Python调用Matlab代码

前言

如果在Python中想用Matlab的代码,重写固然是一个选择,但是为了节省时间,直接在Python中调用Matlab代码是更好的解决方法。幸运的是,Matlab本身就是带有Python接口的,可以很容易实现Python和Matlab的混合编程。这里简单介绍使用方法以及在使用中可能会碰到的一些问题,详细使用方法请查阅官方文档

安装

首先需要给Python安装Matlab的包,用以下命令即可:

1
2
cd $MATLAB_ROOT$/extern/engines/python
python setup.py install

使用方法

使用方法很简单,主体就是以下三行代码:

1
2
3
import matlab.engine
eng = matlab.engine.start_matlab()
y = eng.test()

第一句给Python import相应的包,第二句启动Matlab,第三局调用Matlab代码,其中当前目录下必须存在test.m文件。

常见问题及解决方法

Anaconda

在安装时候碰到一个奇怪问题,在执行下面这行代码安装的时候,

1
python setup.py install

发现安装的是系统自带Python的路径,但是which python
输出的是Anaconda的Python路径。

这样的话在执行Python代码的时候,就会出现找不到matlab.engine的错误。

解决方法可以参考stackoverflow中的这个答案

1
2
3
4
sudo update-alternatives --install /usr/bin/python python ~/anaconda3/envs/py34/bin/python 2
update-alternatives --display python
cd /usr/local/MATLAB/R2016a/extern/engines/python/
sudo python setup.py install

远程连接启动Matlab

如果是Linux远程连接跑上面的代码,可能会出现代码卡在matlab.engine.start_matlab()这一句的情况。
这是因为ssh连接时,图形相关的东西无法启动,因此导致Matlab也无法启动。给Matlab加上启动参数即可:

1
2
import matlab.engine
eng = matlab.engine.start_matlab('-nodisplay -nojvm -nosplash -nodesktop')

让Matlab启动内核,而无需加载任何跟图形界面相关的东西。

Matlab系统路径

有时候要调用的Matlab代码不一定在当前路径下,这时候只需要指定一下路径即可:

1
2
3
4
import matlab.engine
eng = matlab.engine.start_matlab('-nodisplay -nojvm -nosplash -nodesktop')
eng.addpath(r'./feature/')
y = eng.test()

比如test.m放在了feature/文件夹下,就可以用上述方法调用。

Matlab返回多参数

如果需要让Matlab函数返回多个变量,需要用输入参数nargout来指定,比如下面的例子。

1
2
3
4
import matlab.engine
eng = matlab.engine.start_matlab('-nodisplay -nojvm -nosplash -nodesktop')
eng.addpath(r'./feature/')
x_hand, x_global, y = eng.extract_features_for_alldata(test_id, seq_id, nargout=3)

关于Matlab和Python数据类型转换,参数传递等具体细节,可以到官方文档里面详细查阅。