1. 程式人生 > >一文讀懂如何用python呼叫matlab函式(windows環境)

一文讀懂如何用python呼叫matlab函式(windows環境)

 

第一步配置環境;

要安裝引擎 API,請在作業系統提示符下執行以下命令,其中 matlabroot 是 MATLAB 資料夾的路徑。您可能需要管理員許可權才能執行這些命令。或者,使用在非預設位置安裝用於 Python 的 MATLAB 引擎 API 中所述的非預設選項之一。

在 Windows 系統中 管理員cmd輸入:

cd "matlabroot\extern\engines\python"
python setup.py install

上述matlabroot是matlab安裝路徑,上述操作就是進入到matlab安裝路徑下的\extern\engines\python資料夾,進行python setup.py install編譯,在此之前,您需要對python環境已配置全域性變數。

第二步,熟悉python與matlab互動的API:

1. python提供的互動matlab函式:

一、在python中啟動matlab:

matlab.engine.start_matlab()

意義:啟動一個新的MATLAB程序,並返回Python的一個變數,它是一個MatlabEngine物件,用於與MATLAB過程進行通訊。

例子:

1)在python呼叫matlab指令碼(.m檔案)

matlab指令碼(.m檔案)與python檔案得放在同一個資料夾下面;

新建一個count.m的matlab檔案,簡單一點,在裡面就寫個:

1+2

再新建一個test.py的python檔案,原始碼為: 

import time
import matlab.engine
eng = matlab.engine.start_matlab()
eng.count(nargout=0)
time.sleep(10)

在當前工作目錄開啟cmd或powershell,輸入python test.py執行python指令碼。

最實用的是用python呼叫matlab函式(function):

例子:

新建一個matlab指令碼,count.m

function a = count(c,d)
a = c+d;

新建一個python指令碼,test.py

import matlab.engine
eng = matlab.engine.start_matlab()#可以為所欲為的呼叫matlab內建函式
a = eng.count(1.0,2.0) #引用自寫的指令碼
print(a)
b = eng.sqrt(4.) #引用matlab內建函式
print(b)

結果;

 

同樣,matlab啟動函式也可以加入引數:

matlab.engine.start_matlab("-desktop"); #直接開啟matlab桌面軟體
matlab.engine.start_matlab(async=True); #非同步操作matlab函式庫,
matlab.engine.start_matlab(background=True); #同步或非同步啟動MATLAB,指定為邏輯關鍵字引數。 background是async的別名,將在以後的版本中刪除。

跑一遍matlab.engine.start_matlab(async=True)瞭解一下;

例子3:

import matlab.engine
future = matlab.engine.start_matlab(async=True)
a = future.result()
a.sqrt(4.)

輸出結果如下:

將matlab的workspace的變數複製到python變數中:

import matlab.engine
eng = matlab.engine.start_matlab()
eng.eval('a = pi;',nargout=0)
mpi = eng.workspace['a']
print(mpi)

結果:

3.14159265359

二、查詢與連線matlab回話

matlab.engine.find_matlab()

意義: 在本地計算機上查詢所有共享的MATLAB®會話,並在元組中返回它們的名稱。名稱中的任何名稱都可以是matlab.engine.connect_matlab的輸入引數。如果本地計算機上沒有執行共享會話,則matlab.engine.find_matlab將返回一個空元組。

matlab.engine.connect_matlab(name=None)

意義: 連線到共享的MATLAB®會話,名稱,並返回一個MatlabEngine物件作為eng。輸入引數名稱指定已在本地計算機上執行的MATLAB會話的名稱。

也可以通過matlab會話的名字來連線:

import matlab.engine
names = matlab.engine.find_matlab()
names

在另一個powershell或cmd輸入:

import matlab.engine
eng = matlab.engine.connect_matlab('獲取到的名字編號')
eng.sqrt(4.0)

參考文獻:

[1] http://ww2.mathworks.cn/help/matlab/matlab_external/install-the-matlab-engine-for-python.html?ue

[2] http://ww2.mathworks.cn/help/matlab/matlab_external/install-matlab-engine-api-for-python-in-nondefault-locations.html

[3] http://ww2.mathworks.cn/help/matlab/matlab-engine-for-python.html

[4] http://ww2.mathworks.cn/help/matlab/apiref/matlab.engine.matlabengine-class.html