1. 程式人生 > >matlab多維陣列操作

matlab多維陣列操作

1.一個三維陣列由行、列和頁三維組成,其中每一頁包含一個由行和列構成的二維陣列。

2.利用標準陣列函式建立多維陣列

A=zeros(4,3,2) 生成一個432頁的三維全0陣列,onesrandrandn等函式有相似的用法。

3.利用直接索引方式生成多維陣列

 A=zeros(2,3)

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

 A(:,:,3)=4

上面的程式碼先生成一個二維陣列作為三維陣列的第一頁,然後通過陣列直接索引,新增第二頁、第三頁。

4.利用函式reshaperepmat生成多維陣列

B=reshape(A,2,9)

B=[A(:,:,1) A(:,:,2) A(:,:,3)] %

結果與上面一樣。

reshape(B,2,3,3)

reshape(B,[2 3 3]) %結果與上面一樣。

提示:reshape函式可以將任何維數的陣列轉變成其他維數的陣列。

5.利用repmat函式生成多維陣列

C=ones(2,3)

repmat(C,[1 1 3]) % repmat寫出類似reshaperepmat(C,1,1,3)將顯示出錯

提示:repmat是通過陣列複製建立多維陣列的,上面的程式碼即是將陣列C在行維和列維分別複製一次,然後再頁維複製三次得到2×3×3的三維陣列。

6.利用cat函式建立多維陣列

a=zeros(2);

b=ones(2);

c=repmat(2,2,2);

D=cat(3,a,b,c)%建立三維陣列

D=cat(4,a,b,c) %建立4維陣列。

D(:,1,:,:) %檢視第一列的資料。

size(D) %可以知道陣列D的具體維數。

6.陣列運算與處理

陣列之間的運算要求兩個陣列在任何一維都必須具有相同的大小。

1squeeze函式用於刪除多維陣列中的單一維(即大小為1的那些維)

E=squeeze(D)

size(D) E的資料和D一樣,但比D少了一維,只有2行、2列和3頁。

2reshape函式可以將一個三維向量變成一維向量。

 v(1,1,:)=1:6

 squeeze(v)

v(:)

3reshape

函式用於改變多維陣列的行、列、頁以及更高階的維數,但不改變陣列元素的總個數。

F=cat(3,2+zeros(2,4),ones(2,4),zeros(2,4))

G=reshape(F,[3,2,4])

H=reshape(F,[4 3 2]) K=reshape(F,2,12)

多維陣列的重組按這樣的順序:第一頁的第一列、第二列……,第二頁的第一列、第二列……。

7.sub2ind函式和ind2sub函式用於多維陣列的直接引用,索引順序與重組順序一致。

sub2ind(size(F),1,1,1) %求第1行、第1列、第1頁的數值的單一索引

sub2ind(size(F),1,2,1) %求第1行、第2列、第1頁的數值的單一索引

sub2ind(size(F),1,2,3) %求第1行、第2列、第3頁的數值的單一索引

[r c p]=ind2sub(size(F),19) %由單一索引求其對應的行列頁數值。

8.函式flipdim用於多維陣列的翻轉,相當於二維陣列中的flipudfliplr函式。例如下面的程式碼進行按行、列和按頁翻轉。

M=reshape(1:18,2,3,3)

flipdim(M,1) %每一頁中的行翻轉

flipdim(M,2) %每一頁中的列翻轉

flipdim(M,3) %將第一和第三頁翻轉調換

9.函式shiftdim用於迴圈輪換一個數組的維數。如果一個數組r行、c列和p頁,則迴圈輪換一次,就生成一個c行、p列和r頁的陣列。

 M %重新呼叫

 shiftdim(M,1) %輪換一次

shiftdim(M,2) %輪換兩次

陣列輪換後規律很難直觀理解,我們可以將三維陣列看成一個類似魔方的方形盒子

函式shiftdim也支援負的迴圈輪換次數。執行該輪換時,陣列的維數增加,並且多出的維數均為單一維。

 M %重新呼叫

size(M)

shiftdim(M,-1)

size(ans).

10.函式permuteipermute用於實現多維條件下的轉置操作。從本質上講permute函式是shiftdimhas函式的擴充套件。

M %重新呼叫

permute(M,[2 3 1])

shiftdim(M,1) %兩者結果一樣

permute函式中的引數[2 3 1]表示使函式第二維成為第一維,第三維成為第二維,第一維成為第三維。

11. permute(M,[2 1 3])

 [2 1 3]表示將陣列的行列相互轉置,頁保持不變(只在第一和第二維轉置)。

permute函式的第一個引數為待轉置的陣列,第二個引數為轉置順序,它必須是待轉置的多維陣列的維數的某種排列,否則所進行的轉置無法進行。

 permute函式也可以用來將一個數組變成更高維的陣列,例如shiftdim(M,-1)也可以用permute函式來實現。

permute(M,[4 1 2 3])

這是 因為任何一個數組都具有大於其本身尺寸的更高維數,並且這些維數均為單一維數。例如二維陣列具有頁這一維,只是只有一頁。總之超過陣列本身大小的維數都是單一維。M是一個三維陣列,其第四維必為單一維,因此將M的第四維與第一維轉置,第一維變成了單一維。

12.二維陣列兩次轉置變換回原來的形式,對於多維陣列,用函式ipermute來取消permute所執行的轉置操作。

 M %重新呼叫

 permute(M,[3 2 1])

 ipermute(M,[3 2 1]) %在我的Matlab上執行沒有達到預期效果

13size函式返回陣列每一維的大小

numel函式返回陣列的總元素個數

當不指定size的返回值時,將返回一個由陣列的各維陣列成的向量。當我們知道陣列的維數時,可以將維數返回到指定變數中。

[r c p]=size(M)

r=size(M,1)

c=size(M,2)

p=size(M,3)

v=size(M,4)

當一個數組的維數或者某陣列維數不確定時,可以利用函式ndims獲得陣列的維數值。例如:ndims(M),與lengthsizeM))等效。

多維陣列常用函式:

函式

描述

ones(r,c,…),zeros(r,c,…)

rand(r,c,…),randn(r,c,…)

建立多維陣列的基本函式,分別建立全1、全0.隨機(0-1之間)和隨機正態分佈的多維陣列。

reshape(B,2,3,3)

reshape(B,[2 3 3])

將一個數組變形成任意維數的陣列

repmat(C,[1 1 3])

將一個數組複製成一個任意維數的陣列

cat(3,a,b,c)

沿著一個指定的維將陣列連線起來

squeeze(D)

刪除大小等於1的維,即單一維。

sub2ind(size(F),1,1,1)

[r,c,p]=ind2sub(size(F),19)

將下標轉化為單一索引值

將單一索引值轉化成下標

flipdim(M,1)

沿著一個指定的維輪換順序。等效於二維陣列中的flippudfliplr函式

shiftdimM2

迴圈輪換。第二個引數為正的情況下,進行各維的迴圈輪換;若為負數,將陣列的維數增加。

permuteM,[2 1 3]

iprmuteM[2 1 3]

多維陣列的轉置操作,前者為轉置操作,後者為取消轉置操作。

sizeM

[r,c,p]=size(M)

返回各維的大小

r=sizeM,1

返回行數

c=sizeM2

返回列數

p=sizeM3

返回頁數

ndimsM

獲取陣列的維數

numelM

獲取陣列的元素總個數