作者:Steve Eddins 和 Loren Shure,MathWorks
對矩陣進(jìn)行索引是從矩陣中選擇或修改部分元素的一種方式。MATLAB 有幾種索引樣式,它們不僅功能強大、靈活,而且可讀性強、表現(xiàn)力強。矩陣是 MATLAB 用來組織和分析數(shù)據(jù)的一個核心組件,索引是以可理解的方式有效操作矩陣的關(guān)鍵。
對于 MATLAB 用戶來說,索引往往與另一個術(shù)語密切相關(guān):向量化。向量化意味著使用 MATLAB 矩陣和向量運算而不是標(biāo)量運算,這通常會生成更短的代碼,更具數(shù)學(xué)表現(xiàn)力和可讀性,有時執(zhí)行速度還會更快。
對向量進(jìn)行索引
我們從向量和下標(biāo)的簡單情況開始。
v = [16 5 9 4 2 11 7 14];下標(biāo)可以是單個值:
v(3) % 提取第三個元素
ans =
9
下標(biāo)本身也可以是另一個向量。
v([1 5 6]) % 提取第一個、第五個和第六個元素
ans =
16 2 11
MATLAB 中的冒號表示法提供一種從 v 中提取一系列元素的簡單方法。
v(3:7) % 提取第三個至第七個元素
ans =
9 4 2 11 7
交換 v 的兩個“半部分”以創(chuàng)建新向量。
v2 = v([5:8 1:4]) % 提取并交換 v 的兩個“半部分”
v2 =
2 11 7 14 16 5 9 4
特殊的 end 運算符是引用 v 的最后一個元素的簡便快捷方法。
v(end) % 提取最后一個元素
ans =
14
end 運算符可用于表示一個范圍。
v(5:end) % 提取第五個到最后一個元素
ans =
2 11 7 14
您甚至可以使用 end 進(jìn)行算術(shù)運算。
v(2:end-1) % 提取第二個到倒數(shù)第二個元素
ans =
5 9 4 2 11 7
將冒號運算符和 end 結(jié)合使用可以實現(xiàn)多種效果,例如提取每第 k 個元素或翻轉(zhuǎn)整個向量。
v(1end) % 提取所有奇數(shù)元素
ans =
16 9 2 7
v(end1) % 反轉(zhuǎn)元素的順序
ans =
14 7 11 2 4 9 5 16
通過使用等號左側(cè)的索引表達(dá)式,您可以替換向量的某些元素。
v([2 3 4]) = [10 15 20] % 替換 v 的某些元素
v =
16 10 15 20 2 11 7 14
通常,右側(cè)的元素數(shù)必須與左側(cè)的索引表達(dá)式所引用的元素數(shù)相同。然而,您始終可以在右側(cè)使用標(biāo)量。這稱為標(biāo)量擴展。
v([2 3]) = 30 % 用 30 替換第二個和第三個元素
v =
16 30 30 20 2 11 7 14
請牢記:MATLAB 使用從 1 開始的索引。在對矩陣進(jìn)行索引時,有些語言使用從 0 開始的索引。其他語言,如 MATLAB,使用從 1 開始的索引。MATLAB 使用的表示法可能與您在數(shù)學(xué)教科書中看到的相同。MATLAB 為什么使用從 1 開始的索引?MATLAB 創(chuàng)始人 Cleve Moler 對此解釋道,“這就是數(shù)學(xué)的表示方式?!?/p>
使用兩個下標(biāo)對矩陣進(jìn)行索引 現(xiàn)在考慮對矩陣進(jìn)行索引。我們將在示例中使用幻方。
A = magic(4)
A =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
通常,對矩陣進(jìn)行索引需要使用兩個下標(biāo) - 第一個下標(biāo)表示行,第二個下標(biāo)表示列。
最簡單的形式是選擇一個元素。
A(2,4) % 提取第 2 行第 4 列中的元素
ans =
8
更常見的是,其中的一個或兩個下標(biāo)可以是向量。
A(2:4,1:2)
ans =
5 11
9 7
4 14
下標(biāo)位置中的單個“:”是 1:end 的簡寫表示法,通常用于選擇整行或整列。
A(3,:) % 提取第三行
ans =
9 7 6 12
A(:,end) % 提取最后一列
ans =
13
8
12
1

有時人們對如何從矩陣中選擇分散的元素感到困惑。例如,假設(shè)您要從 A 中提取元素 (2,1)、(3,2) 和 (4,4)。

矩陣中的分散元素。
我們?nèi)绾伪硎具@種輸出?
表達(dá)式 A([2 3 4], [1 2 4]) 不會實現(xiàn)想要的效果。下圖說明雙下標(biāo)索引的工作原理。

從矩陣中提取分散的元素需要不同索引樣式,下一個主題將講述這方面內(nèi)容。
線性索引
表達(dá)式 A(14) 的作用是什么?
當(dāng)僅使用單下標(biāo)對矩陣 A 進(jìn)行索引時,MATLAB 會將 A 視為其元素排列在一個長長的列向量中(對 A 中的列逐列從上到下進(jìn)行索引),如下所示:
16
5
9
...
8
12
1
提示:MATLAB 采用列優(yōu)先 - 線性索引逐列從上到下開始進(jìn)行索引。
表達(dá)式 A(14) 只提取隱式列向量的第 14 個元素。以這種方式對只使用單下標(biāo)的矩陣進(jìn)行索引通常稱為線性索引。 右圖中每個矩陣元素的左上角均顯示線性索引。從圖中可以看出,A(14) 等同于 A(2,4)。

單下標(biāo)可以是包含多個線性索引的向量,如在以下示例中:
A([6 12 15])
ans =
11 15 12
再次考慮只提取 A 的元素 (2,1)、(3,2) 和 (4,4)。您可以使用線性索引來提取這些元素。
A([2 7 16])
ans =
5 7 1
此示例很容易理解,但一般情況下如何計算線性索引?MATLAB 提供了名為 sub2ind 的函數(shù),用于將行下標(biāo)和列下標(biāo)轉(zhuǎn)換為線性索引。您可以通過以下方式使用它來提取所需的元素:
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)用。在邏輯索引中,使用單個邏輯數(shù)組來表示矩陣下標(biāo)。
您可以使用以下邏輯數(shù)組示例:
A > 12

這些是矩陣中邏輯表達(dá)式為真的位置,在本例中是任何大于 12 的位置。 表達(dá)式 A(A > 12) 提取對應(yīng)于邏輯數(shù)組的非零值的矩陣元素。輸出始終以列向量形式出現(xiàn)。
A(A > 12)
ans =
16
14
15
13
許多以 is 開頭的 MATLAB 函數(shù)返回邏輯數(shù)組,對于邏輯索引非常有用。例如,通過在一行代碼中結(jié)合使用 isnan、邏輯索引和標(biāo)量擴展,可以將數(shù)組中的所有 NaN 元素替換為另一個值。
B(isnan(B)) = 0MATLAB 有許多返回邏輯數(shù)組的字符串?dāng)?shù)組函數(shù),例如 contains、startsWith 和 matches。您可以使用這些函數(shù)對使用邏輯索引的文本進(jìn)行操作。例如,您可以提取包含“Skylab”的所有太空計劃名稱
>> names
??
>> names(contains(names,"Skylab"))

邏輯索引與 find 函數(shù)密切相關(guān)。表達(dá)式 A(A > 5) 等效于 A(find(A > 5))。邏輯索引表達(dá)式在簡單情況下執(zhí)行速度更快,但如果您需要計算中的其他項的索引值,則可以使用 find 函數(shù)。例如,假設(shè)您要用零臨時替換 NaN 值,執(zhí)行一些計算,然后將 NaN 值放回其原始位置。在此示例中,計算是使用 filter2 進(jìn)行二維過濾。您需要使用以下表達(dá)式:
nan_locations = find(isnan(A)); A(nan_locations) = 0; A = filter2(ones(3,3), A); A(nan_locations) = NaN;我們希望本文中的這些示例能幫助您了解如何簡潔高效地表達(dá)算法。在您的 MATLAB 編程中使用這些方法和相關(guān)函數(shù)使您能夠創(chuàng)建簡潔、可讀和向量化的代碼。
-
matlab
+關(guān)注
關(guān)注
189文章
3012瀏覽量
237278 -
矩陣
+關(guān)注
關(guān)注
1文章
441瀏覽量
35753 -
代碼
+關(guān)注
關(guān)注
30文章
4932瀏覽量
72848
原文標(biāo)題:MATLAB 中的矩陣索引
文章出處:【微信號:MATLAB,微信公眾號:MATLAB】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄

MATLAB中的矩陣索引
評論