本節書摘來自異步社群《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揭示了數組常用的運算格式。

【例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所示。
讀取資料檔案trees,在工作空間會産生數組x,可以打開檢視、編輯該數組。
3.利用matlab内置函數建立矩陣
在matlab中,系統内置特殊函數可以用于建立矩陣,通過這些函數,可以很友善地得到想要的特殊矩陣。系統内置建立矩陣的特殊函數,如表1-3所示。
【例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】矩陣除法示例。