前言
相信在地統計實驗課程結束後本科階段再接觸matlab可能不會特別多了,後面會更加偏向於專業方向上的編程語言,因此本篇博客算是對接觸matlab到現在積累的一些編程技巧做出一個總結,但是需要總結的有很多,因此將其分爲一個系列,讓大家領悟到matlab編程的基本處理對象是矩陣,而不是矩陣中具體的元素,實現真正的向量化(矩陣化)編程。
1 技巧介紹與案例實踐
1.1基於矩陣(向量)化索引
matlab矩陣的索引的基礎可以是值可以是向量a(i,j)
其中的與都可以是向量也可以是矩陣,並且其可以是邏輯值也可以是索引的數值,舉一些實用的例子說明如下:
-
基於邏輯矩陣索引
代碼講解:其中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,:)=[]