0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

幾個(gè)Matlab編程中常用的優(yōu)化技巧

電子設(shè)計(jì) ? 來源:電子設(shè)計(jì) ? 作者:電子設(shè)計(jì) ? 2022-02-08 15:18 ? 次閱讀

作者:貓叔來源:科學(xué)計(jì)算Tech微信公眾號(hào)

用過Matlab的同學(xué)應(yīng)該都知道,Matlab的慢是出了名的,但是再慢也有優(yōu)化的方式,下面我們給出幾個(gè)Matlab編程中常用的優(yōu)化技巧。

在講優(yōu)化方法之前,首先要說的就是Matlab中用tic toc的方式來計(jì)算運(yùn)行時(shí)間,這是個(gè)常識(shí)。當(dāng)然,想統(tǒng)計(jì)具體的耗時(shí),可以用profile工具。

1. 向量化操作

這個(gè)應(yīng)該是用過Matlab的同學(xué)都清楚的一點(diǎn),Matlab中操作向量和矩陣的速度要比使用for循環(huán)的速度快很多,是因?yàn)槠涞讓诱{(diào)用了高性能線性代數(shù)庫(kù)BLAS庫(kù)和LAPACK庫(kù)。這個(gè)就不多說了。

2. 內(nèi)存預(yù)分配

在Matlab中我們可以定義一個(gè)空矩陣

mtx = [];

然后后面再給它加入一些數(shù)據(jù),而且這個(gè)矩陣大小可以隨著我們填入數(shù)據(jù)的多少而變化。像下面這個(gè)程序

tic n = 1000; mtrx = []; init = 1.0; for i = 1:n for j=1:n mtrx(i,j) = init + 1.0; end end toc

這個(gè)程序的運(yùn)行時(shí)間是多久呢?在我電腦上是0.2秒。

那這個(gè)程序有什么問題呢?就是我們沒有為這個(gè)矩陣分配一個(gè)內(nèi)存空間,而且在循環(huán)中,矩陣大小是變化的,這就導(dǎo)致每次循環(huán)時(shí)都浪費(fèi)額外的時(shí)間去尋找滿足需求的內(nèi)存空間,將改變大小后的矩陣整體移動(dòng)到這個(gè)新的內(nèi)容空間中,并釋放原來的內(nèi)存空間,這除了會(huì)影響代碼的運(yùn)行效率,還容易形成內(nèi)存碎片,讓程序越來越難找到滿足條件的內(nèi)存。

因此在循環(huán)前給矩陣預(yù)分配內(nèi)存是很一個(gè)良好的習(xí)慣,如果沒有這個(gè)習(xí)慣,你還可以通過Matlab自帶的代碼檢查器來查看是否存在類似問題。

所以,我們應(yīng)該把程序修改如下:

tic n = 1000; mtrx = zeros(n,n); init = 1.0; for i = 1:n for j=1:n mtrx(i,j) = init + 1.0; end end toc

這個(gè)程序只用了0.007秒的時(shí)間就運(yùn)行完成了,可見它們的差距有多大。

3. 按列存儲(chǔ)

Matlab中默認(rèn)是按列存儲(chǔ)的,也就是說,列向量在內(nèi)存中是連續(xù)排列的,對(duì)連續(xù)的數(shù)據(jù)做處理肯定是要快的,所以我們?cè)诙x向量時(shí)一般都會(huì)使用列向量。下面對(duì)比矩陣中對(duì)行做操作和對(duì)列做操作花費(fèi)的時(shí)間。

n = 10000; mtrx = rand(n,n); mcol = zeros(n,1); mrow = zeros(1,n); tic for i=1:n mcol(i) = sum(mtrx(:,i)); end toc

我們對(duì)矩陣中的每一列都求和,總共用了0.17秒。

tic for i=1:n mrow(i) = sum(mtrx(i,:)); end toc

再對(duì)矩陣中的每一行求和,用了0.8秒。
可以看出,對(duì)列操作比對(duì)行操作速度要快很多。

4. 數(shù)據(jù)類型

在Matlab中,數(shù)據(jù)類型默認(rèn)是double型,對(duì)使用者來說,無需太多關(guān)心數(shù)據(jù)類型當(dāng)然是省心省力的,但這也帶來了一個(gè)問題就是double型占用的內(nèi)存較多,還有可能拖慢程序的運(yùn)行速度。所以,在適當(dāng)?shù)那闆r下,我們可以把數(shù)據(jù)類型選擇為邏輯型、字符型、整型等。但這樣還需要注意的一點(diǎn)是,一個(gè)變量在改變數(shù)據(jù)類型時(shí)會(huì)消耗額外的時(shí)間,因此還不如重新建一個(gè)新變量。

高效編程的內(nèi)容就先寫這么多,后面還會(huì)繼續(xù)補(bǔ)充。下面說一個(gè)Matlab調(diào)試中斷點(diǎn)設(shè)置問題。在一個(gè)for循環(huán)中,比如for i=1:n,我們想在i=100的進(jìn)入斷點(diǎn),這個(gè)時(shí)候應(yīng)該怎么用?以前的時(shí)候我們都會(huì)這么寫。

for i=1:n if(i==100) pass end end

把斷點(diǎn)設(shè)置在pass處,但其實(shí)不用這么弄。Matlab中提供了條件斷點(diǎn)的設(shè)置方式。在循環(huán)中右鍵選擇設(shè)置條件斷點(diǎn)。

Figure 1. 條件斷點(diǎn)設(shè)置1

在下面的窗口中填入條件即可,比如i==100。

Figure 2. 條件斷點(diǎn)設(shè)置2

這樣,當(dāng)程序運(yùn)行到i==100時(shí)就會(huì)進(jìn)入斷點(diǎn),不需要自己再寫額外的語(yǔ)句。

審核編輯:何安

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • matlab
    +關(guān)注

    關(guān)注

    185

    文章

    2976

    瀏覽量

    230474
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    低壓配電柜中常用的電表有哪些?

    一、 低壓配電柜中常用的電表類型包括: 1. 電壓表 電壓表主要用于測(cè)量電壓,廣泛應(yīng)用于電力系統(tǒng)中。在低壓配電柜中,電壓表被用于測(cè)量電源電壓,其顯示范圍一般為0-1000V。電壓表可以分為直流電
    的頭像 發(fā)表于 12-25 10:50 ?107次閱讀
    低壓配電柜<b class='flag-5'>中常用</b>的電表有哪些?

    求LabVIEW程序代做,關(guān)于噪聲測(cè)量方面,需要matlab與labview混合編程,涉及優(yōu)化算法、PID控制等,可帶價(jià)聯(lián)系

    求LabVIEW程序代做,關(guān)于噪聲測(cè)量方面,需要matlab與labview混合編程,涉及優(yōu)化算法、PID控制等,可帶價(jià)聯(lián)系QQ2789223947
    發(fā)表于 12-11 17:27

    labview中常用的程序結(jié)構(gòu)有哪幾種

    和邏輯的關(guān)鍵,以下是LabVIEW中常用的幾種程序結(jié)構(gòu): 順序結(jié)構(gòu)(Sequential Structure) 順序結(jié)構(gòu)是最簡(jiǎn)單的程序結(jié)構(gòu),它按照從上到下、從左到右的順序執(zhí)
    的頭像 發(fā)表于 09-04 16:32 ?793次閱讀

    簡(jiǎn)述socket編程中的常用函數(shù)

    Socket編程是一種基于TCP/IP協(xié)議的網(wǎng)絡(luò)編程技術(shù),它允許應(yīng)用程序通過網(wǎng)絡(luò)進(jìn)行通信。在Socket編程中,有許多常用的函數(shù),它們用于創(chuàng)建、配置、連接、發(fā)送和接收數(shù)據(jù)等操作。以下是
    的頭像 發(fā)表于 08-16 10:49 ?380次閱讀

    華為設(shè)備中常用的RIP命令及其應(yīng)用

    RIP(Routing Information Protocol,路由信息協(xié)議)是一種應(yīng)用廣泛的距離矢量路由協(xié)議,尤其適用于中小型網(wǎng)絡(luò)。本文將詳細(xì)介紹在華為設(shè)備中常用的RIP命令及其應(yīng)用,以幫助網(wǎng)絡(luò)管理員和工程師更好地理解和配置RIP協(xié)議。
    的頭像 發(fā)表于 08-12 18:10 ?752次閱讀

    嵌入式系統(tǒng)中常用的五種微處理器類型

    本文介紹了嵌入式系統(tǒng)中常用的五種微處理器類型:微處理器單元(MPU)、微控制器(MCU)、數(shù)字信號(hào)處理器(DSP)、現(xiàn)場(chǎng)可編程邏輯門陣列(FPGA)和單片機(jī)(SBC)。文章詳細(xì)闡述了每種處理器的功能、優(yōu)點(diǎn)、缺點(diǎn)以及選擇建議,并列出了一些精選的微處理器產(chǎn)品,供讀者參考。
    的頭像 發(fā)表于 07-25 09:29 ?1725次閱讀

    如何使用MATLAB創(chuàng)建預(yù)測(cè)模型

    在這篇文章中,我們將討論如何使用MATLAB創(chuàng)建預(yù)測(cè)模型。MATLAB(矩陣實(shí)驗(yàn)室)是一種用于數(shù)值計(jì)算、可視化和編程的高級(jí)編程語(yǔ)言和交互式環(huán)境。它廣泛應(yīng)用于工程、科學(xué)研究和金融領(lǐng)域。
    的頭像 發(fā)表于 07-11 14:29 ?682次閱讀

    matlab預(yù)測(cè)模型有哪些

    環(huán)境,使其成為預(yù)測(cè)模型開發(fā)和實(shí)現(xiàn)的理想平臺(tái)。本文將詳細(xì)介紹MATLAB中常用的預(yù)測(cè)模型及其應(yīng)用。 線性回歸模型 線性回歸是一種簡(jiǎn)單的預(yù)測(cè)模型,用于分析兩個(gè)或多個(gè)變量之間的線性關(guān)系。在MATLAB中,可以使用 regress 、
    的頭像 發(fā)表于 07-11 14:27 ?769次閱讀

    機(jī)器視覺中常用的光源類型及優(yōu)點(diǎn)?

    中常用的光源類型及其優(yōu)點(diǎn)。 一、LED光源 優(yōu)點(diǎn) (1)高亮度:LED光源具有高亮度,能夠提供足夠的光線,使圖像更加清晰。 (2)低能耗:LED光源的能耗較低,能夠降低整個(gè)系統(tǒng)的運(yùn)行成本。 (3)長(zhǎng)壽命:LED光源的使用壽命較長(zhǎng),一
    的頭像 發(fā)表于 07-04 10:28 ?610次閱讀

    PLC常用編程語(yǔ)言有哪些

    語(yǔ)言多種多樣,每種語(yǔ)言都有其獨(dú)特的特點(diǎn)和適用場(chǎng)景。本文將詳細(xì)介紹PLC常用編程語(yǔ)言,包括梯形圖(LD)、指令表(IL)、功能模塊圖(FBD)、順序功能流程圖(SFC)以及結(jié)構(gòu)化文本(ST),并通過具體的特點(diǎn)和應(yīng)用實(shí)例,幫助讀者更好地理解和選擇適合的
    的頭像 發(fā)表于 06-14 16:58 ?1457次閱讀

    MATLAB信號(hào)處理常用函數(shù)詳解

    MATLAB是一款功能強(qiáng)大的數(shù)學(xué)軟件,尤其在信號(hào)處理領(lǐng)域,它提供了眾多的函數(shù)和工具箱,使得信號(hào)的分析、處理、仿真變得簡(jiǎn)單而高效。本文將詳細(xì)介紹MATLAB在信號(hào)處理中常用的函數(shù),并通過具體示例來闡述其應(yīng)用。
    的頭像 發(fā)表于 05-17 14:31 ?2229次閱讀

    分享幾個(gè)嵌入式中常用的GUI

    交互,完成各種操作,可提高工作效率以及用戶體驗(yàn)。接下來看一下我們開發(fā)中常用的GUI框架有哪些吧~二、開源輕量級(jí)顯示框架LVGLLVGL(LightandVersat
    的頭像 發(fā)表于 04-06 08:09 ?1591次閱讀
    分享<b class='flag-5'>幾個(gè)</b>嵌入式<b class='flag-5'>中常用</b>的GUI

    gis中常用的空間分析方法

    GIS中常用的空間分析方法 GIS(地理信息系統(tǒng))是一種用于收集、存儲(chǔ)、處理、分析和展示地理數(shù)據(jù)的技術(shù)??臻g分析是GIS的核心部分,它包括一系列方法和技術(shù),用來研究地理空間數(shù)據(jù)之間的關(guān)系和模式。本文
    的頭像 發(fā)表于 02-25 13:44 ?5614次閱讀

    編程邏輯器件的優(yōu)化過程主要是對(duì)什么進(jìn)行

    編程邏輯器件(Programmable Logic Device,簡(jiǎn)稱PLD)的優(yōu)化過程主要是對(duì)電路布局、邏輯設(shè)計(jì)、時(shí)序建模和資源利用等方面進(jìn)行優(yōu)化。下面,我將詳細(xì)介紹這些方面的優(yōu)化
    的頭像 發(fā)表于 02-01 16:41 ?705次閱讀

    電子電路中常用的元器件

    電容器、三極管和二極管是電子電路中常用的元器件,它們可以搭配使用以實(shí)現(xiàn)各種功能。下面將詳細(xì)介紹它們的搭配使用方法和使用規(guī)范。 一、電容器 電容器是一種能夠存儲(chǔ)電荷的被動(dòng)元件,主要用于儲(chǔ)存
    的頭像 發(fā)表于 12-29 14:47 ?830次閱讀