matlab高效編程技巧(一)

前言

相信在地統計實驗課程結束後本科階段再接觸matlab可能不會特別多了,後面會更加偏向於專業方向上的編程語言,因此本篇博客算是對接觸matlab到現在積累的一些編程技巧做出一個總結,但是需要總結的有很多,因此將其分爲一個系列,讓大家領悟到matlab編程的基本處理對象是矩陣,而不是矩陣中具體的元素,實現真正的向量化(矩陣化)編程。

1 技巧介紹與案例實踐

1.1基於矩陣(向量)化索引

matlab矩陣的索引的基礎可以是值可以是向量a(i,j)其中的iijj都可以是向量也可以是矩陣,並且其可以是邏輯值也可以是索引的數值,舉一些實用的例子說明如下:

  • 基於邏輯矩陣索引

    代碼講解:其中a>3是一個邏輯判斷語句,會發現返回的是一個0-1的布爾型矩陣,之後對其中a>3的地方進行重新賦值爲0

  • 基於邏輯矩陣索引進階版

    其中對條件進一步約束如下,把其中a>3並且a<5的值賦爲0,其中因爲將兩個邏輯矩陣分別括號再進行相加減,邏輯矩陣會自動轉化爲數值矩陣的double類型,因此再後面需要用logical函數將其轉爲邏輯矩陣,條件更加複雜的形式依次類推。

  • 返回數值索引–find函數

    其中find函數的用法如果返回的是[m,n]基於行列號的矩陣,那麼目標值就位於索引中,第一列是行數,第二列是列數,例如第一列第一行,第二列第一行,如果返回只有一個變量,那麼就將返回按照列索引的順序序號,其先將第一列索引結束之後,再對第二列索引,因此第5個值是7,大於3符合條件

  • 基於矩陣與矩陣配對索引

    如果我們相對第二行的1,4兩列索引,第3行的1,4兩列同時索引,那麼直接將其索引(i,j)寫成矩陣的形式,那麼返回的將是其對應的值。

  • 基於(end, : )結合高級索引

    如果我們想要返回矩陣的第1列到倒數第2列的所有值則用a(:,1:end-1)
    如果我們想要返回矩陣的第2行到最後一行的所有值則用a(2:end,:)

1.2求和技巧(sum,cumsum)

  • 按行與列求和

    一般來說sum(a,1),sum(a,2)分別是對列求和,對行求和,默認情況下是對列求和,

  • 基於條件求和,求數目

    sum(a<3)是統計各列符合條件的個數,sum(a(a<3))則是對其符合條件的元素求和

  • 累積求和

    其中cumsum是累積求和,默認情況下對列累積求和,如想對行累積求和,同sum用法

1.3異常值簡單判斷

異常值主要有NaN,Inf以及把異常值刪除的操作

對其中nan(未知)值替換爲9999,isnan函數是用來判斷元素是否是nan。
將其中第4列大於99的行刪除a(a(:,4)>99,:)=[]

3總結

本次高效編程技巧主要講解的是matlab索引,求和以及異常值判斷以及去除的高效編程技巧,希望大家能夠儘量少用for循環,能不用就儘量不用,除非到了不能基於向量化編程的地步就用,從此提高代碼運行效率,自從對matlab的索引以及向量化編程掌握之後,潘老師寫的for循環越來越少,代碼的效率也越來越高。

附錄

a=[5,4,3,2;7,5,6,9;1,2,5,4];
a>3
a(a>3)=0;
a
a=[5,4,3,2;7,5,6,9;1,2,5,4];
logi=(a>3)+(a<5)-1
logi=logical(logi)
a(logi)=0
a=[5,4,3,2;7,5,6,9;1,2,5,4];
find(a>3)
[m,n]=find(a>3);
[m,n]
a=[5,4,3,2;7,5,6,9;1,2,5,4];
a([2;3],[1;4])

a=[5,4,3,2;7,5,6,9;1,2,5,4];
a(:,1:end-1)
a(2:end,:)

a=[5,4,3,2;7,5,6,9;1,2,5,4];
sum(a,1)
sum(a,2)
a
sum(a<3)
sum(a(a<3))

a=[5,4,3,2;7,5,6,9;1,2,5,4];
a
cumsum(a)
cumsum(a,2)

a=[5,4,3,2;7,5,6,9;1,2,5,nan];
a
isnan(a)
a(isnan(a))=9999

id=a(:,4)>99
a(id,:)=[]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章