" V9 ^' Y+ A z& q其中的前缀m自然是表示matrix的意思。没有m前缀的就是按元素进行的意思。最后那个转置操作,c前缀表示的是按照复数操作进行转置。$ n) @! a: O" e' D/ s) g m
5 m3 j" K9 V) u" K8 x
此外,还有一些比较常用的运算:1 h j+ V# }# }+ n/ y/ E
. j1 P, [/ c; I( F2 w
C=cross(A,B) / v- C; [' m. s5 t
Q9 o+ q* I) B! z- G, v%矢量叉乘。类似的,C=dot(A,B) 是矢量点乘 C- b- k" W- }. t" w1 @B = prod(A,dim) ?4 J2 U7 Q! V& Z' I$ `% \
: Y9 h# ]2 \# ]6 ]0 |
%数组元素的乘积,默认按列计算。dim=1是列,dim=2是按行。这个概念很重要!! & V% H9 m: _# x8 q/ ]. L类似的,B = sum(A,dim) 求数组元素的和。dim意义和以上同。 3 R1 y: Z' Y+ M5 l4 @expm() ! a5 A; b0 Q4 S% |! P' p7 J , s$ n: i) T6 R% W3 p%矩阵指数运算。与此类似的logm(), sqrtm()。其中,funm(A,fun)用来计算矩阵A对通用函数fun的函数值。% K# V; {, ]. P+ g4 _, E
6 j& J8 P& T2 v. s* N" I& i1 a* S
5.矩阵索引 ! q Z1 {" `0 H* y- q* z8 C7 R6 x; g) h" T
选择使用矩阵中的某些元素,就是所谓的矩阵索引了。! }3 x& Y4 [4 N/ y ~
[& r) i' r& t) k$ ]
A(:,j) %选取矩阵A的所有行,第j列,同理,A(i,是第i行,所有列$ o5 h- a6 p, a2 l1 o
7 ]; t+ N: S. b! u
A(:,j:k) %所有行,第j列至第k列(起点和终点均含) : O9 o+ m/ g P3 U0 T# l$ U+ A , q* z w8 o4 Y2 w4 q三、Python的处理2 c2 @0 u2 g! x$ O- ?
; Z3 G; f1 M4 R5 R* @( [
Python使用NumPy包完成了对N-维数组的快速便捷操作。使用这个包,需要导入numpy。SciPy包以NumPy包为基础,大大的扩展了numpy的能力。为了使用的方便,scipy包在最外层名字空间中包括了所有的numpy内容,因此只要导入了scipy,不必在单独导入numpy了!但是为了明确哪些是numpy中实现的,哪些是scipy中实现的,本文还是进行了区分。以下默认已经:import numpy as np 以及 impor scipy as sp3 B U1 m+ O t% T% S
! O( B) Z; p; @3 o3 j/ R
下面简要介绍Python和MATLAB处理数学问题的几个不同点。1.MATLAB的基本是矩阵,而numpy的基本类型是多为数组,把matrix看做是array的子类。2.MATLAB的索引从1开始,而numpy从0开始。 % W* E6 c$ O4 H" m 8 _0 R. o/ a) o7 [# b1.建立矩阵 0 I1 } ~8 V" ?, F: M9 I+ _ " |% `& I+ k8 B8 _% la1=np.array([1,2,3],dtype=int) #建立一个一维数组,数据类型是int。也可以不指定数据类型,使用默认。几乎所有的数组建立函数都可以指定数据类型,即dtype的取值。 # l' T+ f, A4 z( |2 t; [% _6 m# Q6 h9 G8 p7 u& W- T
a2=np.array([[1,2,3],[2,3,4]]) #建立一个二维数组。此处和MATLAB的二维数组(矩阵)的建立有很大差别。 # v( W) ]! K' ^, a! K" A& Z Z( j8 V g# N" G2 L' u同样,numpy中也有很多内置的特殊矩阵: $ e' i; d' N; i6 M7 ]$ A1 a3 S. ^% d
b1=np.zeros((2,3)) #生成一个2行3列的全0矩阵。注意,参数是一个tuple:(2,3),所以有两个括号。完整的形式为:zeros(shape,dtype=)。相同的结构,有ones()建立全1矩阵。empty()建立一个空矩阵,使用内存中的随机值来填充这个矩阵。 . G! J+ ?- Y0 d( N4 a0 E& g* d# m: I+ c
b2=identity(n) #建立n*n的单位阵,这只能是一个方阵。 N3 q7 c& x4 W# o8 S: n ( u4 V; L) x+ y. Pb3=eye(N,M=None,k=0) #建立一个对角线是1其余值为0的矩阵,用k指定对角线的位置。M默认None。 ; L9 v) y$ G+ o% o0 Z2 C - v' E( }# w6 M% B- k0 ?此外,numpy中还提供了几个like函数,即按照某一个已知的数组的规模(几行几列)建立同样规模的特殊数组。这样的函数有zeros_like()、empty_like()、ones_like(),它们的参数均为如此形式:zeros_like(a,dtype=),其中,a是一个已知的数组。" |# c5 ?; N1 p9 O. s
: ^) `: \ L( V# F8 Y' w
c1=np.arange(2,3,0.1) #起点,终点,步长值。含起点值,不含终点值。 ( l+ D5 J+ S0 a7 W. t" H" s: L& D% z) |: C" J' H( q
c2=np.linspace(1,4,10) #起点,终点,区间内点数。起点终点均包括在内。同理,有logspace()函数5 I; V, [; b. Q5 N( X" m
k4 N+ ^5 L8 y2 z: U
d1=np.linalg.companion(a) #伴随矩阵 7 q" S3 [( U7 j) U $ C3 N5 h- F' ?0 \2 ]0 ?5 s$ x* Q9 Xd2=np.linalg.triu()/tril() #作用同MATLAB中的同名函数2 U: H& F6 [, Q. y# S; I
* x" y3 y$ R; G/ ]
e1=np.random.rand(3,2) #产生一个3行2列的随机数组。同一空间下,有randn()/randint()等多个随机函数 + Q" u2 H* `, L& A! A, v0 U4 j9 l; e4 ?2 |. G, c
fliplr()/flipud()/rot90() #功能类似MATLAB同名函数。 ! N% J, |9 b7 L0 n C' Z: M / F' Q/ m" F& K6 ^# j) @7 d8 ^7 Z7 _xx=np.roll(x,2) #roll()是循环移位函数。此调用表示向右循环移动2位。6 y' M' C7 A" r& N, T% v8 a