MATLAB - 多維陣列



在 MATLAB 中,多維陣列是指具有超過兩個維度的陣列。到目前為止,我們已經接觸過用行和列表示的二維陣列。因此,要訪問任何元素,您需要指定行索引和列索引。對於多維陣列,它是二維陣列的擴充套件。

多維陣列是 MATLAB 中的一個重要概念,它們用於在多個維度(例如矩陣和更高維陣列)中儲存資料。它們對於涉及數值計算、資料分析和影像處理的任務至關重要。

多維陣列的優點

以下列出了我認為多維陣列的一些優點和缺點。

  • MATLAB 專為數值計算和資料分析而設計,因此可以輕鬆建立、操作和執行多維陣列上的計算。
  • MATLAB 的底層架構針對陣列操作進行了最佳化,從而可以高效地處理大型資料集和複雜的計算。
  • 新手可以輕鬆熟悉 MATLAB 中的多維陣列概念,並在他們的工作中使用它。
  • MATLAB 強大的視覺化功能使您可以使用各種型別的圖、圖表和影像來繪製、視覺化和分析多維資料。

多維陣列的缺點

  • 多維陣列可能會使用大量的記憶體,特別是對於大型資料集而言。處理大型陣列可能會導致系統記憶體限制。
  • 成本效益和效能可能會稍微慢一些。

建立多維陣列

要建立一個多維陣列,首先讓我們建立一個二維陣列,然後將其擴充套件為多維陣列。

讓我們建立一個如下所示的 3x3 二維陣列:

A = [1 2 3; 4 5 6; 7 8 9]

命令視窗的輸出如下:

>> A = [1 2 3; 4 5 6; 7 8 9]

A =

   1     2     3
   4     5     6
   7     8     9

>> 

現在要新增第三維,您可以這樣做:

A(:,:,2) = [10 11 12; 13 14 15; 16 17 18]

因此 A(:,:, 1) 包含 [1 2 3; 4 5 6; 7 8 9],而 A(:,:,2) 包含 [10 11 12; 13 14 15; 16 17 18]

讓我們看看 MATLAB 命令視窗中的執行結果:

>> A = [1 2 3; 4 5 6; 7 8 9]

A =

   1     2     3
   4     5     6
   7     8     9

>> A(:,:,2) = [10 11 12; 13 14 15; 16 17 18]

A(:,:,1) =

   1     2     3
   4     5     6
   7     8     9


A(:,:,2) =

   10    11    12
   13    14    15
   16    17    18

>> A(:,:, 1)

ans =

   1     2     3
   4     5     6
   7     8     9

>> A(:,:,2)

ans =

   10    11    12
   13    14    15
   16    17    18

>> 

讓我們將第 3 頁和第 4 頁新增到多維陣列 A 中。

A(:,:,3) = 0
A(:,:,4) = 1

在 MATLAB 命令視窗中執行相同的操作時:

A(:,:,3) =

   0     0     0
   0     0     0
   0     0     0


A(:,:,4) =

   1     1     1
   1     1     1
   1     1     1

因此,當您在 MATLAB 命令視窗中檢查矩陣 A 時,您將得到以下結果:

>> A

A(:,:,1) =

   1     2     3
   4     5     6
   7     8     9

A(:,:,2) =

   10    11    12
   13    14    15
   16    17    18
   
A(:,:,3) =

   0     0     0
   0     0     0
   0     0     0

A(:,:,4) =

   1     1     1
   1     1     1
   1     1     1

>> 

訪問多維陣列的元素

要從多維陣列中訪問元素,請對您要訪問的行、列和頁使用整數下標。

例如,在二維陣列(矩陣)中,您將使用兩個下標:一個用於行索引,一個用於列索引。在三維陣列中,您將使用三個下標:一個用於行索引,一個用於列索引,一個用於“頁”或深度索引。

考慮到每頁的值如下所示,我們將從多維陣列 A 中訪問元素。

A(:,:,1) =  [1 2 3; 4 5 6; 7 8 9]
A(:,:,2) = [10 11 12; 13 14 15; 16 17 18]

在 MATLAB 命令視窗中執行後,陣列 A 如下所示:

>> A(:,:,1) =  [1 2 3; 4 5 6; 7 8 9]
A(:,:,2) = [10 11 12; 13 14 15; 16 17 18]

A(:,:,1) =

   1     2     3
   4     5     6
   7     8     9

A(:,:,2) =

   10    11    12
   13    14    15
   16    17    18

從上面的第 2 頁,我想訪問值:12。

為此,我們可以使用以下細節來訪問它

A(1, 3, 2)

這裡 1 是值 12 所在的行,3 是它所在的列,2 是頁或深度。

在 MATLAB 命令視窗中執行相同的操作時:

>> A(1, 3, 2)

ans =

   12

>> 

前面我們只訪問了一個值,要訪問一系列值,可以按如下方式進行:

在第二維中使用索引向量 [1 2] 來訪問 A 的每一頁的第一列和第二列。

C = A(:,[1 2],:)

執行相同的操作後,MATLAB 命令視窗中的輸出為:

C(:,:,1) =

   1     2
   4     5
   7     8

C(:,:,2) =

   10    11
   13    14
   16    17

現在,如果您想獲取每一頁的第二行和第三行,您可以這樣做:

D = A(2:3,:,:)

執行相同的操作後,MATLAB 命令視窗中的輸出為:

>> D = A(2:3,:,:)

D(:,:,1) =

   4     5     6
   7     8     9

D(:,:,2) =

   13    14    15
   16    17    18

操作多維陣列

在多維陣列中,可以像對向量和矩陣一樣,以多種方式重新排列元素。reshape、permute 和 squeeze 函式被證明是調整這些元素排列的有價值工具。

讓我們看看在兩頁多維陣列 A 上使用 reshape()、permute() 和 squeeze() 的示例。

A = [1 2 3 4 5; 9 0 6 3 7; 8 1 5 0 2]
A(:,:,2) = [9 7 8 5 2; 3 5 8 5 1; 6 9 4 3 3]

在 MATLAB 命令視窗中執行上述操作後,輸出為:

>> A = [1 2 3 4 5; 9 0 6 3 7; 8 1 5 0 2]
A(:,:,2) = [9 7 8 5 2; 3 5 8 5 1; 6 9 4 3 3]

A =

   1     2     3     4     5
   9     0     6     3     7
   8     1     5     0     2

A(:,:,1) =

   1     2     3     4     5
   9     0     6     3     7
   8     1     5     0     2

A(:,:,2) =

   9     7     8     5     2
   3     5     8     5     1
   6     9     4     3     3

>>

reshape()

讓我們嘗試在 A 上使用 reshape() 方法。

reshaped_A = reshape(A, [], size(A, 3))

在這裡,您使用 reshape 函式將三維陣列 A 轉換為二維矩陣 reshaped_A。函式 reshape(A, [], size(A, 3)) 將 A 的元素重新排列成一個矩陣,其中行數根據 A 中的頁數自動確定。

在 MATLAB 命令視窗中執行相同的操作後,您將得到:

>> reshaped_A = reshape(A, [], size(A, 3))

reshaped_A =

   1     9
   9     3
   8     6
   2     7
   0     5
   1     9
   3     8
   6     8
   5     4
   4     5
   3     5
   0     3
   5     2
   7     1
   2     3

>>

permute()

permuted_A = permute(A, [3, 1, 2])

permute 函式重新排序原始三維陣列 A 的維度。透過將 [3, 1, 2] 指定為排列順序,您已將“頁”維度移到前面,從而更改了陣列中元素的排列。

在 MATLAB 命令視窗中執行後,輸出為:

>> permuted_A = permute(A, [3, 1, 2])

permuted_A(:,:,1) =

   1     9     8
   9     3     6

permuted_A(:,:,2) =

   2     0     1
   7     5     9

permuted_A(:,:,3) =

   3     6     5
   8     8     4

permuted_A(:,:,4) =

   4     3     0
   5     5     3

permuted_A(:,:,5) =

   5     7     2
   2     1     3

>> 

squeeze()

squeezed_A = squeeze(A)

squeeze 函式可用於從給定的三維陣列 A 中移除單例維度,從而產生三維陣列 squeezed_A。

在 MATLAB 命令視窗中執行後,輸出為:

>> squeezed_A = squeeze(A)

squeezed_A(:,:,1) =

   1     2     3     4     5
   9     0     6     3     7
   8     1     5     0     2

squeezed_A(:,:,2) =

   9     7     8     5     2
   3     5     8     5     1
   6     9     4     3     3

>> 
廣告