• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Python调用Matlab2014b引擎

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

用惯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)
------------------------------	

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Delphi使用AcroPDFActiveX显示PDF文件发布时间:2022-07-18
下一篇:
delphi数组作为参数传值发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap