天天看點

《MATLAB圖像處理375例》——1.5 數組與矩陣

本節書摘來自異步社群《matlab圖像處理375例》一書中的第1章,第1.5節,作者:matlab技術聯盟著,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

matlab圖像處理375例

數值數組(簡稱為數組)是matlab中最重要的一種内建資料類型,是matlab軟體定義的運算規則,其目的是為了資料管理友善、操作簡單、指令形式自然和執行計算的有效。

1.5.1 數組的建立與操作

行數組:n個元素排成一行,又稱為行向量。

列數組:m個元素排成一列,又稱為列向量。

用方括号[ ]建立一維數組就是将整個數組放在方括号裡,行數組元素用空格或逗号分隔,列數組元素用分号分隔,标點符号一定要在英文狀态下輸入。

【例1-3】建立數組示例。

運作結果如下。

【例1-4】通路數組示例。

【例1-5】對一子數組指派。

1.用冒号建立一維數組

在matlab中,通過冒号建立一維數組的方法如下。

其中,a是數組x中的第一個元素,b不一定是數組x的最後一個元素。預設inc = 1。

【例1-6】用冒号建立一維數組示例。

2.用logspace()函數建立一維數組

(1)x = logspace (a,b):建立行向量x,第一個元素為10a,最後一個元素為10b,形成總數為50個元素的等比數列。

(2)x = logspace (a,b,n):建立行向量x,第一個元素為10a,最後一個元素為10b,形成總數為n個元素的等比數列。

【例1-7】logspace()函數建立一維數組示例。

3.用linspace()函數建立一維數組

(1)x = linspace (a,b) :建立行向量x,第一個元素為a,最後一個元素為b,形成總數為100個元素的等比數列。

(2)x = linspace (a,b,n) :建立行向量x,第一個元素為a,最後一個元素為b,形成總數為n個元素的等比數列。

【例1-8】用linspace()函數建立一維數組示例。

1.5.2 常見的數組運算

1.數組的算數運算

兩個一維數組之間進行運算的要求如下。

(1)兩個數組都為行數組(或都為列數組)。

(2)數組元素個數相同。

表1-2揭示了數組常用的運算格式。

《MATLAB圖像處理375例》——1.5 數組與矩陣

【例1-9】數組加減法示例。

【例1-10】數組乘法示例。

運作結果如下:

【例1-11】數組除法示例。

【例1-12】數組乘方示例。

通過函數dot可以實作數組的點積運算,該函數調用方法如下。

【例1-13】數組點積示例。

2.數組的關系運算

matlab中兩個數之間的關系通常有6種描述:小于(<)、大于(>)、等于(==)、小于等于(<=)、大于等于(>=)和不等于(~=)。matlab 在比較兩個元素大小時,如果表達式為真,就傳回結果1,否則傳回0。

【例1-14】數組的關系運算示例。

1.5.3 矩陣的表示

matlab的強大功能之一展現在能直接處理向量或矩陣。當然首要任務是輸入待處理的向量或矩陣。

對于數組的建立有如下4種方法。

(1)直接輸入法。

(2)載入外部資料檔案。

(3)利用matlab内置函數建立矩陣。

(4)利用m檔案建立和儲存數組。

下面将進行介紹。

1.直接輸入法

最簡單的建立矩陣的方法是從鍵盤直接輸入矩陣的元素——将矩陣的元素用方括号括起來,按矩陣行的順序輸入各元素,同一行的各元素之間用空格或逗号分隔,不同行的元素之間用分号分隔。如果隻輸入一行,就形成一個數組(又稱作向量)。

矩陣或數組中的元素可以是任何matlab表達式,可以是實數,也可以是複數。在此方法下建立矩陣需要注意以下規則。

(1)矩陣元素必須在“[ ]”内。

(2)矩陣的同行元素之間用空格(或“,”)隔開。

(3)矩陣的行與行之間用“;”(或回車符)隔開。

【例1-15】用兩種直接輸入的方法來建立矩陣。

2.載入外部資料檔案

在matlab中,load函數用于載入生成的包含矩陣的二進制檔案,或者讀取包含數值資料的文本檔案。

文本檔案中的數字應排列成矩形,每行隻能包含矩陣的一行元素,元素與元素之間用空格分隔,各行元素的個數必須相等。

例如,用windows自帶的“記事本”或用matlab的文本調試編輯器建立一個包含下列數字的文本檔案。

把該檔案命名為data.txt,并儲存在matlab的目錄下。若需讀取該檔案,可在指令行視窗中輸入:

系統将讀取該檔案并建立一個變量data,包含上面的這個矩陣。在matlab工作空間中可以檢視這個變量。

【例1-16】讀取資料檔案trees。

運作結果如圖1-16所示。

《MATLAB圖像處理375例》——1.5 數組與矩陣

讀取資料檔案trees,在工作空間會産生數組x,可以打開檢視、編輯該數組。

3.利用matlab内置函數建立矩陣

在matlab中,系統内置特殊函數可以用于建立矩陣,通過這些函數,可以很友善地得到想要的特殊矩陣。系統内置建立矩陣的特殊函數,如表1-3所示。

《MATLAB圖像處理375例》——1.5 數組與矩陣

【例1-17】利用幾種系統内置特殊函數來建立矩陣。

4.利用m檔案建立和儲存矩陣

此方法需要用matlab自帶的文本編輯調試器或其他文本編輯器來建立一個檔案,代碼和在matlab指令行視窗中輸入的指令一樣即可,然後以.m格式儲存該檔案。

【例1-18】把輸入的内容以純文字方式存盤(設檔案名為matrix.m)。

在matlab指令行視窗中輸入matrix:

運作該m檔案,就會自動建立一個名為matrix的矩陣,以供日後使用。

1.5.4 尋訪矩陣

在matlab中,矩陣尋訪主要有下标尋訪、單元素尋訪和多元素尋訪。

1.通路下标元素

matlab中的矩陣下标表示法與數學表示法相同,使用“雙下标”,即分别表示行與列,矩陣中的元素都有對應的“第幾行,第幾列”。

除了雙下标表示法,matlab還提供了一種線性下标表示法,又稱“單下标”法,使用線性下标時,系統預設矩陣的所有元素按照列從上到下、行從左到右排成一列,隻需要使用一個下标索引就可以定位矩陣中的任何一個元素。

在matlab還提供了使用者下标計算函數:sub2ind用于雙下标計算單下标,ind2sub用于單下标計算雙下标,以友善不同下标之間的轉換。

【例1-19】利用雙下标提取矩陣元素。

【例1-20】建立一個矩陣,用單、雙下标進行相應元素的通路,并将雙下标計算單下标。

2.通路單元素

matlab中,必須指定兩個參數,即其所在行數和列數,才能通路一個矩陣中的單個元素。例如,通路矩陣m中的任何一個單元素。

對矩陣的單元素進行通路。

【例1-21】對矩陣m進行單元素尋訪。

3.通路多元素

矩陣多元素的尋訪,包括尋訪該矩陣的某一行或某一列的若幹元素,通路整行、整列元素,通路若幹行或若幹列的元素以及通路矩陣所有元素等。例如:

(1)a(e1:e2:e3)表示取數組或矩陣a的第e1元素開始每隔e2步長一直到e3的所有元素

(2)a ([mnl])表示取數組或矩陣a中的第(m, n, l)個元素。

(3)a (:,j)表示取a矩陣的第j列全部元素。

(4)a (i,:)表示a矩陣第i行的全部元素。

(5)a (i:i+m,:)表示取a矩陣第i~i+m行的全部元素。

(6)a (:,k:k+m)表示取a矩陣第k~k+m列的全部元素。

(7)a (i:i+m,k:k+m)表示取a矩陣第i~i+m行内,并在第k~k+m列中的所有元素。

還可以利用一般向量和end運算符來表示矩陣下标,進而獲得子矩陣。end表示某一維的末尾元素下标。

【例1-22】對建立的矩陣進行多元素通路。

1.5.5 矩陣的拼接

兩個或者兩個以上的單個矩陣,按一定的方向進行連接配接,生成新的矩陣就是矩陣的拼接。矩陣的拼接就是一種建立矩陣的特殊方法,差別在于基礎元素是原始矩陣,目标是新的合并矩陣。

矩陣的拼接有按照水準方向拼接和按照垂直方向拼接兩種。例如,對矩陣a和b進行拼接。

【例1-23】把3階魔術矩陣和3階機關矩陣在水準方向上拼接成為一個新的矩陣,垂直方向上拼接成為一個新的矩陣。

矩陣拼接時,必須滿足原始矩陣維數對應,如果不滿足條件,那麼拼接不會成功,即出錯。

【例1-24】非對應矩陣的拼接。

運作的結果将會出錯。

錯誤: 表達式或語句不完整或不正确。

在matlab中,除了使用矩陣拼接符[],還可以使用矩陣拼接函數執行。

(1)cat函數用于按指定的方向連接配接矩陣。其調用格式為:

按照dim指定的方向連接配接矩陣a與b,構造出矩陣c。其中,dim用于指定連接配接方向。

a1, a2, a3, a4, ...表示被連接配接的多個矩陣。

(2)repmat函數用于通過輸入矩陣的備份拼接出一個大矩陣。其調用格式為:

rempat函數建立一個大矩陣b,b是由矩陣a的備份拼接而成的,縱向擺m個備份,橫向擺n個備份,b中總共包含m×n個a。a為被用來進行複制的矩陣,m為縱向上複制a的次數,n為橫向上複制a的次數。

repmat函數生成一個多元(m×n×p__×...)數組b,b由矩陣a的m×n×p__×...個備份在多個方向拼接而成。

當a為标量時,生成一個m×n矩陣(矩陣由指定資料類型的a的值組成)。對于某些值,使用其他函數也可以獲得同樣的結果。下面是某些值用不同函數得到同樣結果的例子。

rempat(nan,m,n)等價于nan(m,n)。

rempat(single(inf),m,n)等價于inf(m,n,'single')。

rempat(int8(0),m,n)等價于zeros(m,n,'int8')。

rempat(uint32(1),m,n)等價于ones(m,n,'uint32')。

rempat(eps,m,n)等價于eps(ones(m,n))。

(3)horzcat函數用于對矩陣進行水準拼接。其調用格式為。

水準連接配接多個矩陣a1,a2, ...,參數清單中的所有矩陣都必須有相同的行數。

horzcat函數連接配接n維數組是沿第二維(即行)的方向,是以被連接配接數組的第一維和其他維的大小必須比對。

(4)vertcat函數用于垂直連接配接矩陣。其調用格式為。

用于垂直連接配接多個矩陣a1,a2, ...,參數清單中的所有矩陣都必須有相同的列數。該函數連接配接n維數組是沿第一維(即列)的方向,是以被連接配接數組的其他維的大小必須比對。當使用c=[a1;a2; ...]垂直連接配接矩陣時,實際上是調用c= vertcat(a1,a2, ...)函數。

(5)blkdiag函數用于通過輸入的矩陣構造一個塊對角矩陣。其調用格式為:

blkdiag函數用輸入的矩陣a, b, c, d, …構造一個塊對角矩陣t。

【例1-25】利用cat函數拼接矩陣。

【例1-26】使用rempat函數複制矩陣。

【例1-27】建立9個1的矩陣。

【例1-28】利用horzcat函數建立一個3×5階的矩陣a及一個3×3階的矩陣b,然後進行水準連接配接。

【例1-29】利用vertcat函數對建立的a,b 矩陣進行垂直拼接。

【例1-30】利用blkdiag函數由矩陣a,b,c,d 構造一個塊對角矩陣t。

1.5.6 矩陣的運算

在matlab中,矩陣的運算包括+(加)、-(減)、*(乘)、/(右除)、(左除)、^(乘方)等運算。

1.矩陣的加減運算

兩個矩陣相加或減是指有相同的行和列兩矩陣的對應元素相加減。允許參與運算的兩矩陣之一是标量(常量)。标量與矩陣的所有元素分别進行加減操作。

【例1-31】由a+b和a-b 實作矩陣的加減運算。

如果a與b 的維數不相同,那麼matlab将給出錯誤資訊,例如:

matlab将給出錯誤資訊,提示使用者兩個矩陣的維數不比對。

2.矩陣的乘除運算

假定有兩個矩陣a和b,若a為m×n 矩陣,b為n×p 矩陣,則可以進行矩陣乘法的操作,即c=a*b為m×p 矩陣。矩陣乘法需要被乘矩陣的列數與乘矩陣的行數相等。

矩陣除法運算:和/,分别表示左除和右除。ab等效于a 的逆左乘b 矩陣,而b/a 等效于a 矩陣的逆右乘b 矩陣。左除和右除表示兩種不同的除數矩陣和被除數矩陣的關系。對于矩陣運算,一般_ab≠

b/a。

【例1-32】矩陣乘法示例。

當矩陣相乘不滿足被乘矩陣的列數與乘矩陣的行數相等時,例如:

則matlab将給出錯誤資訊,提示使用者兩個矩陣的維數不比對。

【例1-33】矩陣除法示例。

繼續閱讀