[python][matlab]使用python調用matlab程序

問題引入

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

相關文章
相關標籤/搜索