- 在线时间
- 2759 小时
- 最后登录
- 2017-9-15
- 注册时间
- 2011-4-3
- 听众数
- 538
- 收听数
- 4
- 能力
- 80 分
- 体力
- 1764 点
- 威望
- 27 点
- 阅读权限
- 150
- 积分
- 5990
- 相册
- 0
- 日志
- 0
- 记录
- 5
- 帖子
- 6675
- 主题
- 3503
- 精华
- 8
- 分享
- 6
- 好友
- 1721
TA的每日心情 | 开心 2017-2-7 15:12 |
---|
签到天数: 691 天 [LV.9]以坛为家II
 群组: 2013年国赛赛前培训 群组: 2014年地区赛数学建模 群组: 数学中国第二期SAS培训 群组: 物联网工程师考试 群组: 2013年美赛优秀论文解 |
19、多维数组基础,关于二维数组的补充
* F$ q% h9 Z& M! |' q9 r多维数组即含有多个页的数组;
6 J0 X+ N- y6 o9 I( ] }" E0 B3 X多维数组的处理就是在原有的函数基础上增加一个参数:
$ c2 J: N* ~& \, w" Z$ u g, o例: 0 E4 }3 T; G3 z4 E9 Y: q
zeros(m,n,w)%创建一个m行n列w页的0矩阵 ' k6 @, g8 V* |% ], {
ones(m,n,w)
1 _: x; T; _) ^5 K7 K$ feye(m,n,w) ) a( @) q. d$ Y1 V
rand(m,n,w) $ I u* E0 z2 q! p
randn(m,n,w) + F* [; G; b* N' ? \! y8 I. C1 t
randperm没有多页的形式,它只能生成一个由1:n构成的随机排列的一维数组
3 v: o# s2 L, X+ K5 `! B) \6 k9 o$ h相关函数:
! d; O5 h% q' f( ~7 l2 | [reshape(A,m,n,w)将矩阵A变化为一个具有m行n列w页的矩阵 # x& N- N7 N* K
repmat(A,[m n w])将矩阵A作为一个单位,复制到一个具有m行n列w页的矩阵中去
- U. L; B2 E- `注意:当要复制到的矩阵为二维时,完全可以用这种形式:repmat(A,m,n) * ?' o9 R$ Z. K
Cat(3,A,B,C)将矩阵A、B、C连接成为一个3页的矩阵
; ~9 y) [2 z) S, t f( @) k若矩阵A为n维矩阵,则size(A)将返回一个含n个元素的一维数组. Z2 k6 [% C. J8 M0 W
8 w; t1 P& Q3 ^8 ]& v2 Y+ R6 ^) `& c- k20、多维数组的翻转
% G1 C) |/ e4 U" B& H0 Fflipdim(A,1)将A的每个维中的矩阵进行上下翻转;相当于对A的每个维使用flipud
2 w' @) `) o+ J) A6 K& Y2 F$ bflipdim(A,2)将A的每个维中的矩阵进行左右翻转;相当于对A的每个维使用fliplr
+ ?; S6 E. t) D: S; C# Oflipdim(A,3)A的每个维中的矩阵不做变化,将A的每个维视为单位进行上下翻转;
( U ]* n) b( A- C! Tflipdim(A,4)不做任何改变;
+ c/ N" g/ c, D) K# l" ^
s7 _1 ?3 X/ h' C% pshiftdim(A,n)将A的维数进行轮换,分为轮换次数为正和轮换次数为负两种情况
! e }5 u7 o W# F& J例如:
+ P* p" f6 N) Q# ?m行n列w页经过1次维数的轮换就变为n列w行m页 $ Q9 _: s6 T" ^/ i
m行n列w页经过-1次维数的轮换就变为1行m列n页w更高的维(轮换次数为负会增加维数) 6 \+ N4 Y/ O! g
, h4 }6 U0 @/ q A, Y例:>> size(A)%A的维数为2行3列3页 . w6 K; l2 `9 f' q
; S1 E6 d1 ?9 m1 `% y* C! u' U
ans = " N U$ e. z$ L' Q
! f7 P: H8 |3 [1 G2 b
2 3 3 0 o R2 w0 T G1 [4 O9 R3 M$ I9 C
>> B=shiftdim(A,1)%使用shiftdim对维数翻转1次
P' q! K0 Z7 m2 y$ e
% m; M6 n+ T# ?7 e1 Q. ?B(:,:,1) =
4 I. s+ z! T4 ^" s9 T
0 q0 k( F9 R( \) O- R4 ^7 z1 G7 16 10
1 F! V! h2 a3 }6 c4 e( ?' i$ b3 9 13
: G" _/ c; B$ g# u6 d: ^$ d& |8 `5 L8 2 1
: i8 q$ m7 t* v/ V+ X
. q. X" u2 w. z6 W
6 l5 t, P5 @" ^9 o4 F" g$ B$ ZB(:,:,2) = , V! i6 X. ]% Z' E
# ~% M3 z* V. C ^. @
15 17 12
( ~2 @& T' ^) l- Z/ H1 t1 j14 18 4
2 B) R! F' X8 o0 s1 A11 6 5 : w) C7 e, C( E, Z
5 Y9 j% a& ]$ V" q3 O6 ] Y' ?1 V
>> size(B)%得到的新矩阵B的维数为3行3列2页 + ]/ }& ^% g% ~ L
Q+ ]$ S( u; o" a, Jans = 0 S; Y0 S+ D* p! ?5 r
& }7 s; e6 }, Z. _( N1 P0 u3 3 2 2 U' }9 C5 \- P7 E7 u1 k m
>> B=shiftdim(A,-1);%对矩阵A进行-1次的轮换 ( E+ z, i9 L: C7 ]
>> size(B)%得到的新矩阵B的维数为1*2*3*3 ; C% m* ?% r- y9 d" a
7 Z+ Z& Z" X# r2 ]' q9 v5 Hans = 7 j* ^0 g8 J6 d5 w' N$ n
6 c) T+ d/ D2 ], H+ m7 i- S- i* e
1 2 3 3 & ^! V2 q* g# I+ G6 q
7 [# X6 F$ c4 x" ]1 M6 Z& y0 R$ V
shiftdim维数轮换à联想记忆:shift+dim转换+维数 ; ?! ^0 ~! |7 i( B0 |
shiftdim的缺点:只能将各个维数轮换,不能对调,因此便有了permute函数对其进行补充
7 u. z: i; L4 U- Z4 b' g' w8 |+ j6 d6 s( p3 I# d5 |! I) ^
permute(A,order)将矩阵A的维数按照自己喜欢的方式进行轮换或对调,括号中的order表示A的维数的任意排列,例如A是四维矩阵,那么order就必须是1234这四个数的一个任一排列 ' J0 [. Z" J% @% e' `( t
例: ; Q' e4 i& W8 s% m: G2 B& j1 J6 R
>> A=rand(2,2,3,3);%创建一个2-2-3-3的四维矩阵
* j( |+ x: x! [1 p g>> B=permute(A,[3 1 2 4])%将A的第一维变为第二维,第二维变为第三维,第三维变为第一维
# Z0 Q6 k$ v! l3 W* ?- R当我们用permute对一个三维数组进行四维的置换时,第四维数组一定是单一维(这也是shiftdim(A,-1)增加的维数都是单一维的原因),这是因为,任何一个数组都具有大于其本身尺寸的更高维数,并且这些维数均为单位维数。例如,一个二维数组是具有页这一维的,并且仅有一页。总之,任何超过数组本身大小的维数都是单一维。对于上述代码而言,由于M是一个三维数组,其第四维必为单一维,因此,将M第四维与第一维进行转置,第一维就变成了单一维。
7 p# ^/ _; Y+ \ r9 A- _9 n+ p! A由上面这段话,我们也容易知道:假设矩阵A的维数是二维的,当我们输入[r,c,p]=size(A)时,一定有p=1
5 N1 c/ S( u5 X# e- P+ H1 u, x* L6 h3 F* N( q/ V
Ipermute是用于取消维数转置的函数
% S( G7 A& Y( ], V例:A为四维矩阵
( [2 w5 M$ z4 h# GB=permute(A,[4 3 2 1])%对矩阵A的维数进行转换
" M1 e4 z; N3 l$ j& |' `; g5 rC=ipermute(B,[4 3 2 1])%对矩阵B的维数进行逆转换,最终重新得到矩阵A
9 Z: a7 |/ K0 ~9 h {6 s8 m$ _
. z. E+ F6 s% t" c' b# V |
zan
|