Python調用Matlab2014b引擎


用慣Python的你,是不是早已無法忍受matplotlib那丑陋無比的圖以及蛋疼無比部署依賴?

當當當當,Matlab2014b的Python Engine API現已加入豪華午餐。

上次寫了一篇文章,講用C++調用Matlab的繪圖引擎,不過呢有句話怎么說來着?人生苦短,我用Python。

這次就說一說怎么用Python調用Matlab的引擎。Python大法好,這個可比C++要容易太多了。

 

過程非常簡單,第一步是安裝,假設Matlabroot是Matlab的安裝根目錄

找到你的Matlab安裝根目錄,然后Shell進入matlabroot\extern\engines\python目錄中,執行

python setup.py install

完事了。注意,一定要用管理員權限執行。  

 

不用管理員權限的安裝方法稍微復雜一點點:        

cd "matlabroot\extern\engines\python"

python setup.py build --build-base builddir install --install-base installdir

將installdir添加到Python的包搜索路徑中,再加入到PYTHONPATH環境變量中即可。  

 

Matlab的Python引擎怎么用呢? 更簡單了:

import matlab.engine 就可以開始了。

 然后是一段測試用的Python腳本:

import matlab
import matlab.engine
import time

def basic_test(eng):
    print "Basic Testing Begin"
    print "eng.power(100,2) = %d"%eng.power(100,2)
    print "eng.max(100,200) = %d"%eng.max(100,200)
    print "eng.rand(5,5) = "
    print eng.rand(5,5)
    print "eng.randi(matlab.double([1,100]),matlab.double([3,4]))"%\
        eng.randi(matlab.double([1,100]),matlab.double([3,4]))
    print "Basic Testing Begin"

def plot_test(eng):
    print "Plot Testing Begin"
    eng.workspace['data'] =  \
        eng.randi(matlab.double([1,100]),matlab.double([30,2]))
    eng.eval("plot(data(:,1),'ro-')")
    eng.hold('on',nargout=0)
    eng.eval("plot(data(:,2),'bx--')")
    print "Plot testing end"
    

def audio_test(eng,freq,length):
    print "Audio Testing Begin"
    eval_str = "f = %d;t=%d;"%(freq,length)
    eng.eval(eval_str,nargout = 0)
    eng.eval('fs = 44100;T=1/fs;t=(0:T:t);',nargout = 0)
    eng.eval('y = sin(2 * pi * f * t);',nargout = 0)
    eng.eval('sound(y,fs);',nargout = 0)
    time.sleep(length)
    print "Audio Testing End"


def fourier_test(eng):
    pass



def demo(eng):
    basic_test(eng)
    plot_test(eng)
    audio_test(eng,680,1)



if __name__ == "__main__":
    print "Initializing Matlab Engine"
    eng = matlab.engine.start_matlab()
    print "Initializing Complete!"
    demo(eng)
    print "Exiting Matlab Engine"
    print "Press Any Key to Exit"
    raw_input();
    eng.quit()
    print "Bye-Bye"

    比起C++ Engine的API,Python Engine的最牛逼之處就是可以直接以原生的形式調用Matlab內建函數,而不是用Eval方法。當然,如果你想用也是一點問題都沒有的。同時,變量的存取再也不用和一堆mxArray以及它們的ADT打交道了,直接以字典的形式對engine.workspace進行存取即可。顯然比C++的調用方式更為科學。

 

下面的可以做一個備忘Sheet

###Matlab Engine for Python
#Call Matlab Function from Python
 
------------------------------
##Step 1: Installation
 
#Install with Administrator Privileges
	cd "matlabroot\extern\engines\python"
	python setup.py install
 
#Install without Administrator Privileges
	
	cd "matlabroot\extern\engines\python"
	python setup.py build --build-base builddir install --install-base installdir
 
	Include 'installdir' in the search path for Python packages
	Add 'installdir' to the PYTHONPATH environment variavle
 
 
------------------------------
##Step 2: Using Matlab Engine
	
	#Start and quit
	import matlab.engine
	eng = matlab.engine.start_matlab()
	eng.quit()
 
	#Call Matlab Functions:
	#Just call with form eng.xxx()
	#the function xxx should in the namespace of matlab.
 
 
	#Asynchronously Call
	import matlab.engine
	eng = matlab.engine.start_matlab()
	future = eng.sqrt(4.0,async=True)
	ret = future.result()
	print(ret)
 
 
	#WorkSpace Usage:
	import matlab.engine
	eng = matlab.engine.start_matlab()
	eng.workspace['y'] = x
	a = eng.eval('sqrt(y)')
	print(a)
 
 
	#Skills for unsupported features in python
	#eng.eval()
	import matlab.engine
	eng = matlab.engine.start_matlab()
	eng.eval("T = readtable('patients.dat');",nargout=0)
 
	#Plot With Matlab:
	import matlab.engine
	eng = matlab.engine.start_matlab()
	data = eng.peaks(100)
	eng.mesh(data)
------------------------------	


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM