数学建模社区-数学中国

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

作者: 百年孤独    时间: 2016-3-30 15:58
标题: 数学建模十类经典算法(9)
19、多维数组基础,关于二维数组的补充
+ t& D2 O4 N' I& L# q" ~: ?多维数组即含有多个页的数组; + ?( d2 G) G2 ]% ?
多维数组的处理就是在原有的函数基础上增加一个参数: & q7 Z* N  ^% d6 u% m! _; b9 P; X
例: 1 G* G( Y. T# Y' K" s' ~+ }
zeros(m,n,w)%创建一个m行n列w页的0矩阵 9 u' K2 `% I* i3 U. J
ones(m,n,w)
9 r! l, _; z( Ieye(m,n,w)
0 f! U9 C5 O( ]4 lrand(m,n,w)
8 b; t( B5 S  }* ]  N6 Brandn(m,n,w) * q( y3 r/ X5 Y$ V. _5 s
randperm没有多页的形式,它只能生成一个由1:n构成的随机排列的一维数组 * o, K! i$ @# ~8 S6 R
相关函数: & y5 R, Z! z: R2 |8 Q2 g
reshape(A,m,n,w)将矩阵A变化为一个具有m行n列w页的矩阵
# S9 S- z; p2 Yrepmat(A,[m n w])将矩阵A作为一个单位,复制到一个具有m行n列w页的矩阵中去
& N1 O3 _6 _- D4 x# W- Q注意:当要复制到的矩阵为二维时,完全可以用这种形式:repmat(A,m,n) / `. ?% [3 L$ b% [. |
Cat(3,A,B,C)将矩阵A、B、C连接成为一个3页的矩阵
" P( u. `  w9 s. n0 ~0 K3 R  C若矩阵A为n维矩阵,则size(A)将返回一个含n个元素的一维数组3 \4 x9 C6 l' q( v4 P
  E: O( R& y2 L7 v$ Y( o% D& o& n, z4 }
20、多维数组的翻转
; X1 i- |6 y! v8 u$ g; q- X. B1 O. Dflipdim(A,1)将A的每个维中的矩阵进行上下翻转;相当于对A的每个维使用flipud - _) e8 q# e2 `$ P" q
flipdim(A,2)将A的每个维中的矩阵进行左右翻转;相当于对A的每个维使用fliplr
/ {& F! S" G+ F. f$ a0 I, Bflipdim(A,3)A的每个维中的矩阵不做变化,将A的每个维视为单位进行上下翻转; $ P! o6 z3 P. Y# [' @- d3 H9 `1 O
flipdim(A,4)不做任何改变;
1 O: w3 {9 O) j# J+ `: R# r& m* |& l' B: p% j
shiftdim(A,n)将A的维数进行轮换,分为轮换次数为正和轮换次数为负两种情况 9 `' W6 N* y) y& S4 {5 `# m: l
例如: + A0 \6 L& ^" X. h4 ~# N9 v
m行n列w页经过1次维数的轮换就变为n列w行m页
# ]& \4 W' E+ ^  o( f& l, h: V5 Cm行n列w页经过-1次维数的轮换就变为1行m列n页w更高的维(轮换次数为负会增加维数) 3 @' _( a0 P4 n2 `& L+ E; R
5 l7 e0 [9 A$ a* A
例:>> size(A)%A的维数为2行3列3页
$ p% E7 W( k# e8 S2 D8 l" f- l+ q2 n7 u: N: _6 G
ans =
/ ?% J) _9 \& K; Q6 S" W) q7 I9 b. L# j/ W, D
2 3 3
& b( z& S" j2 G4 A3 p>> B=shiftdim(A,1)%使用shiftdim对维数翻转1次   T4 W3 u, M3 s
* X5 ]: ~' l0 V, y+ R. c/ t
B(:,:,1) = 7 R0 k% Q+ ^; P: ~* \9 I' z: M( Y! O' @
0 S% h8 a; k% f2 L& u# {
7 16 10
! ?  a/ J6 |- T0 |3 f5 ^3 9 13
5 P0 V/ ]! E6 ~" L- R; [$ g8 2 1
' U9 d; p2 w( Z% p' a4 y2 i' _& }# B( @, {
1 i: ~" j7 p/ Z; ~
B(:,:,2) =
, s$ l6 u: X7 K  i3 D; N4 q, F$ V: Z* \
1 r$ R/ Y+ I) y( N15 17 12
4 X0 [. D/ u+ i- q14 18 4
% V/ K8 e7 V; ]11 6 5
4 s& z9 h# |# [( n3 F
9 x5 L/ ~* D4 H>> size(B)%得到的新矩阵B的维数为3行3列2页 + [$ Y, I! T" F  N3 M/ b7 n

) J3 x- f7 I  {* P) W9 X: g- `ans = 9 [9 q% w' n$ I; t* N) {* t

3 Z- D/ I, P+ l3 3 2
3 t/ {2 k/ [! c: C* K, I: X>> B=shiftdim(A,-1);%对矩阵A进行-1次的轮换 1 Y2 r* }( w, S0 n, S) |8 K
>> size(B)%得到的新矩阵B的维数为1*2*3*3 " \( W& `! u0 r
! s4 A8 e3 f3 G7 D2 f$ [# g  i/ L
ans =
- a- R' H) k, {5 x7 w. Q" z+ Q
/ _$ x8 k5 \( [  r: w; y1 2 3 3 : P* k; s# F- @. V+ G, ?1 ?

& b! M. Q9 e2 W- Q2 B* R: _6 ushiftdim维数轮换à联想记忆:shift+dim转换+维数 + H2 ~) w# w# l4 O- j1 q5 a
shiftdim的缺点:只能将各个维数轮换,不能对调,因此便有了permute函数对其进行补充
: z6 J; _9 }9 {+ @6 ?( Z
8 k+ {: ]9 H8 S! ^& {) }% i  Jpermute(A,order)将矩阵A的维数按照自己喜欢的方式进行轮换或对调,括号中的order表示A的维数的任意排列,例如A是四维矩阵,那么order就必须是1234这四个数的一个任一排列 0 R; H, e% c0 \1 O( h6 ~
例: 5 d7 J8 |- s. i
>> A=rand(2,2,3,3);%创建一个2-2-3-3的四维矩阵
( i/ b# t4 p5 u5 m3 }# V7 n>> B=permute(A,[3 1 2 4])%将A的第一维变为第二维,第二维变为第三维,第三维变为第一维 3 b; `% Y6 T. _7 D+ j9 V
当我们用permute对一个三维数组进行四维的置换时,第四维数组一定是单一维(这也是shiftdim(A,-1)增加的维数都是单一维的原因),这是因为,任何一个数组都具有大于其本身尺寸的更高维数,并且这些维数均为单位维数。例如,一个二维数组是具有页这一维的,并且仅有一页。总之,任何超过数组本身大小的维数都是单一维。对于上述代码而言,由于M是一个三维数组,其第四维必为单一维,因此,将M第四维与第一维进行转置,第一维就变成了单一维。 ; m( S9 u2 ^. b
由上面这段话,我们也容易知道:假设矩阵A的维数是二维的,当我们输入[r,c,p]=size(A)时,一定有p=1
7 k) Q) W- x+ X3 b, H: D8 K$ b4 W
/ n' K" D+ f. x9 |Ipermute是用于取消维数转置的函数 . F0 A! L; ^* M1 t
例:A为四维矩阵
# w# t( |) Q7 I0 k# hB=permute(A,[4 3 2 1])%对矩阵A的维数进行转换 1 L6 o- O9 E: `: d0 H3 P/ }: _
C=ipermute(B,[4 3 2 1])%对矩阵B的维数进行逆转换,最终重新得到矩阵A
; ]/ b/ t/ A" ^  n
) T7 k0 K8 v9 }% M2 L0 p# V; p9 _* c/ X/ j

作者: xhy520lj    时间: 2016-3-30 23:05
不错!值得借鉴!4 s8 f6 A* I0 V$ u" `





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