在线时间 2759 小时 最后登录 2017-9-15 注册时间 2011-4-3 听众数 538 收听数 4 能力 80 分 体力 1764 点 威望 27 点 阅读权限 150 积分 5990 相册 0 日志 0 记录 5 帖子 6675 主题 3503 精华 3 分享 6 好友 1721
TA的每日心情 开心 2017-2-7 15:12
签到天数: 691 天
[LV.9]以坛为家II
群组 : 2013年国赛赛前培训
群组 : 2014年地区赛数学建模
群组 : 数学中国第二期SAS培训
群组 : 物联网工程师考试
群组 : 2013年美赛优秀论文解
19、多维数组基础,关于二维数组的补充 ( O$ M: v) I9 l, Q& ^: g
多维数组即含有多个页的数组; e# L2 X+ R8 G/ X. r [7 Q* {
多维数组的处理就是在原有的函数基础上增加一个参数: 7 s3 }( |& N, U4 h$ h. o6 y
例: & v. A$ x( ]# Y( D" Y
zeros(m,n,w)%创建一个m行n列w页的0矩阵
& R7 \3 y n4 S) z ones(m,n,w) 2 o. A& q7 d2 |: e- g
eye(m,n,w)
* h8 w& D$ _9 |4 Z# g rand(m,n,w)
) ~* ~" Z. Y s% u randn(m,n,w)
9 e; F, u2 T; X; u* F1 |6 } randperm没有多页的形式,它只能生成一个由1:n构成的随机排列的一维数组
' g% M- {6 a$ w+ \3 T 相关函数:
; R% L& K0 p6 j2 J& T reshape(A,m,n,w)将矩阵A变化为一个具有m行n列w页的矩阵 m7 h2 H: A* f ?8 k
repmat(A,[m n w])将矩阵A作为一个单位,复制到一个具有m行n列w页的矩阵中去 ' u! c% }+ u" R l" x0 N
注意:当要复制到的矩阵为二维时,完全可以用这种形式:repmat(A,m,n) 9 `* y' b' J2 \9 Z5 ?
Cat(3,A,B,C)将矩阵A、B、C连接成为一个3页的矩阵 5 a5 @. M/ Y$ e' c! ^- g
若矩阵A为n维矩阵,则size(A)将返回一个含n个元素的一维数组# j3 E% E* C. }2 X" L6 N; a% I
9 C' q) c$ Q; x' o6 S6 a7 r# J 20、多维数组的翻转
6 o) N0 r6 y+ I flipdim(A,1)将A的每个维中的矩阵进行上下翻转;相当于对A的每个维使用flipud
/ T* z+ }$ Q& ?/ m2 D# L( H flipdim(A,2)将A的每个维中的矩阵进行左右翻转;相当于对A的每个维使用fliplr ) N9 j5 d7 d6 q' _) x1 v6 o, [
flipdim(A,3)A的每个维中的矩阵不做变化,将A的每个维视为单位进行上下翻转; 8 @/ L1 u& n4 d; H8 |8 k! S
flipdim(A,4)不做任何改变; 1 I. ]' L- K4 p. K. n2 S
: j8 [- d1 Z' ?2 \2 C; t f: s( [& P
shiftdim(A,n)将A的维数进行轮换,分为轮换次数为正和轮换次数为负两种情况 " f) y* N9 F$ R* f) ^
例如:
! D0 q( S3 P% T5 G. k4 V m行n列w页经过1次维数的轮换就变为n列w行m页
7 g% i0 ~2 i5 r; |& g/ Q m行n列w页经过-1次维数的轮换就变为1行m列n页w更高的维(轮换次数为负会增加维数)
, S# V$ q) k& y, G( h7 ?4 Q* ]. A
0 ~9 H/ o: `/ z8 R v 例:>> size(A)%A的维数为2行3列3页 + s! T& {/ y' p- C6 }; n
) a+ D3 s7 E3 k) c% F7 f' q4 h o- x
ans =
T0 i% l5 A( L8 P0 S
( H) Y4 o( @7 g6 \# B 2 3 3 0 h# E4 b8 O- Z! [. z. G6 k5 o' H. }
>> B=shiftdim(A,1)%使用shiftdim对维数翻转1次 2 p5 s- F7 ^, d# F; \
z/ U' ~5 ? T& R" s6 c+ u
B(:,:,1) =
& W& _: X1 J: ?8 M. F! {6 @
+ G) E+ {) u7 t% l7 [" o 7 16 10 + f | m9 G8 ~4 L) ?$ o, U- B5 m
3 9 13 / J6 F3 k( S% ^7 e
8 2 1 % F# r0 Q0 @4 J% y& _0 B
; g" M% o# K4 h; J
! Z1 w" K; ?5 { B(:,:,2) =
5 w+ V' f" k0 T6 t7 \8 }8 E
, P7 n# R2 G3 o& L 15 17 12 ( G( N6 f: I _4 E* Y) r8 N" ^
14 18 4
6 k; A) r7 ~* ]; o+ o' F" @$ | 11 6 5 ) M8 J5 l! b7 L1 G1 F% W" ^( R( k( m
3 E& u" _, Z& n# X" S% b! x! s, ^
>> size(B)%得到的新矩阵B的维数为3行3列2页
: ~0 G9 L" E8 U. Y% P
& m9 V& q" G$ j) F$ b ans = # X5 }: n% m# R! a( a- M/ u
) O- J* M3 e6 R9 W
3 3 2 % S- m0 M3 w1 A1 y- W
>> B=shiftdim(A,-1);%对矩阵A进行-1次的轮换 7 l; M# ~- a( R4 `2 u0 k; b! h/ v
>> size(B)%得到的新矩阵B的维数为1*2*3*3 , }" y9 n ^% d& j
5 o( A+ v2 G' V ans = 0 k V0 B N9 U/ ]. U
$ z$ W$ t- J7 Z
1 2 3 3
4 ?+ n# R% z, }* d. `8 [ ) h. J' f K" X8 x
shiftdim维数轮换à联想记忆:shift+dim转换+维数 ( ]8 A5 w8 ^3 n d
shiftdim的缺点:只能将各个维数轮换,不能对调,因此便有了permute函数对其进行补充 . Q# \# P5 I. z3 \% t! u2 ^
. K4 }9 s/ u. L+ R! Q$ ^- S0 A( h permute(A,order)将矩阵A的维数按照自己喜欢的方式进行轮换或对调,括号中的order表示A的维数的任意排列,例如A是四维矩阵,那么order就必须是1234这四个数的一个任一排列
' _# ~; N: P- Z3 G 例:
0 H* p4 i' `$ k >> A=rand(2,2,3,3);%创建一个2-2-3-3的四维矩阵
$ M0 T6 {* X' x, E >> B=permute(A,[3 1 2 4])%将A的第一维变为第二维,第二维变为第三维,第三维变为第一维
- t; y" u* V) E) k 当我们用permute对一个三维数组进行四维的置换时,第四维数组一定是单一维(这也是shiftdim(A,-1)增加的维数都是单一维的原因),这是因为,任何一个数组都具有大于其本身尺寸的更高维数,并且这些维数均为单位维数。例如,一个二维数组是具有页这一维的,并且仅有一页。总之,任何超过数组本身大小的维数都是单一维。对于上述代码而言,由于M是一个三维数组,其第四维必为单一维,因此,将M第四维与第一维进行转置,第一维就变成了单一维。 , V4 ?/ R& O: o4 Y* v( c
由上面这段话,我们也容易知道:假设矩阵A的维数是二维的,当我们输入[r,c,p]=size(A)时,一定有p=1 ) O; @! |3 ^/ G- W$ r) |+ j/ K
) p! _9 c E. a: e6 q2 h Ipermute是用于取消维数转置的函数 , F- f" W, }" G2 n9 B$ i+ m& S
例:A为四维矩阵
) U' C1 V% r8 j4 [ B=permute(A,[4 3 2 1])%对矩阵A的维数进行转换
3 K7 P. R! _8 m C=ipermute(B,[4 3 2 1])%对矩阵B的维数进行逆转换,最终重新得到矩阵A
* i1 {( a. @: p6 ` * I9 H- }! Q; @/ A9 Q( R
! j% P2 C6 Q9 `/ c7 F Z, `
zan