MATLAB多維數組常用方法

2020-12-14 校苑數模

8 多維數組

在實際應用的過程中,經常需要構造多於二維的數組,我們將多於二維的數組統稱為多維數組。

對於二維數組,人們習慣於把數組的第1維稱為「行」,把第2維稱為「列」,我們將第3維稱為「頁」。

由於更多維的數組的顯示並不直觀,所以本節以三維數組為例來介紹多維數組的使用。

8.1 多維數組的創建

創建多維數組最常用的方法有以下4種。

(1)直接通過「全下標」元素賦值的方式創建多維數組。

(2)由若干同樣尺寸的二維數組組合成多維數組。

(3)由函數ones、zeros、rand、randn等直接創建特殊多維數組。

(4)藉助cat、repmat、reshape等函數構建多維數組。

【例2-26】 採用「全下標」元素賦值方式創建多維數組示例。

>> A(3,3,3)=1 % 創建3*3*3數組,未賦值元素默認設置為0

A(:,:,1) =

0 0 0

0 0 0

0 0 0

A(:,:,2) =

0 0 0

0 0 0

0 0 0

A(:,:,3) =

0 0 0

0 0 0

0 0 1

>> B(3,4,:)=1:4 % 創建3*4*4數組

B(:,:,1) =

0 0 0 0

0 0 0 0

0 0 0 1

B(:,:,2) =

0 0 0 0

0 0 0 0

0 0 0 2

B(:,:,3) =

0 0 0 0

0 0 0 0

0 0 0 3

B(:,:,4) =

0 0 0 0

0 0 0 0

0 0 0 4

【例2-27】 由二維數組合成多維數組示例。

>> clear

>> A(:,:,1)=magic(4); % 創建數組A第1頁的數據

>> A(:,:,2)=ones(4); % 創建數組A第2頁的數據

>> A(:,:,3)=zeros(4) % 創建數組A第3頁的數據

A(:,:,1) =

16 2 3 13

5 11 10 8

9 7 6 12

4 14 15 1

A(:,:,2) =

1 1 1 1

1 1 1 1

1 1 1 1

1 1 1 1

A(:,:,3) =

0 0 0 0

0 0 0 0

0 0 0 0

0 0 0 0

【例2-28】 由函數rand直接創建特殊多維數組示例。

>> rand('state', 0); % 設置隨機種子,便於讀者驗證

>> B=rand(3,4,3)

B(:,:,1) =

0.9501 0.4860 0.4565 0.4447

0.2311 0.8913 0.0185 0.6154

0.6068 0.7621 0.8214 0.7919

B(:,:,2) =

0.9218 0.4057 0.4103 0.3529

0.7382 0.9355 0.8936 0.8132

0.1763 0.9169 0.0579 0.0099

B(:,:,3) =

0.1389 0.6038 0.0153 0.9318

0.2028 0.2722 0.7468 0.4660

0.1987 0.1988 0.4451 0.4186

【例2-29】 藉助cat函數構建多維數組示例。

>>B=cat(3,ones(2,3),ones(2,3)*2,ones(2,3)*3)

B(:,:,1) =

1 1 1

1 1 1

B(:,:,2) =

2 2 2

2 2 2

B(:,:,3) =

3 3 3

3 3 3

cat指令第1個輸入變量填寫的數字「表示擴展方向的維號」。本例第1個輸入變量是3,表示「沿第3維方向擴展」。為了對比下面我們分別演示使用cat函數沿其他方向進行擴展的情況。

>>B=cat(2,ones(2,3),ones(2,3)*2,ones(2,3)*3) % 沿第2維方向擴展

B =

1 1 1 2 2 2 3 3 3

1 1 1 2 2 2 3 3 3

>>B=cat(1,ones(2,3),ones(2,3)*2,ones(2,3)*3) % 沿第1維方向擴展

B =

1 1 1

1 1 1

2 2 2

2 2 2

3 3 3

3 3 3

>>B=cat(4,ones(2,3),ones(2,3)*2,ones(2,3)*3) % 沿第4維方向擴展

B(:,:,1,1) =

1 1 1

1 1 1

B(:,:,1,2) =

2 2 2

2 2 2

B(:,:,1,3) =

3 3 3

3 3 3

【例2-30】 藉助repmat函數構建多維數組示例。

>> repmat([1,2;3,4;5,6],[1,2,3])

ans(:,:,1) =

1 2 1 2

3 4 3 4

5 6 5 6

ans(:,:,2) =

1 2 1 2

3 4 3 4

5 6 5 6

ans(:,:,3) =

1 2 1 2

3 4 3 4

5 6 5 6

repmat函數的第1個輸入變量是構成多維數組的源數組。第2個輸入變量是指定向各維方向上擴展的源數組個數。本例中輸入變量[1,2,3]是指將源數組在行方向上擴展為1個,在列方向上擴展為2個,在頁方向上擴展為3個。

【例2-31】 藉助reshape函數構建多維數組示例。

>> A=reshape(1:60,5,4,3)

A(:,:,1) =

1 6 11 16

2 7 12 17

3 8 13 18

4 9 14 19

5 10 15 20

A(:,:,2) =

21 26 31 36

22 27 32 37

23 28 33 38

24 29 34 39

25 30 35 40

A(:,:,3) =

41 46 51 56

42 47 52 57

43 48 53 58

44 49 54 59

45 50 55 60

>> B=reshape(A,4,5,3)

B(:,:,1) =

1 5 9 13 17

2 6 10 14 18

3 7 11 15 19

4 8 12 16 20

B(:,:,2) =

21 25 29 33 37

22 26 30 34 38

23 27 31 35 39

24 28 32 36 40

B(:,:,3) =

41 45 49 53 57

42 46 50 54 58

43 47 51 55 59

44 48 52 56 60

reshape的第1個輸入變量是源數組,第2、3、4個輸入變量是要生成的數組的行數、列數和頁數。將要生成的數組必須和源數組的元素的個數相同。重組時,元素排列遵循「單下標」編號規則:第1頁的第1列接該頁的第2列,直至第1頁最後一列。在第1頁排列結束後,開始排列第2頁的第1列,依次類推,直至所有的元素排列結束。

8.2 多維數組的尋訪與重構

1.多維數組的尋訪

多維數組的尋訪和二維數組一樣,可以使用「全下標」、「單下標」和「邏輯下標」來尋訪。「全下標」和「邏輯下標」兩種形式與二維數組相同,是以非常直觀的形式來表現的,這裡不再贅述。而多維數組的「單下標」就比較複雜一點。本小節對此進行介紹。

多維數組的「單下標」其實就是二維數組「單下標」的擴展,換句話說,二維數組的「單下標」編排方式是「單下標」的一種簡單形式。用語言表示就是:將數組「全下標」格式中的各維按照出現的先後順序依次循環,直至將所有的數據編排成為一列。

【例2-32】 多維數組「單下標」排列示例。

>> a=ones(2,2,2,2) % 創建全為1的2*2*2*2四維數組a

a(:,:,1,1) =

1 1

1 1

a(:,:,2,1) =

1 1

1 1

a(:,:,1,2) =

1 1

1 1

a(:,:,2,2) =

1 1

1 1

>> a(1:16)=1:16 % 按照單下標形式為數組a賦值

a(:,:,1,1) =

1 3

2 4

a(:,:,2,1) =

5 7

6 8

a(:,:,1,2) =

9 11

10 12

a(:,:,2,2) =

13 15

14 16

從得到結果中的數組a被賦值以後的各元素分布,可以看出多維數組是如何按照「全下標」的各維順序來存儲數據的。

2.多維數組的重構

除了前面介紹的可以用來進行多維數組的重構函數cat、repmat和reshape之外,還有其他一些函數可用來進行多維數組的重構,詳見表2-10。

表2-10 多維數組重構函數

函數形式

函數功能

函數形式

函數功能

permute

廣義非共軛轉置

flipdim

以指定維交換對稱位置上的元素

ipermute

廣義反轉置,permute的反操作

shiftdim

維移動函數

【例2-33】 多維數組元素對稱交換函數flipdim使用示例。

>> A=reshape(1:18,2,3,3) % 創建演示三維數組

A(:,:,1) =

1 3 5

2 4 6

A(:,:,2) =

7 9 11

8 10 12

A(:,:,3) =

13 15 17

14 16 18

>> B=flipdim(A,1) % 以第1維進行對稱變換

B(:,:,1) =

2 4 6

1 3 5

B(:,:,2) =

8 10 12

7 9 11

B(:,:,3) =

14 16 18

13 15 17

>> C=flipdim(A,3) % 以第3維進行對稱變換

C(:,:,1) =

13 15 17

14 16 18

C(:,:,2) =

7 9 11

8 10 12

C(:,:,3) =

1 3 5

2 4 6

從本例可以看出,函數flipdim(A,k)中的輸入變量k就是指進行對稱變換的維。另外flipdim(A,k)函數也可用於二維數組,讀者可以自行驗證。

【例2-34】 多維數組元素維移動函數shiftdim使用示例。

本例在上例所建立的三維數組A上進行演示。

>> D=shiftdim(A,1) % 將各維向左移動1位,使2*3*3數組變成3*3*2數組

D(:,:,1) =

1 7 13

3 9 15

5 11 17

D(:,:,2) =

2 8 14

4 10 16

6 12 18

>> E=shiftdim(A,2) % 將各維向左移動2位,使2*3*3數組變成3*2*3數組

E(:,:,1) =

1 2

7 8

13 14

E(:,:,2) =

3 4

9 10

15 16

E(:,:,3) =

5 6

11 12

17 18

運算D=shiftdim(A,1)實現以下操作:D(j,k,i)=A(i,j,k),i, j, k分別是指各維的下標。對於三維數組,D=shiftdim(A,3)的操作就等同於簡單的D=A。

【例2-35】 多維數組元素廣義非共軛函數permute使用示例。

本例在上例所建立的三維數組A上進行演示。

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

F(:,:,1) =

1 3 5

7 9 11

13 15 17

F(:,:,2) =

2 4 6

8 10 12

14 16 18

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

G(:,:,1) =

1 2

7 8

13 14

G(:,:,2) =

3 4

9 10

15 16

G(:,:,3) =

5 6

11 12

17 18

運算F=permute(A, [3 2 1])實現以下操作:F(k,j,i)=A(i,j,k),i, j, k分別是指各維的下標。函數permute就是函數shiftdim的特殊形式,它可以任意指定維的移動順序。

相關焦點

  • MATLAB的cell數組
    圖3-3是元胞數組的結構示意圖,表示的是一個23的元胞數組。元胞數組的第1行包括了無符號整數、字符串數組和一個複數數組,第2行包括了其他3種類型的數組,其中最後一個是另外的元胞數組的嵌套。圖3-3 元胞數組結構示意圖和數值數組一樣,元胞數組的維數不受限制,元胞數組可以是一維的、二維的,也可以是多維的。
  • 數據處理:Matlab之向量和數組的基本操作
    一文中,我們對matlab做了簡要介紹。本文來說說matlab 中使用數據的常用形式——向量,也就是一維數組。二維數組就是矩陣了,我們下次再寫。向量 (vector)matlab中的向量分為行向量和列向量兩種。行向量的數據之間用逗號或者空格隔開;列向量的數據之間用分號隔開。
  • matlab官方快速入門----矩陣和數組
    MATLAB®主要用於處理整個的矩陣和數組,而其他程式語言大多逐個處理數值,所有 MATLAB 變量都是多維數組,與數據類型無關。矩陣是指通常用來進行線性代數運算的二維數組。數組創建要創建每行包含四個元素的數組,請使用逗號 (,) 或空格分隔各元素。
  • D02 Numpy常用函數,如何優雅的遍歷一個多維數組?
    title: D02|Numpy常用函數author: Adolph Leecategories: 數據挖掘基礎tags:Python數據挖掘基礎當我們想要遍歷一個多維數組的時候,如果通過不停的使用循環去遍歷,這會讓我們的代碼可讀性與性能都變得很差,numpy提供了一個函數nditer,以幫助我們遍歷數組。nditer的入參是一個數組,返回值是一個可迭代對象。nditer 默認會優先遍歷行序,通過order參數可以使其優先遍歷列序。
  • MATLAB的Cell數組操作
    表3-7 元胞數組中的操作函數函    數說    明函    數說    明cell創建空的元胞數組num2cell將數值數組轉換為元胞數組cellfun對元胞數組的每個元胞執行指定的函數mat2cell將數值矩陣轉換為元胞數組
  • C/C++編程筆記:數組和字符串丨多維數組詳解
    數組基礎在C / C ++中,我們可以用簡單的單詞將多維數組定義為數組數組。多維數組中的數據以表格形式(以行主要順序)存儲。
  • 記錄集賦值給數組後,利用轉置函數處理多維數組的方法
    大家好,今日繼續講解VBA資料庫解決方案,今日講解的是第76講,內容是:記錄集賦值給數組後,利用轉置函數處理多維數組的方法。我在第一冊的第43講中,我講了將記錄集存入數組的方案,並通過一個Index函數在工作表中恢復數組數據的方法。今日講的是利用轉置函數來完成同樣的功能。
  • Java語法 | 多維數組
    但是,在本篇,查老師將帶你學習一種更為高級的方式:多維數組。概述上一篇,我們學的用來存儲多個數據的數組,它們被稱為一維數組。多維數組,類似於前面學過的嵌套 if、嵌套循環。查老師覺得,你也可以把多維數組稱之為 "嵌套數組"。它的常見表現形式有:二維數組、三維數組。
  • MATLAB數組的常用函數
    3  進行數組運算的常用函數在MATLAB中有一些常用函數,這些函數在日常的編程計算過程中會經常遇到,一般是基本的數學概念在MATLAB
  • python中調用MATLAB程序
    方法1 : 一起輸出每個鍵以及對應的數據值,注意每個鍵都是雙_連用。 因為python導入的mat格式的數據是字典數據格式,需要獲得每個鍵以及它的屬性值。        方法2:先列印出每個鍵,然後在列印出數據值。
  • MATLAB簡單粗暴教程(二十八)——MATLAB裡簡單的統計函數
    若X是多維數組,則該函數從第一個維數大小不為1的數組開始計算,並將元素視為數組。 m=geomean(X,dim)返回在維數dim上的平均值,例如對於矩陣X, geomean(X,2) 就代表一個包含每一行元素幾何平均值的列向量。
  • SystemVerilog中的多維數組
    20200609SystemVerilog中的多維數組謝謝所有註冊並參加了有關SystemVerilog數組的網絡研討會的人。「SystemVerilog數組」是一個大話題,我不得不省略許多想法。有關多維數組(Multidimensional Arrays,MDA)的問題很多,因此這裡僅作簡短介紹。複製並粘貼這些代碼,然後在你喜歡的模擬器上運行。搞亂,犯錯,再進行調試–——你是驗證工程師,請牢記這一點!
  • MATLAB矩陣與數組
    在MATLAB中,一般情況下一個矩陣就是指一個長方形的數組。特殊情況有兩個,一是單一元素的標量,二是只有一行或者一列的矩陣,也就是向量。MATLAB也有其他儲存數值和非數值數據的方式,但是對於初學者來說,最好是將所有的情況都考慮為矩陣,這樣更容易使用。MATLAB的設計理念是所有的操作儘可能的自然。
  • Matlab強大的數組處理功能如何解決圖像處理解析方案
    但是對於多維數組,同樣的操作要複雜得多」,造成這一問題的根源在於Matlab與C++對多維數組元素的存儲方式不同。而在本項目開發過程中迴避了這個複雜的過程,轉而利用Matlab強大的數組處理功能將其解決。
  • VBA多維數組的「扁平化處理」—— On Error Resume Next
    當然,這是一個批量處理的問題,即使透視表能做,也架不住天天手動做幾十個表格 :(正題:難點介紹處理數據的時候,發現這是個多維數組,且數組內的元素(本身也是數組),長度不一:這樣的情況會有以下2個難點:•不能直接轉置(會報錯類型不匹配)•不能通過用統一的最大下標上限循環訪問(會報錯下標越界)面對這種多維複雜的數據結構,若要變成標準的二維數組方便寫回到單元格,需要對這個多維數組做
  • MATLAB中struct的創建與訪問
    其結構如下:當使用struct時,需要注意以下幾個問題:1.欄位名稱的文字支持問題在matlab中,欄位名稱必須是英文名字,matlab各版本都不支持中文欄位名稱,即使是最新版的2020A版也不支持,2020B尚未測試過,但把欄位名稱看作變量名,則2020B應該也不支持中文名稱。
  • MATLAB簡單粗暴教程(二十七)——MATLAB裡簡單的統計函數
    若A是多維數組,則該函數從第一個維數大小不為1的數組開始計算,並將元素視為數組。 M = max(A,[],dim)返回在維數dim上的最大元素,例如對於矩陣A,max(A,[],2)就代表一個包含每一行元素最大值的列向量。 [M,I] = max(___) I表示最大值所在的索引數。
  • MATLAB中內置了哪些函數是本科生常用的?
    我想請對這款軟體熟悉的人列舉一些本科生常用的函數和MATLAB中的名字。讓我少走一些彎路,真誠的感謝你。修改舉報 • 邀請回答按投票排序按時間排序14 個回答11贊同反對,不會顯示你的姓名白如冰 ,四月到?
  • DataFrame數組常用方法
    本文作者:孫曉玲文字編輯:孫曉玲學習了Pandas的基本數據類型,今天為大家介紹Pandas中基本數據類型的常用操作方法
  • Python數據分析筆記#5.1 Numpy-多維數組
    創建多維數組多維數組的數據類型Numpy數組的運算Numpy數組的索引和切片數組轉置和軸對換Numpy簡介Numpy(Numerical Python)是Python數值計算最重要的基礎包。Numpy的功能:ndarray,多維數組,具有矢量運算和複雜廣播能力,且節省空間。不需要編寫循環就可以對整組數據進行快速運算的函數。集成C,C++,Fortran等語言編寫的C APINumpy對於數值計算特別重要的原因之一是,高效的處理大數組的數據。