matlab多維陣列操作
1.一個三維陣列由行、列和頁三維組成,其中每一頁包含一個由行和列構成的二維陣列。
2.利用標準陣列函式建立多維陣列
A=zeros(4,3,2) 生成一個4行3列2頁的三維全0陣列,ones,rand和randn等函式有相似的用法。
3.利用直接索引方式生成多維陣列
A=zeros(2,3)
A(:,:,2)=ones(2,3)
A(:,:,3)=4
上面的程式碼先生成一個二維陣列作為三維陣列的第一頁,然後通過陣列直接索引,新增第二頁、第三頁。
4.利用函式reshape和repmat生成多維陣列
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寫出類似reshape的repmat(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.陣列運算與處理
陣列之間的運算要求兩個陣列在任何一維都必須具有相同的大小。
(1)squeeze函式用於刪除多維陣列中的單一維(即大小為1的那些維)
E=squeeze(D)
size(D) E的資料和D一樣,但比D少了一維,只有2行、2列和3頁。
(2)reshape函式可以將一個三維向量變成一維向量。
v(1,1,:)=1:6
squeeze(v)
v(:)
(3)reshape
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用於多維陣列的翻轉,相當於二維陣列中的flipud和fliplr函式。例如下面的程式碼進行按行、列和按頁翻轉。
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.函式permute和ipermute用於實現多維條件下的轉置操作。從本質上講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上執行沒有達到預期效果
13.size函式返回陣列每一維的大小
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),與length(size(M))等效。
多維陣列常用函式:
函式 |
描述 |
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) |
沿著一個指定的維輪換順序。等效於二維陣列中的flippud和fliplr函式 |
shiftdim(M,2) |
迴圈輪換。第二個引數為正的情況下,進行各維的迴圈輪換;若為負數,將陣列的維數增加。 |
permute(M,[2 1 3]) iprmute(M,[2 1 3]) |
多維陣列的轉置操作,前者為轉置操作,後者為取消轉置操作。 |
size(M) [r,c,p]=size(M) |
返回各維的大小 |
r=size(M,1) |
返回行數 |
c=size(M,2) |
返回列數 |
p=size(M,3) |
返回頁數 |
ndims(M) |
獲取陣列的維數 |
numel(M) |
獲取陣列的元素總個數 |