数学建模社区-数学中国
标题:
数学建模十类经典算法(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! a
zeros(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" a
rand(m,n,w)
2 u2 b! d9 g9 K4 V( A
randn(m,n,w)
8 D0 [2 D0 Y3 B$ y
randperm没有多页的形式,它只能生成一个由1:n构成的随机排列的一维数组
* O. B5 m1 N" [. G0 X3 }
相关函数:
8 Q* E; Y5 p9 j5 g# V% ^$ k
reshape(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 T
flipdim(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/ T
m行n列w页经过1次维数的轮换就变为n列w行m页
" C2 X# s- i z
m行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- y
ans =
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 w
3 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 N
3 K q Q3 E) B' t6 m
15 17 12
% i( @! g& Y% U2 ^- `) `. Y" B
14 18 4
1 B+ F% g+ F: g# _0 u1 _! H
11 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 V
3 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 K
1 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' b
permute(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 a
Ipermute是用于取消维数转置的函数
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. p
C=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