- 在线时间
- 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、多维数组基础,关于二维数组的补充
0 }! M! @) ^& X! \1 a! J多维数组即含有多个页的数组;
e V) z& L$ [ Y3 l多维数组的处理就是在原有的函数基础上增加一个参数: , p2 p) v* \3 D, q8 p
例: " e, }4 F+ }+ i7 ^1 O
zeros(m,n,w)%创建一个m行n列w页的0矩阵
- C. @, c3 T% u/ y4 Nones(m,n,w) @9 t2 Z. D4 y* i# i% `
eye(m,n,w)
! L# D0 Y5 V0 g5 {% z2 _) Drand(m,n,w)
) S3 l* i1 N( Xrandn(m,n,w) 3 {3 L! U% P7 m8 b1 S
randperm没有多页的形式,它只能生成一个由1:n构成的随机排列的一维数组
" {5 J3 b7 l4 N8 y6 r相关函数:
J1 m* ?& ]5 {3 q* [2 R! @reshape(A,m,n,w)将矩阵A变化为一个具有m行n列w页的矩阵
3 W5 C! k' v5 g. L7 ]) M% e X' f4 qrepmat(A,[m n w])将矩阵A作为一个单位,复制到一个具有m行n列w页的矩阵中去
* V0 `/ y) I# X6 X8 a注意:当要复制到的矩阵为二维时,完全可以用这种形式:repmat(A,m,n) 9 j7 D4 [4 L @1 \4 S
Cat(3,A,B,C)将矩阵A、B、C连接成为一个3页的矩阵 ) w) F/ u2 B3 v* ~5 b
若矩阵A为n维矩阵,则size(A)将返回一个含n个元素的一维数组
2 |& {7 |1 v1 E4 O
) n+ G+ E. S4 n6 ~( M20、多维数组的翻转
- C8 L' M8 x$ ]6 Oflipdim(A,1)将A的每个维中的矩阵进行上下翻转;相当于对A的每个维使用flipud
! s$ k& X# O9 O0 zflipdim(A,2)将A的每个维中的矩阵进行左右翻转;相当于对A的每个维使用fliplr 0 y" p4 U8 g% P
flipdim(A,3)A的每个维中的矩阵不做变化,将A的每个维视为单位进行上下翻转;
' E/ m, R9 X% Y1 N* ]flipdim(A,4)不做任何改变; ( W \: s D( D0 I
( s2 g4 r, u1 K+ O" ?9 F3 `+ j/ [0 pshiftdim(A,n)将A的维数进行轮换,分为轮换次数为正和轮换次数为负两种情况
) W4 q4 A x1 ~7 G- s; Q例如: % \% b4 a( k6 @6 d* d0 I/ Q9 G6 M
m行n列w页经过1次维数的轮换就变为n列w行m页
4 ]% |, L0 c( B0 wm行n列w页经过-1次维数的轮换就变为1行m列n页w更高的维(轮换次数为负会增加维数) , t0 ]2 {/ ]. q' o+ v7 [6 u8 h0 w
: s' G: e" N% O5 |+ c- o
例:>> size(A)%A的维数为2行3列3页
- {2 P) X) s% q9 ]
7 {6 R3 c; Y0 E5 e |: J- Lans =
! a+ @5 j. i- R. b/ t0 V
7 x3 t6 n) h4 l+ J5 k$ g2 3 3 . }0 Y, B6 b! X7 X+ [8 t
>> B=shiftdim(A,1)%使用shiftdim对维数翻转1次
) o& F; U2 h* s: [+ e' \# t! r$ C" q
B(:,:,1) = # P3 u. O1 Q' M; C) z! ]" _$ _) k
0 o6 i- b3 N$ V' v7 16 10 1 Q& A3 O$ U8 h1 n$ ]4 O
3 9 13
5 m& G- ]% e# ~, z) `: o* i, Z6 m8 2 1 ( o2 _: g* F d$ o) J1 P, S. y0 n
( a$ W8 ]# V v5 A
9 V7 Y. A3 W R8 c' \
B(:,:,2) =
! f O( e' i+ O; e; l# W" |# p- ?, I9 ]
15 17 12 * n" n- ]: f' v. C _6 E! n+ u
14 18 4 4 ]2 ]5 g; B/ Y/ {4 G: C2 Q
11 6 5 0 |5 m* _% H/ X# f' i# n
1 A* R' @" P: z% x# _. M( A4 y8 s4 C
>> size(B)%得到的新矩阵B的维数为3行3列2页 $ Z* ~. I* L; _0 F& s
5 Z$ M, p9 f: e, m6 C# z8 \% |" C" g
ans = ; ?& s3 j$ X c1 R
3 c4 `4 x9 i! n5 P' x( p( I& K
3 3 2
$ X( U( j* V0 `7 | m, k. k! S7 E>> B=shiftdim(A,-1);%对矩阵A进行-1次的轮换
' s3 X* B. L" z4 F: I' n7 ~>> size(B)%得到的新矩阵B的维数为1*2*3*3 4 u) q' K! L; z+ Z9 H
3 Y/ P7 r- T7 a! `8 `+ u7 V# s( [# q
ans =
% z7 q. f7 J& R( u+ e/ n& G3 q: I
1 2 3 3
3 n/ C2 }2 d1 [! i9 [! H
& Z0 S: O% ~" {" Q7 L0 T/ Xshiftdim维数轮换à联想记忆:shift+dim转换+维数
( B- |6 _7 H# [! l$ G; {- ]shiftdim的缺点:只能将各个维数轮换,不能对调,因此便有了permute函数对其进行补充 3 y$ ^/ M. F) N0 i" h6 }2 `0 q. \
0 ]9 P' m6 n5 u( @1 i
permute(A,order)将矩阵A的维数按照自己喜欢的方式进行轮换或对调,括号中的order表示A的维数的任意排列,例如A是四维矩阵,那么order就必须是1234这四个数的一个任一排列 0 d5 f" K) `- M5 Q' b; h
例:
3 e( n7 o% ?/ d' Q$ d- o>> A=rand(2,2,3,3);%创建一个2-2-3-3的四维矩阵 # m& x( Q/ _. C6 j' _. E6 {
>> B=permute(A,[3 1 2 4])%将A的第一维变为第二维,第二维变为第三维,第三维变为第一维
- H) n$ S& k! n% m4 }0 H3 ?当我们用permute对一个三维数组进行四维的置换时,第四维数组一定是单一维(这也是shiftdim(A,-1)增加的维数都是单一维的原因),这是因为,任何一个数组都具有大于其本身尺寸的更高维数,并且这些维数均为单位维数。例如,一个二维数组是具有页这一维的,并且仅有一页。总之,任何超过数组本身大小的维数都是单一维。对于上述代码而言,由于M是一个三维数组,其第四维必为单一维,因此,将M第四维与第一维进行转置,第一维就变成了单一维。 8 \1 ^2 @ |) m
由上面这段话,我们也容易知道:假设矩阵A的维数是二维的,当我们输入[r,c,p]=size(A)时,一定有p=1
( t |9 x: [: e7 b/ [; g2 B$ W2 a2 m3 f7 N% x
Ipermute是用于取消维数转置的函数
: M+ J- Q2 Y' `( a例:A为四维矩阵 F4 s, h& G* o- j7 H! D; \# T
B=permute(A,[4 3 2 1])%对矩阵A的维数进行转换
( |% Q. J" ~! \4 |0 nC=ipermute(B,[4 3 2 1])%对矩阵B的维数进行逆转换,最终重新得到矩阵A
8 h" \( m$ ?5 z& G+ _
! _5 I# @8 U* Q3 ^3 t. [
* k; M$ ?* Y2 u |
zan
|