Python的擴充介面[3] -> Matlab引擎 -> 使用 Python 調用 Matlab 程式

來源:互聯網
上載者:User

標籤:程式   targe   closed   set   none   輸出   alt   put   檔案   

Python - Matlab

目錄

  1. Python-Matlab 引擎
  2. Python-Matlab 數組
  3. Python-Matlab 基本操作
  4. Python-Matlab 調用 m 檔案

 

Matlab的官方文檔中介紹了Matlab與其餘程式設計語言之間的引擎介面,其中包括對於Python開放的引擎API,可參考官方教程,其中包括引擎安裝,基本使用,以及Python與Matlab之間的資料類型轉換及互動。

除了使用官網的Matlab引擎來驅動Matlab外,還可以使用第三方包mlab來進行串連或直接使用win32comdispatch來進行控制,但目前mlab僅支援Python 2的版本。

 

1 Python-Matlab引擎 / Pyhton-Matlab Engine

首先,需要確保Matlab及Python的配置和安裝,利用Matlab提供的setup.py檔案安裝Python的引擎包,安裝步驟及過程如下,

1. 確保安裝可用的Python和Matlab,且兩者版本對應,如32位的Matlab需對應32位的Python,同時還需查看Matlab支援的Python版本(目前2015a版支援的Python版本為2.7/3.3/3.4);

2. 添加Python目錄到環境變數(如果未添加);

3. 擷取Matlab檔案夾目錄,可通過Matlab命令列視窗輸入matlabroot命令返回;

4. 安裝引擎,Windows利用下面的命令(此處路徑可能需要修改)進行安裝,此處可能需要管理員權限運行。

1 cd C:\Program Files\MATLAB\R2015a\extern\engines\python  2 python setup.py install  3 pause  

 

2 Python-Matlab數組 / Pyhton-Matlab Array

在Python中,如果需要建立一個Matlab的數組,也可以通過Matlab引擎API來完成,主要資料類型如顯示。

下面介紹數組的基本使用,其基本使用方法與numpy類似,但是reshape()函數略有不同,

 1 import matlab.engine 2  3 # Basic usage 4 int_8 = matlab.int8([1, 2, 3, 4, 5, 6]) 5 print(int_8)    # [[1, 2, 3, 4, 5, 6]] 6 print(int_8.size)   # (1, 6) 7 int_8.reshape((2, 3))   # reshape function is different from numpy 8 print(int_8)    # [[1, 3, 5], [2, 4, 6]] 9 10 double = matlab.double([[1, 2, 3], [4, 5, 6]])11 print(double)   # [[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]]12 print(double[0])    # [1.0, 2.0, 3.0]13 print(double[1][2]) # 6.0

對於數組的切片,Matlab的array與Python的list也有所不同,官網給出的解釋在於,Matlab數組切片返回的是一個視圖,而不是像Python中返回一個淺拷貝。

1 # Slice array2 py = [[1, 2, 3], [4, 5, 6]]3 mt = matlab.int32([[1, 2, 3], [4, 5, 6]])4 py[0] = py[0][::-1]5 mt[0] = mt[0][::-1]6 # Slicing a Matlab array returns a view instead of a shallow copy7 print(py)   # [[3, 2, 1], [4, 5, 6]]8 print(mt)   # [[3, 2, 3], [4, 5, 6]]

 

3 Python-Matlab基本操作 / Pyhton-Matlab Basic Operation

Python還可以通過引擎完成對Matlab的一些基本操作與控制。

完整代碼

 1 import matlab.engine 2  3 eng = matlab.engine.start_matlab() 4  5 print(eng.sqrt(4.))     # 2.0 6 eng.plot(matlab.int32([1, 2, 3, 4]), matlab.int32([1, 2, 3, 4])) 7  8 eng.eval("hold on", nargout=0) 9 eng.eval("plot([4, 3, 2, 1], [1, 2, 3, 4])", nargout=0)10 11 eng.eval("x = 3", nargout=0)12 eng.eval("y = 41", nargout=0)13 eng.eval("z = [213, 123]", nargout=0)14 print(eng.workspace)15 print(eng.workspace[‘x‘], eng.workspace[‘z‘])16 """17   Name      Size            Bytes  Class     Attributes18 19   x         1x1                 8  double20   y         1x1                 8  double21   z         1x2                16  double22 23 3.0 [[213.0,123.0]]24 """25 26 input("Press Enter to exit.")27 eng.quit()
View Code

分段解釋

1 import matlab.engine2 3 eng = matlab.engine.start_matlab()

首先匯入需要的包並產生執行個體,此處調用sqrt()Function Compute,得到結果,還可以利用引擎執行個體調用plot函數進行畫圖,但需要注意的是,傳入的參數需要是Matlab型別參數。

1 print(eng.sqrt(4.))     # 2.02 eng.plot(matlab.int32([1, 2, 3, 4]), matlab.int32([1, 2, 3, 4]))

當我們需要執行某些Matlab命令時,可以利用eval函數對其進行輸入,下面的方法畫出了另外一條直線,其中nargout參數為設定輸出返回參數的數量,預設為1。無參數返回時需要設定為0。

 1 eng.eval("hold on", nargout=0) 2 eng.eval("plot([4, 3, 2, 1], [1, 2, 3, 4])", nargout=0) 3  4 eng.eval("x = 3", nargout=0) 5 eng.eval("y = 41", nargout=0) 6 eng.eval("z = [213, 123]", nargout=0) 7 print(eng.workspace) 8 print(eng.workspace[‘x‘], eng.workspace[‘z‘]) 9 """10   Name      Size            Bytes  Class     Attributes11 12   x         1x1                 8  double13   y         1x1                 8  double14   z         1x2                16  double15 16 3.0 [[213.0,123.0]]17 """18 19 input("Press Enter to exit.")20 eng.quit()

 

4 Python-Matlab調用m檔案 / Pyhton-Matlab Call m File

下面介紹如何使用Python調用m來進行計算並獲得返回結果,首先定義以下的m檔案,在被調用的m檔案中再調用下一個m檔案,使用的m檔案如下,

定義入口函數callentry,接收兩個參數,隨後對兩個參數分別在內部進行加和乘操作,再調用外部另一個m檔案的callsub函數進行相減操作,將返回的結果儲存在數組r中返回。

callentry.m 代碼

function [x, y, z] = callentry(a, b);x = add(a, b)y = mul(a, b)z = callsub(a, b)endfunction l = mul(m, n);l=m*n;endfunction l = add(m, n);l=m+n;end

callsub.m 代碼

function r = callsub(a, b);r = a-b;end

在Python中,運行如下代碼,

1 import matlab.engine2 3 eng = matlab.engine.start_matlab()4 print(eng.callentry(7.7, 2.1, nargout=3))5 eng.quit()

Note: 值得注意的是,此處需要設定nargout參數,當未設定時預設為1,即預設只返回1個參數,當知道Matlab返回參數的數量時,通過nargout進行設定來擷取所有需要的參數。無參數返回時請設為0

在第一次運行產生執行個體時會較慢,因為需要啟動Matlab引擎,最終得到輸出如下,可以看到,Matlab的console介面顯示的結果在Python中也會輸出,最後得到的結果是列表形式的Python資料。

x =      9.8000    y =     16.1700    z =      5.6000    r =      9.8000   16.1700    5.6000    (9.8, 16.17, 5.6)  

 

Python的擴充介面[3] -> Matlab引擎 -> 使用 Python 調用 Matlab 程式

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.