在作實驗的時候,須要用到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的值。