最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python與Matlab混合編程的實(shí)現(xiàn)案例

 更新時(shí)間:2023年01月28日 08:59:08   作者:傾城一少  
本文主要介紹了Python與Matlab混合編程的實(shí)現(xiàn)案例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

因?yàn)轫?xiàng)目需要,需要批處理很多Matlab的.m文件,從每個(gè)文件中提取結(jié)果合并到一個(gè)文件中。 很明顯,如果手工統(tǒng)計(jì),幾百個(gè)文件會(huì)累死的。 因此立即想到了Python在批處理方面的優(yōu)勢,因此就在網(wǎng)上找了相關(guān)資料,實(shí)現(xiàn)了想要的功能,這里簡單記錄一下。

一、環(huán)境準(zhǔn)備

首先電腦上要有Matlab,而且不能太老,比如Matlab 7.0可能就不行。 在電腦Matlab的安裝目錄下,依次找到MATLAB\R2015b\extern\engines\python,例如我電腦上的路徑是D:\Program Files\MATLAB\R2015b\extern\engines\python。 在這個(gè)目錄下有個(gè)setup.py。在命令行中安裝這個(gè)腳本,正常就可以成功了。

然后就可以在Python中import了,這個(gè)包的名字就叫”matlab”。

二、簡單示例

下面的代碼簡單演示了在Python中調(diào)用了Matlab的sqrt()函數(shù)并返回結(jié)果。說明了調(diào)用的主要步驟,同時(shí)加入了計(jì)時(shí)的代碼,記錄每個(gè)過程的耗時(shí)。

# coding=utf-8
import matlab.engine
import time
 
# 第一步,初始化Matlab的Runtime
t1 = time.time()
eng = matlab.engine.start_matlab()
t2 = time.time()
 
# 第二步,調(diào)用Matlab函數(shù)
res1 = eng.sqrt(16.0)
t3 = time.time()
 
res2 = eng.abs(-8.6)
t4 = time.time()
 
# 第三步,退出Runtime
eng.quit()
t5 = time.time()
 
print type(res1), res1
print type(res2), res2
print "Initial time", t2 - t1
print "Running time1", t3 - t2
print "Running time2", t4 - t3
print "Quit time", t5 - t4

可以看到,程序輸出了和在Matlab中調(diào)用函數(shù)一樣的格式ans=…。同時(shí)可以發(fā)現(xiàn),與C# & Matlab混合編程類似,程序運(yùn)行最耗時(shí)的就是Runtime的初始化。 不同的運(yùn)算耗時(shí)的差別與初始化耗時(shí)相比可以忽略不計(jì)。同時(shí)Runtime只要初始化一次,第二次調(diào)用函數(shù)時(shí)就不需要再初始化了。這些都和C#的接口是一樣的。

三、更復(fù)雜的示例

很明顯,我們好不容易用Python調(diào)Matlab肯定不是想簡單做個(gè)開方、取絕對(duì)值的運(yùn)算的,要不然直接Python就可以實(shí)現(xiàn),何必殺雞焉用牛刀。 比如調(diào)用我們自己編寫的.m文件中的函數(shù)等等。下

1.調(diào)用.m文件

首先新建一個(gè)m文件,并起名為triangle.m,用于計(jì)算三角形面積。如下。

并且將這個(gè)m文件放在py文件同一路徑下,然后在Python中可以這樣調(diào)用。

# coding=utf-8
import matlab.engine
 
eng = matlab.engine.start_matlab()
eng.triangle(nargout=0)
eng.quit()

結(jié)果如下。

控制臺(tái)中像Matlab一樣輸出了結(jié)果。 但有幾點(diǎn)需要注意。首先nargout=0的含義是表示返回值為空。盡管控制臺(tái)打印出了結(jié)果,但并不會(huì)返回給Python。 如果沒有這個(gè)參數(shù),程序會(huì)報(bào)錯(cuò)。同時(shí)m文件必須和腳本文件在同一目錄下才能運(yùn)行。而eng后面的內(nèi)容就是m文件的名字。

2.調(diào)用自定義函數(shù)

把之前的m文件少做修改,編程Matlab函數(shù),如下。

Python調(diào)用代碼如下:

# coding=utf-8
import matlab.engine
 
eng = matlab.engine.start_matlab()
ans = eng.triangle(2.3, 9.1)
print ans
eng.quit()

這里用變量ans接收了返回值,下一步就可以繼續(xù)用于其它操作了。 這里也有需要注意的地方。需要記住的是eng后面的依然是m文件的名字而不是函數(shù)的名字。 這里就涉及到Matlab中函數(shù)的命名規(guī)范問題了。一般情況下函數(shù)名與m文件名保持一致。 但如果不一致,在Python中經(jīng)過測試也可以,但最好保持一致。

對(duì)于多返回值函數(shù),可以在Matlab中組成一個(gè)矩陣,直接返回這個(gè)矩陣,然后在Python中再解析。 或者指定返回值個(gè)數(shù)。

不過需要注意的是,例如Matlab返回了一個(gè)a = [[1 2 3]]的矩陣,但直接獲取a[0]是錯(cuò)的。因?yàn)镸atlab返回的是一個(gè)二維矩陣,所以矩陣其實(shí)是1×3。 所以應(yīng)該按照行列的方式讀取,寫成a[0][0]。

在Python中創(chuàng)建Matlab矩陣也很簡單。代碼如下:

# coding=utf-8
import matlab.engine
 
A = matlab.int8([1, 2, 3, 4, 5])
print type(A), A.size, A

輸出結(jié)果如下:

3.繪圖測試

代碼如下。

#coding=utf-8
import matlab.engine
 
 
def plot_test(eng):
    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--')")
 
 
eng = matlab.engine.start_matlab()
plot_test(eng)
# 需要讓程序在這暫停,類似于C++里的system('pause'),不然Figure一閃而過
# 按任意鍵退出
raw_input()
eng.quit()

運(yùn)行結(jié)果如下。

首先,對(duì)于一些簡單的命令,如max、min、power、sqrt等,我們直接可以eng.xxx()來完成。 但對(duì)于如繪圖等稍微復(fù)雜的命令,我們就可以使用eng.eval()函數(shù)來完成。 其中參數(shù)是我們拼接的需要執(zhí)行的字符串,如“plot(data(:,1),’ro-‘)”等。這樣程序在運(yùn)行時(shí)就會(huì)調(diào)用Matlab執(zhí)行這一行語句。 所以其實(shí)同理,我們完全可以把之前的例子寫成eng.eval("sqrt(16.0)",nargout=0),控制臺(tái)會(huì)輸出結(jié)果4。 或者全部用eval()函數(shù)來寫Matlab命令,不與Python進(jìn)行數(shù)據(jù)交互,只是調(diào)用Matlab。 在使用eval()時(shí)需要注意返回值的問題。如果沒有返回值,別忘了加上一句nargout=0。

以上只是很少一部分混合編程的相關(guān)知識(shí),只是項(xiàng)目中用到的部分。其實(shí)還有很多東西可以學(xué)習(xí),更多有關(guān)Python Matlab混合編程的說明可以參考官方文檔。 看到網(wǎng)上還有一種Matlab的調(diào)用方式,直接pip install mlab,然后直接import mlab就可以了,但是沒有嘗試,因此這里不多介紹了。

四、項(xiàng)目相關(guān)

最后簡單說一下項(xiàng)目相關(guān)的東西。項(xiàng)目中的需求是,有很多.m文件分布在許多文件夾中,需要獲取到某一路徑下的全部m文件。 然后獲取m文件中矩陣的相關(guān)統(tǒng)計(jì)值。最后再將各個(gè)m文件的統(tǒng)計(jì)結(jié)果匯總在一個(gè)m文件中。 因此使用了Python的os模塊遍歷文件夾,獲取所有m文件的路徑,然后根據(jù)指定的規(guī)則對(duì)m文件進(jìn)行重寫,并輸出成新的m文件放在腳本目錄下。 最后通過Python調(diào)用Matlab運(yùn)行m腳本,輸出結(jié)果到Python中,Python集中匯總輸出。

這里的關(guān)鍵點(diǎn)之一是由于各個(gè)m文件的文件名是不同的,因此eng.xxx()是沒有辦法在運(yùn)行前寫死的。 必須根據(jù)讀取的文件名動(dòng)態(tài)生成Python語句然后運(yùn)行。這對(duì)于傳統(tǒng)編譯型語言可能很難實(shí)現(xiàn),但對(duì)Python解釋型語言很容易實(shí)現(xiàn)。 在Python中有exec()函數(shù)可以實(shí)現(xiàn)這個(gè)需求,其中參數(shù)是需要執(zhí)行的代碼字符串。 項(xiàng)目部分代碼如下:

def joinCode(new_names):
    codes = []
    for item in new_names:
        codes.append("res = eng." + item + "()")
    return codes
 
 
def execMatlab(codes, exs, ex2s, eys, ey2s):
    eng = matlab.engine.start_matlab()
    for code in codes:
        exec code
        exs.append(res[0][0])
        ex2s.append(res[0][1])
        eys.append(res[0][2])
        ey2s.append(res[0][3])
    eng.quit()

項(xiàng)目中首先調(diào)用joinCode()函數(shù)根據(jù)new_names列表動(dòng)態(tài)生成代碼字符串存放在codes中。 然后調(diào)用execMatlab()函數(shù)依次執(zhí)行每條語句。這里的res看似并沒有在代碼中定義,而且在IDE中確實(shí)也會(huì)報(bào)錯(cuò),說未定義。 但是其實(shí)它是在動(dòng)態(tài)執(zhí)行的代碼中定義的,因此執(zhí)行時(shí)是不會(huì)報(bào)錯(cuò)的。

順帶提一下,在Python中,執(zhí)行系統(tǒng)命令調(diào)用的是os.system()函數(shù)。參數(shù)就是需要執(zhí)行的代碼。 而且這個(gè)函數(shù)對(duì)于Windows和Linux都適用,是跨平臺(tái)的。類似于os.walk()等內(nèi)置函數(shù),都是抽象后的與系統(tǒng)無關(guān)的函數(shù)。 下面的代碼是用于執(zhí)行動(dòng)態(tài)系統(tǒng)代碼的例子:

def exeCMD(cmds):
    for i in range(cmds.__len__()):
        print "\n---------------------------------------------------------------------"
        print "Executing:", cmds[i]
        os.system(cmds[i])
        print "---------------------------------------------------------------------\n"
        print "**********", ((i + 1) * 1.0 / len(cmds)) * 100, "% finished.**********"
    print "**********100 % finished.**********"

最后,可以import platform包,可以獲取系統(tǒng)類型。如下函數(shù)是判斷當(dāng)前是什么系統(tǒng),從而自動(dòng)決定是使用哪種路徑分隔符。

def getOSType():
    sysstr = platform.system()
    if (sysstr == "Windows"):
        separator = "\\"
    elif (sysstr == "Linux"):
        separator = "/"
    return separator

到此這篇關(guān)于Python與Matlab混合編程的實(shí)現(xiàn)案例的文章就介紹到這了,更多相關(guān)Python與Matlab混合編程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python將列表中的元素轉(zhuǎn)化為數(shù)字并排序的示例

    Python將列表中的元素轉(zhuǎn)化為數(shù)字并排序的示例

    今天小編就為大家分享一篇Python將列表中的元素轉(zhuǎn)化為數(shù)字并排序的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • python之 matplotlib和pandas繪圖教程

    python之 matplotlib和pandas繪圖教程

    這篇文章主要介紹了python之 matplotlib和pandas繪圖教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • Python qqbot 實(shí)現(xiàn)qq機(jī)器人的示例代碼

    Python qqbot 實(shí)現(xiàn)qq機(jī)器人的示例代碼

    這篇文章主要介紹了Python qqbot 實(shí)現(xiàn)qq機(jī)器人的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • keras讀取訓(xùn)練好的模型參數(shù)并把參數(shù)賦值給其它模型詳解

    keras讀取訓(xùn)練好的模型參數(shù)并把參數(shù)賦值給其它模型詳解

    這篇文章主要介紹了keras讀取訓(xùn)練好的模型參數(shù)并把參數(shù)賦值給其它模型詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • python發(fā)qq消息轟炸虐狗好友思路詳解(完整代碼)

    python發(fā)qq消息轟炸虐狗好友思路詳解(完整代碼)

    因?yàn)槲业哪硞€(gè)好友在情人節(jié)的時(shí)候秀恩愛,所以我靈光一閃制作了qq消息轟炸并記錄了下來。本文給大家分享python發(fā)qq消息轟炸虐狗好友思路詳解,感興趣的朋友一起看看吧
    2020-02-02
  • 深入理解Django中內(nèi)置的用戶認(rèn)證

    深入理解Django中內(nèi)置的用戶認(rèn)證

    Django自帶一個(gè)用戶認(rèn)證系統(tǒng),這個(gè)系統(tǒng)處理用戶帳戶、組、權(quán)限和基于cookie的會(huì)話,下面這篇文章就來給大家介紹了關(guān)于Django中內(nèi)置的用戶認(rèn)證的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。
    2017-10-10
  • Python找出微信上刪除你好友的人腳本寫法

    Python找出微信上刪除你好友的人腳本寫法

    在本篇文章中我們給大家分享了Python找出微信上刪除你好友的人腳本寫法以及相關(guān)實(shí)例代碼,有需要的朋友們參考下。
    2018-11-11
  • 超詳細(xì)注釋之OpenCV操作圖像平移轉(zhuǎn)換

    超詳細(xì)注釋之OpenCV操作圖像平移轉(zhuǎn)換

    這篇文章主要介紹了OpenCV操作圖像平移轉(zhuǎn)換,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • python利用小波分析進(jìn)行特征提取的實(shí)例

    python利用小波分析進(jìn)行特征提取的實(shí)例

    今天小編就為大家分享一篇python利用小波分析進(jìn)行特征提取的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • Python?類中定義多個(gè)構(gòu)造器方法重載與泛方法

    Python?類中定義多個(gè)構(gòu)造器方法重載與泛方法

    這篇文章主要為大家介紹了Python?類中定義多個(gè)構(gòu)造器方法重載與泛方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03

最新評(píng)論

华容县| 宁德市| 平武县| 大理市| 铅山县| 晴隆县| 井冈山市| 洛南县| 科技| 上栗县| 库车县| 安图县| 崇明县| 肇东市| 北票市| 汤阴县| 绥芬河市| 奉化市| 安吉县| 来凤县| 斗六市| 乌鲁木齐县| 滁州市| 遂宁市| 东丰县| 千阳县| 鄢陵县| 榆林市| 巫溪县| 尉犁县| 屏南县| 疏勒县| 古交市| 五河县| 虞城县| 赣州市| 泸西县| 阜宁县| 弥渡县| 乐至县| 错那县|