matlab多维数组
在Matlab中習慣性的會將二維數組中的第一維稱為“行”第二維稱為“列”,而對于三維數組的第三位則是習慣性的稱為“頁”。在Matlab中將三維及三維以上的數組統稱為高維數組,三維數組也是高級運算的基礎,本文將介紹三種創建三維數組的方法。
1、多維數組
第三維稱為頁,需要注意的是每一頁存放的二維數組維度要一致,也就是行列數要一致。
| 1 2 3 4 5 6 7 | a=[1,2; ????3,4]; b=[2,2; ????5,6]; A(:,:,1)=a; A(:,:,2)=b; A(:,:,3)=a; |
這樣就得到的A三維數組為2*2*3double
2、結構體數組
(我學這個的目的是為了將不同維度的二維數組存放在一塊,將不同的二維數組賦值給新的數組,方便循環遍歷)
結構體數組定義--賦值方式或者用struct
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | a=[1,2; ????3,4]; b=[1,2; ????5,6; ????7,7]; gmmdata(1)=struct('cluster',a);? gmmdata(2)=struct('cluster',b);??? gmmdata(1) c=gmmdata(1).cluster text(1).cluster=a;%cluster為結構體中一個名字 text(2).cluster=b; text(2) d=text(2).cluster |
使用下標創建三維數組
1
在Matlab命令框中輸入以下代碼可以創建簡單的三維數組:
for i=1:2
for j=1:2
for k=1:2
A(i,j,k)=i+j+k;
end
end
end
2
要查看程序結果。在命令窗口中輸入變量名稱按【Enter】,即可得到相應的結果。如
輸入:A(:,:,1)
得到:
ans =
? ? ?3 ? ? 4
? ? ?4 ? ? 5
輸入:A(:,:,2)
得到:ans =
? ? ?4 ? ? 5
? ? ?5 ? ? 6
?
END
使用低維數組創建三維數組
1
我們可以先輸入一個二維數組,然后通過第三維數組與其關系生成第三維數組,例如輸入以下代碼可以生成三維數組:
D2=[1,2,3;4,5,6;7,8,9];
D3(:,:,1)=D2;
D3(:,:,2)=2*D2;
D3(:,:,3)=3*D2;
2
要查看程序結果。
輸入:D2 并按【Enter】可以查看輸入的二維數組。
得到:
D2 =
? ? ?1 ? ? 2 ? ? 3
? ? ?4 ? ? 5 ? ? 6
? ? ?7 ? ? 8 ? ? 9
輸入:D3 并按【Enter】可以查看生成的三維數組。
D3(:,:,1) =
? ? ?1 ? ? 2 ? ? 3
? ? ?4 ? ? 5 ? ? 6
? ? ?7 ? ? 8 ? ? 9
D3(:,:,2) =
? ? 2 ? ? 4 ? ? 6
? ? ?8 ? ?10 ? ?12
? ? 14 ? ?16 ? ?18
D3(:,:,3) =
? ? ?3 ? ? 6 ? ? 9
? ? 12 ? ?15 ? ?18
? ? 21 ? ?24 ? ?27
?
END
使用創建函數創建三維數組
1
使用Cat命令來創建高維數組。Cat命令的個事為【C=cat(dim,A1,A2,A3,A4……)】其中dim表示的是創建數組的維度,A1,A2,A3,A4表示的是各維度上的數組。在命令窗口中輸入以下代碼即可創建一個簡單的三維數組:
D2=[1,2,3;4,5,6;7,8,9];
C=cat(3,D2,2*D2,3*D2);
2
要查看程序結果
輸入:C(:,:,1)?并按【Enter】
得到:
ans =
? ? ?1 ? ? 2 ? ? 3
? ? ?4 ? ? 5 ? ? 6
? ? ?7 ? ? 8 ? ? 9
輸入:C(:,:,2) 并按【Enter】
得到:
ans =
? ? ?2 ? ? 4 ? ? 6
? ? ?8 ? ?10 ? ?12
? ? 14 ? ?16 ? ?18
輸入:C(:,:,3) 并按【Enter】
得到:
ans =
? ? ?3 ? ? 6 ? ? 9
? ? 12 ? ?15 ? ?18
? ? 21 ? ?24 ? ?27
?
3
還可以利用【repmat】命令以及【reshape】命令在生成高維數組,因為用到的概率不涉及很高這里不一一闡述。
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) | 獲取數組的元素總個數 |
總結
以上是生活随笔為你收集整理的matlab多维数组的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 模拟退火粒子群优化算法控制程序
- 下一篇: 轮盘赌算法原理