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