数学建模社区-数学中国

标题: 数学建模十类经典算法(9) [打印本页]

作者: 百年孤独    时间: 2016-3-30 15:58
标题: 数学建模十类经典算法(9)
19、多维数组基础,关于二维数组的补充 ; X& V4 c7 ^; q# t  P
多维数组即含有多个页的数组;
- j/ {# S' Y+ h: |6 F8 ^% h# R多维数组的处理就是在原有的函数基础上增加一个参数: & ^/ V/ Z: \. {# i, S  i% A2 Q
例:
5 {" U' C3 S# a8 ]% X! azeros(m,n,w)%创建一个m行n列w页的0矩阵 ; ]6 m3 z6 G* B( N( `; p
ones(m,n,w) 7 m" N1 x2 m9 |5 C5 i3 G4 f- Z
eye(m,n,w)
" P9 h( {5 u# L* S" arand(m,n,w) 2 u2 b! d9 g9 K4 V( A
randn(m,n,w)
8 D0 [2 D0 Y3 B$ yrandperm没有多页的形式,它只能生成一个由1:n构成的随机排列的一维数组 * O. B5 m1 N" [. G0 X3 }
相关函数:
8 Q* E; Y5 p9 j5 g# V% ^$ kreshape(A,m,n,w)将矩阵A变化为一个具有m行n列w页的矩阵 3 ?* r0 u$ Q) _/ }2 L
repmat(A,[m n w])将矩阵A作为一个单位,复制到一个具有m行n列w页的矩阵中去 & h: y6 W) ]( U$ _8 c2 E' n; {" L: z
注意:当要复制到的矩阵为二维时,完全可以用这种形式:repmat(A,m,n) $ z) i) a, g: F  b* q2 k1 d
Cat(3,A,B,C)将矩阵A、B、C连接成为一个3页的矩阵 9 O3 \1 p3 ?, @: z' G6 _. t
若矩阵A为n维矩阵,则size(A)将返回一个含n个元素的一维数组
3 N& |, y6 A; _3 [4 `+ [. B
3 n/ w- J/ d7 B
20、多维数组的翻转 1 }' b! F( V) l
flipdim(A,1)将A的每个维中的矩阵进行上下翻转;相当于对A的每个维使用flipud
2 h8 z* Y. b' U; z0 v& _) ^flipdim(A,2)将A的每个维中的矩阵进行左右翻转;相当于对A的每个维使用fliplr 1 @: M3 S! s* f/ L9 n7 E* S
flipdim(A,3)A的每个维中的矩阵不做变化,将A的每个维视为单位进行上下翻转;
) |, D& e2 r6 v  Z: p% ^# H9 Tflipdim(A,4)不做任何改变; - L* w$ a+ d& b, G6 ]2 n

! z& q- U! O: E4 ]5 L( V' ?shiftdim(A,n)将A的维数进行轮换,分为轮换次数为正和轮换次数为负两种情况 ; j* F  K2 n: _# Q% J7 y% S0 s
例如:
0 J. K* `! f  l/ Tm行n列w页经过1次维数的轮换就变为n列w行m页
" C2 X# s- i  zm行n列w页经过-1次维数的轮换就变为1行m列n页w更高的维(轮换次数为负会增加维数)
8 A9 Y8 n( |) x( X* w( {
8 j; w* b; D6 P* M例:>> size(A)%A的维数为2行3列3页 6 o$ t+ G. d! u; x. D

. |2 I; q  o+ b6 o2 l- yans = 3 H/ P$ n2 X- W1 o+ {! `" a

! C$ i+ b+ i2 T. _2 3 3 $ O" G4 G! K& J. y
>> B=shiftdim(A,1)%使用shiftdim对维数翻转1次 / n# s8 ~' O- G( k/ ^6 U
! i# ^1 z  o( [
B(:,:,1) = . ]# w% ?2 D5 K4 }9 o1 L
8 ?- ]7 l4 d* i3 `2 p4 l! U  S- R
7 16 10
" Z, Z2 R5 ?9 s$ v) j3 s) X6 w3 9 13 6 u# K, c/ K5 Q8 c
8 2 1
" j/ d2 ?1 t) _( `6 V8 K) `  p1 _. R" w: i
" p2 ?  z6 n7 D: V* Y
B(:,:,2) =
5 u8 t. t, ?( K! C( b3 B8 N3 K  q  Q3 E) B' t6 m
15 17 12
% i( @! g& Y% U2 ^- `) `. Y" B14 18 4
1 B+ F% g+ F: g# _0 u1 _! H11 6 5 8 o- K7 a8 a) D0 `+ H. Q

% B1 F3 L; N% m% n/ f3 ~( V>> size(B)%得到的新矩阵B的维数为3行3列2页 1 w/ a6 Z5 I$ k- s0 e3 y
0 O+ c- |" h+ E% ]3 ~+ I
ans = 3 D2 H2 u/ w0 g: n% Q

+ h! f5 {% S& c3 Y0 V3 3 2
7 ^& H) F# J9 h; H/ j>> B=shiftdim(A,-1);%对矩阵A进行-1次的轮换
! F  w. _: |8 F8 K>> size(B)%得到的新矩阵B的维数为1*2*3*3
5 t. }8 r5 `$ u4 O* e) ^5 }1 Q6 t: ], c5 ?4 F
ans =
$ V6 P% A( Y! v4 F
) Y( N' b! q" h  h7 m' j( P0 K1 2 3 3 , J; d8 a7 l  X' y/ t9 a9 N
7 x& d% m: D; V* z5 d
shiftdim维数轮换à联想记忆:shift+dim转换+维数 9 L- H2 ^) a2 j* n! W
shiftdim的缺点:只能将各个维数轮换,不能对调,因此便有了permute函数对其进行补充
$ c+ v  e' w  I2 r& \
0 \- S9 v! g& n: ?& @# Z' bpermute(A,order)将矩阵A的维数按照自己喜欢的方式进行轮换或对调,括号中的order表示A的维数的任意排列,例如A是四维矩阵,那么order就必须是1234这四个数的一个任一排列 0 @! |/ `! _& @+ ^
例: ( I, [( {8 Q) {7 ^8 N( C
>> A=rand(2,2,3,3);%创建一个2-2-3-3的四维矩阵
) e8 z* k  l! }* O>> B=permute(A,[3 1 2 4])%将A的第一维变为第二维,第二维变为第三维,第三维变为第一维 $ w! A) y6 r6 C0 O
当我们用permute对一个三维数组进行四维的置换时,第四维数组一定是单一维(这也是shiftdim(A,-1)增加的维数都是单一维的原因),这是因为,任何一个数组都具有大于其本身尺寸的更高维数,并且这些维数均为单位维数。例如,一个二维数组是具有页这一维的,并且仅有一页。总之,任何超过数组本身大小的维数都是单一维。对于上述代码而言,由于M是一个三维数组,其第四维必为单一维,因此,将M第四维与第一维进行转置,第一维就变成了单一维。
" z8 |* o6 q- k2 d( q- X由上面这段话,我们也容易知道:假设矩阵A的维数是二维的,当我们输入[r,c,p]=size(A)时,一定有p=1
# o. q0 B0 s' e6 W: A) K
  O! y: L. r. i: x1 aIpermute是用于取消维数转置的函数
1 O; y3 ~; z8 ~3 Z" l! ?% S例:A为四维矩阵 & I9 p! |9 h4 F/ W
B=permute(A,[4 3 2 1])%对矩阵A的维数进行转换
2 ]8 V3 t/ V! H1 u5 D. pC=ipermute(B,[4 3 2 1])%对矩阵B的维数进行逆转换,最终重新得到矩阵A
' h. W1 `( l& h# r# X9 u
+ l% B) V/ L& Q4 F0 H- c' U. e9 V, C( c; b

作者: xhy520lj    时间: 2016-3-30 23:05
不错!值得借鉴!
3 @5 s! N8 E% i




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5