作者:Steve Eddins 和 Loren Shure,MathWorks
對(duì)矩陣進(jìn)行索引是從矩陣中選擇或修改部分元素的一種方式。MATLAB 有幾種索引樣式,它們不僅功能強(qiáng)大、靈活,而且可讀性強(qiáng)、表現(xiàn)力強(qiáng)。矩陣是 MATLAB 用來(lái)組織和分析數(shù)據(jù)的一個(gè)核心組件,索引是以可理解的方式有效操作矩陣的關(guān)鍵。
對(duì)于 MATLAB 用戶(hù)來(lái)說(shuō),索引往往與另一個(gè)術(shù)語(yǔ)密切相關(guān):向量化。向量化意味著使用 MATLAB 矩陣和向量運(yùn)算而不是標(biāo)量運(yùn)算,這通常會(huì)生成更短的代碼,更具數(shù)學(xué)表現(xiàn)力和可讀性,有時(shí)執(zhí)行速度還會(huì)更快。
對(duì)向量進(jìn)行索引
我們從向量和下標(biāo)的簡(jiǎn)單情況開(kāi)始。
v = [16 5 9 4 2 11 7 14];下標(biāo)可以是單個(gè)值:
v(3) % 提取第三個(gè)元素 ans = 9下標(biāo)本身也可以是另一個(gè)向量。
v([1 5 6]) % 提取第一個(gè)、第五個(gè)和第六個(gè)元素 ans = 16 2 11MATLAB 中的冒號(hào)表示法提供一種從 v 中提取一系列元素的簡(jiǎn)單方法。
v(3:7) % 提取第三個(gè)至第七個(gè)元素 ans = 9 4 2 11 7交換 v 的兩個(gè)“半部分”以創(chuàng)建新向量。
v2 = v([5:8 1:4]) % 提取并交換 v 的兩個(gè)“半部分” v2 = 2 11 7 14 16 5 9 4特殊的 end 運(yùn)算符是引用 v 的最后一個(gè)元素的簡(jiǎn)便快捷方法。
v(end) % 提取最后一個(gè)元素 ans = 14end 運(yùn)算符可用于表示一個(gè)范圍。
v(5:end) % 提取第五個(gè)到最后一個(gè)元素 ans = 2 11 7 14您甚至可以使用 end 進(jìn)行算術(shù)運(yùn)算。
v(2:end-1) % 提取第二個(gè)到倒數(shù)第二個(gè)元素 ans = 5 9 4 2 11 7將冒號(hào)運(yùn)算符和 end 結(jié)合使用可以實(shí)現(xiàn)多種效果,例如提取每第 k 個(gè)元素或翻轉(zhuǎn)整個(gè)向量。
v(1end) % 提取所有奇數(shù)元素 ans = 16 9 2 7 v(end1) % 反轉(zhuǎn)元素的順序 ans = 14 7 11 2 4 9 5 16通過(guò)使用等號(hào)左側(cè)的索引表達(dá)式,您可以替換向量的某些元素。
v([2 3 4]) = [10 15 20] % 替換 v 的某些元素 v = 16 10 15 20 2 11 7 14通常,右側(cè)的元素?cái)?shù)必須與左側(cè)的索引表達(dá)式所引用的元素?cái)?shù)相同。然而,您始終可以在右側(cè)使用標(biāo)量。這稱(chēng)為標(biāo)量擴(kuò)展。
v([2 3]) = 30 % 用 30 替換第二個(gè)和第三個(gè)元素 v = 16 30 30 20 2 11 7 14
請(qǐng)牢記:MATLAB 使用從 1 開(kāi)始的索引。在對(duì)矩陣進(jìn)行索引時(shí),有些語(yǔ)言使用從 0 開(kāi)始的索引。其他語(yǔ)言,如 MATLAB,使用從 1 開(kāi)始的索引。MATLAB 使用的表示法可能與您在數(shù)學(xué)教科書(shū)中看到的相同。MATLAB 為什么使用從 1 開(kāi)始的索引?MATLAB 創(chuàng)始人 Cleve Moler 對(duì)此解釋道,“這就是數(shù)學(xué)的表示方式?!?/p>
使用兩個(gè)下標(biāo)對(duì)矩陣進(jìn)行索引 現(xiàn)在考慮對(duì)矩陣進(jìn)行索引。我們將在示例中使用幻方。
A = magic(4) A = 16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1通常,對(duì)矩陣進(jìn)行索引需要使用兩個(gè)下標(biāo) - 第一個(gè)下標(biāo)表示行,第二個(gè)下標(biāo)表示列。
最簡(jiǎn)單的形式是選擇一個(gè)元素。
A(2,4) % 提取第 2 行第 4 列中的元素 ans = 8更常見(jiàn)的是,其中的一個(gè)或兩個(gè)下標(biāo)可以是向量。
A(2:4,1:2) ans = 5 11 9 7 4 14下標(biāo)位置中的單個(gè)“:”是 1:end 的簡(jiǎn)寫(xiě)表示法,通常用于選擇整行或整列。
A(3,:) % 提取第三行 ans = 9 7 6 12 A(:,end) % 提取最后一列 ans = 13 8 12 1
有時(shí)人們對(duì)如何從矩陣中選擇分散的元素感到困惑。例如,假設(shè)您要從 A 中提取元素 (2,1)、(3,2) 和 (4,4)。
矩陣中的分散元素。
我們?nèi)绾伪硎具@種輸出?
表達(dá)式 A([2 3 4], [1 2 4]) 不會(huì)實(shí)現(xiàn)想要的效果。下圖說(shuō)明雙下標(biāo)索引的工作原理。
從矩陣中提取分散的元素需要不同索引樣式,下一個(gè)主題將講述這方面內(nèi)容。
線(xiàn)性索引
表達(dá)式 A(14) 的作用是什么?
當(dāng)僅使用單下標(biāo)對(duì)矩陣 A 進(jìn)行索引時(shí),MATLAB 會(huì)將 A 視為其元素排列在一個(gè)長(zhǎng)長(zhǎng)的列向量中(對(duì) A 中的列逐列從上到下進(jìn)行索引),如下所示:
16
5
9
...
8
12
1
提示:MATLAB 采用列優(yōu)先 - 線(xiàn)性索引逐列從上到下開(kāi)始進(jìn)行索引。
表達(dá)式 A(14) 只提取隱式列向量的第 14 個(gè)元素。以這種方式對(duì)只使用單下標(biāo)的矩陣進(jìn)行索引通常稱(chēng)為線(xiàn)性索引。 右圖中每個(gè)矩陣元素的左上角均顯示線(xiàn)性索引。從圖中可以看出,A(14) 等同于 A(2,4)。
單下標(biāo)可以是包含多個(gè)線(xiàn)性索引的向量,如在以下示例中:
A([6 12 15]) ans = 11 15 12再次考慮只提取 A 的元素 (2,1)、(3,2) 和 (4,4)。您可以使用線(xiàn)性索引來(lái)提取這些元素。
A([2 7 16]) ans = 5 7 1此示例很容易理解,但一般情況下如何計(jì)算線(xiàn)性索引?MATLAB 提供了名為 sub2ind 的函數(shù),用于將行下標(biāo)和列下標(biāo)轉(zhuǎn)換為線(xiàn)性索引。您可以通過(guò)以下方式使用它來(lái)提取所需的元素:
idx = sub2ind(size(A), [2 3 4], [1 2 4]) ans = 2 7 16 A(idx) ans = 5 7 1
邏輯索引
另一種索引變體是邏輯索引,它是一種緊湊而富有表現(xiàn)力的表示法,適用于包括圖像處理在內(nèi)的許多應(yīng)用。在邏輯索引中,使用單個(gè)邏輯數(shù)組來(lái)表示矩陣下標(biāo)。
您可以使用以下邏輯數(shù)組示例:
A > 12
這些是矩陣中邏輯表達(dá)式為真的位置,在本例中是任何大于 12 的位置。 表達(dá)式 A(A > 12) 提取對(duì)應(yīng)于邏輯數(shù)組的非零值的矩陣元素。輸出始終以列向量形式出現(xiàn)。
A(A > 12) ans = 16 14 15 13許多以 is 開(kāi)頭的 MATLAB 函數(shù)返回邏輯數(shù)組,對(duì)于邏輯索引非常有用。例如,通過(guò)在一行代碼中結(jié)合使用 isnan、邏輯索引和標(biāo)量擴(kuò)展,可以將數(shù)組中的所有 NaN 元素替換為另一個(gè)值。
B(isnan(B)) = 0MATLAB 有許多返回邏輯數(shù)組的字符串?dāng)?shù)組函數(shù),例如 contains、startsWith 和 matches。您可以使用這些函數(shù)對(duì)使用邏輯索引的文本進(jìn)行操作。例如,您可以提取包含“Skylab”的所有太空計(jì)劃名稱(chēng)
>> names??
>> names(contains(names,"Skylab"))
邏輯索引與 find 函數(shù)密切相關(guān)。表達(dá)式 A(A > 5) 等效于 A(find(A > 5))。邏輯索引表達(dá)式在簡(jiǎn)單情況下執(zhí)行速度更快,但如果您需要計(jì)算中的其他項(xiàng)的索引值,則可以使用 find 函數(shù)。例如,假設(shè)您要用零臨時(shí)替換 NaN 值,執(zhí)行一些計(jì)算,然后將 NaN 值放回其原始位置。在此示例中,計(jì)算是使用 filter2 進(jìn)行二維過(guò)濾。您需要使用以下表達(dá)式:
nan_locations = find(isnan(A)); A(nan_locations) = 0; A = filter2(ones(3,3), A); A(nan_locations) = NaN;我們希望本文中的這些示例能幫助您了解如何簡(jiǎn)潔高效地表達(dá)算法。在您的 MATLAB 編程中使用這些方法和相關(guān)函數(shù)使您能夠創(chuàng)建簡(jiǎn)潔、可讀和向量化的代碼。
-
matlab
+關(guān)注
關(guān)注
185文章
2976瀏覽量
230465 -
矩陣
+關(guān)注
關(guān)注
0文章
423瀏覽量
34545 -
代碼
+關(guān)注
關(guān)注
30文章
4788瀏覽量
68603
原文標(biāo)題:MATLAB 中的矩陣索引
文章出處:【微信號(hào):MATLAB,微信公眾號(hào):MATLAB】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論