python调用matlab环境配置、非常详细!!!_[python][matlab]使用python调用matlab程序
問題引入
在做實(shí)驗(yàn)的時(shí)候,需要用到python和matlab工具來進(jìn)行不同的處理,比如在run神經(jīng)網(wǎng)絡(luò)的時(shí)候,需要使用pytorch框架得到網(wǎng)絡(luò)的各個(gè)參數(shù),在得到參數(shù)后需要使用matlab進(jìn)行聚類規(guī)劃。之前的做法是用python腳本耦合其聯(lián)系,兩者通信的方式是通過文件。后來發(fā)現(xiàn)matlab有針對于python的api引擎,瞬間感覺打開了新世界的大門,只需要在python中調(diào)用相關(guān)的api,就可以完成matlab的工作,再也不用一個(gè)一個(gè)復(fù)制文件了。
解決思路
首先,我安裝的是matlab R2015b,對應(yīng)的python版本為3.4,本來一開始的版本是python36,但是由于matlab2015并不兼容py36,解決方法是,一方面可以通過重新安裝高版本的matlab來解決,在高版本的matlab中已經(jīng)使用了py36的接口。另一方面可以通過修改python版本來實(shí)現(xiàn),通過anconda,可以很簡便地安裝一個(gè)新的py版本,具體的使用情況可以查看conda的幫助文檔。
1. 安裝matlab engine的py package
在matlab的官方幫助文檔里:https://ww2.mathworks.cn/help/matlab/matlab_external/install-the-matlab-engine-for-python.html,可以找到
cd "matlabroot/extern/engines/python"
python setup.py install
即切換到對應(yīng)matlab的engines目錄,然后運(yùn)行安轉(zhuǎn)腳本。需要注意的是,在安裝之前需要切換py版本到3.4,否則默認(rèn)是base的python,那樣會(huì)出現(xiàn)錯(cuò)誤。
2. 在py腳本里調(diào)用matlab engine
在matlab 文檔 里https://ww2.mathworks.cn/help/matlab/matlab_external/get-started-with-matlab-engine-for-python.html,聲明了對應(yīng)的matlab engine的啟動(dòng)和使用,其中包含了matlab數(shù)據(jù)和python數(shù)據(jù)類型的對應(yīng)關(guān)系。
在文檔https://ww2.mathworks.cn/help/matlab/matlab_external/call-matlab-functions-from-python.html里,可以更詳細(xì)地看到如何使用matlab engine:
import matlab.engine
eng = matlab.engine.start_matlab()
tf = eng.isprime(37)
print(tf) #True
上述的例子是調(diào)用了matlab'的判斷素?cái)?shù)的接口,首先需要在py文件里導(dǎo)入對應(yīng)的matlab engine包,然后調(diào)用start_matlab()來啟動(dòng)引擎,然后使用引擎來得到返回值,需要注意的是,eng下的函數(shù)調(diào)用不會(huì)有提示,需要參照matlab的接口。
上述的是有返回值的調(diào)用,當(dāng)函數(shù)具有多個(gè)返回值時(shí),那么對應(yīng)的調(diào)用方式如下:
import matlab.engine
eng = matlab.engine.start_matlab()
t = eng.gcd(100.0,80.0,nargout=3)
print(t)
注意當(dāng)使用具有多個(gè)返回值函數(shù)的時(shí)候,會(huì)返回一個(gè)python cell,對于含有矩陣的數(shù)據(jù),會(huì)轉(zhuǎn)換成python的list數(shù)據(jù)。
當(dāng)函數(shù)沒有返回值時(shí),需要使用以下的方式調(diào)用:
import matlab.engine
eng = matlab.engine.start_matlab()
eng.doc(nargout=0)
即要聲明nargout=0,此時(shí)函數(shù)不會(huì)返回任何參數(shù),如果不聲明,就會(huì)報(bào)錯(cuò)。
3. 在python腳本里調(diào)用matlab腳本
該文檔的幫助信息在https://ww2.mathworks.cn/help/matlab/matlab_external/call-user-script-and-function-from-python.html,可以看到有兩種方式的調(diào)用1.直接調(diào)用2.調(diào)用函數(shù)
如果是直接的腳本,比如在triarea.m里寫下以下內(nèi)容:
b = 5;
h = 3;
a = 0.5*(b.* h)
那么在python里就可以直接調(diào)用:
import matlab.engine
eng = matlab.engine.start_matlab()
eng.triarea(nargout=0)
就會(huì)得到py的打印輸出,a=7.5000,這是因?yàn)殡m然無返回值,但是matlab的輸出仍然會(huì)顯示在py里。當(dāng)然更方便的方法是調(diào)用函數(shù)的形式,生成以下的文件:
function a = triarea(b,h)
a = 0.5*(b.* h);
在python中執(zhí)行以下的調(diào)用:
ret = eng.triarea(1.0,5.0)
print(ret)
就會(huì)得到2.5,需要注意的是,該函數(shù)僅返回一個(gè)值,因此無需指定nargout的值。
總結(jié)
以上是生活随笔為你收集整理的python调用matlab环境配置、非常详细!!!_[python][matlab]使用python调用matlab程序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vba 抓取php网页,用VBA操作网页
- 下一篇: Python 之 线程