科学计算:Python VS. MATLAB(3)----线性代数基础0 W+ J5 T. k4 I( \( W% R7 X
0 c5 G2 ~$ Z& R, x
按:在介绍工具之前先对理论基础进行必要的回顾是很必要的。没有理论的基础,讲再多的应用都是空中楼阁。本文主要设涉及线性代数和矩阵论的基本内容。先回顾这部分理论基础,然后给出MATLAB,继而给出Python的处理。个人感觉,因为Python是面向对象的,操纵起来会更接近人的正常思维;而MATLAB大多是以函数实现的,是向对象施加的一个操作。比如,A是一个矩阵,它有一个属性attr。用Python更可能是A.attr,而用MATLAB更可能是attr(A)。 3 N. I, t. O3 M4 E 8 ~2 U0 a ^: ~# N D" |一、线形代数理论基础/ F2 I. m6 n$ u* Q
* t; T7 W5 t2 a2 ]3 f 线形代数(linear algebra)是数学的一个分支,研究矩阵理论、向量空间、线性变换和有限维线形方程组等内容。 % }% I/ ]2 ^# X( p 3 w. S' x4 R/ `* e8 } 比较重要的思想有:1.线性代数的核心内容是研究有限维线性空间的结构和线性空间的线性变换;2.向量的线性相关性是研究线性空间结构与线性变换理论的基础;3.矩阵是有限维线性空间的线性变换的表示形式;4.线性方程组的求解问题是n维空间到m维空间线性映射求核和全体原象的问题;5.行列式是研究这些问题的一个工具。* Z2 j( h9 F" i' ]6 y/ B4 _5 E
, I) s9 @: G! ?6 A: ^! d6 V5 ]
主要内容有:1.矩阵运算:加减乘除、转置、逆矩阵、行列式、矩阵的幂、伴随矩阵;2.矩阵分块、秩、迹;3.解方程;4.线性相关;5.向量空间;6.特征值和特征向量;7.对称、相似;8.二次标准型;9.线性空间和基变换;10.正交空间;11.矩阵对角化;13.矩阵分解;14.重要数字特征。 - O, |3 O; [: ^ ! {6 n: V n6 m7 s/ t" d8 F+ P3 A二、MATLAB的处理 % B; x2 E3 w) u/ E: K6 v$ O" k, u% }' w* b: I5 q. Z
1.建立矩阵 % I2 L1 w; n X' ~1 [9 g4 w5 H/ i4 X: | 5 U; I j& _0 ^, T$ lMATLAB中,矩阵是默认的数据类型。它把向量看做1×N或者N×1的矩阵。( G7 [/ q* v9 I9 s Q* F4 O0 f, E
3 X5 _/ [ ]4 |
%建立了一个行向量,不同元素之间使用空格或者逗号分开都是可以的。 8 h# z( {! p P6 ? \: M' C # [2 b1 r% x# v/ OA=[1,2,3] 或者 A=[1 2 3] # t% {* ^7 ^+ S* q! ]% b6 f2 C1 q6 c. J: `1 ^$ c. g* i$ i$ d
%建立一个矩阵,使用分号隔开不同的行。 % ]* l, i+ O% |' N( R & |3 n) R7 Y" a$ l+ QA=[1,2,3;4,5,6]- ~3 K* I- l+ M, v
9 ^; w3 F4 ?6 B8 I
%那么,建立一个列向量就好办了。每行一个元素,分号分开即可。当然也可以使用行向量的转置(一个撇号表示转置)。 8 |3 K6 l, c, V( ~; m2 D3 R& ?- q/ [1 }& {* O( W3 e2 A, f, k' J' [7 K
A=[1;2;3] 或者 A=[1,2,3]’3 A5 f9 D- ^, q% ?$ n, u
5 L) e' j' N4 g% Y
MATLAB内置了很多特殊的矩阵生成函数,建立特殊矩阵十分方便。 # t+ v% Q" B; v/ Y) X- `* p/ c7 P ]; j
i)第一组用来生成特殊规则的矩阵。如全零、全一、随机、等步长等形式。: C9 |) w" A9 t+ {( e
' H! C4 M2 S G( V% j3 y f
X=zeros(m,n) 7 }: B) U" m2 ]+ y+ l0 a1 s6 D, Z, X0 T9 l; e
%生成一个m*n的全0矩阵。同理,ones(m,n)生成一个全1矩阵;eye(m,n)生成一个单位阵。它们的重要作用在于预先分配矩阵空间,所以,在预知矩阵规模但是不知道矩阵具体数据的情况下,先用这几个函数生成一个矩阵,对提高运算速度十分有用。 + W8 O; h4 Q3 _# h0 j3 p# P. E3 i6 J9 l/ `$ K1 w* k" h- n
X=rand(m,n) - {; D @* S' {9 r
' x5 T" L& z+ p
%生成一个平均分布的随机矩阵,数值区间[0,1]。同理,randn(m,n)生成一个服从正态分布的随机矩阵。注意,这些所谓的随机实际上都是伪随机。) X( _! Z: m) g2 K
( T/ A, u; y- N
v=linspace(a,b,n) # S, M% M. o; Q* q& W
8 ?$ O* Q% e; ~' I
%产生线性空间矢量。a和b分别是起点和终点,n是本区间内的点数,默认100个点。同理,logspace(a,b,n)产生对数空间矢量。不过它默认点数是50个。 ) ?" U2 L* b# u2 |$ F1 i+ w2 l 6 B& ^, w" G0 V1 V$ j8 |9 M! hv=1:0.1:10 P8 X5 U4 n% P! M* |4 p" z - N9 T, ?8 g! [+ X: I; x. {5 g%产生一个线性的矢量。规格是---起点:步长值:终点 ( o8 M% p \2 X5 m) }! R' s" n9 Q; H' N5 e
ii)第二组用来在原有矩阵基础上获得一个具有某些特征的矩阵。 o* d* U, @. |9 G% h) A, K
) N7 l" q% R" B$ Q( u Z. H0 v5 }X=diag(v,k)和v=diag(X,k) ) x0 h5 H% I. P( c( G$ g! Z) V: X# l: L0 _$ ^
%前者用矢量v中的元素生成一个对角矩阵,k是对角移位因子,默认为0,即主对角。k>0,对角线右移。后者返回矩阵X的对角元素,存在矢量v中。k的意义相同。 3 g6 k. k$ V1 u p- _ ! p) C: y$ i% L1 W2 q4 KX1=triu(X,k)和X1=tril(X,k) ' M4 E, z; k P9 O& p
$ l; u6 C8 {6 H4 c5 \- T1 L. X %分别产生矩阵X的上三角矩阵和下三角矩阵。2 H, X( X9 \* J, V( Z/ V
2 Z% o# A. S1 G) S
fliplr(X)/flipud(X)/rot90(X) 0 {; Q8 n: V$ H: c2 u6 m; ?8 U6 q3 x5 j( W# H3 z3 N3 o& S) Y* A% \
%这都是对矩阵的翻转操作,获得新的矩阵。分别是左右翻转(left-right)、上下翻转(up-down)和逆时针旋转90°操作。1 n6 ?3 h( R- m% E
" [/ r- v8 D3 @. c- t9 y: ?iii)第三组用来生成一些具有理论价值的,往往是以数学家命名的矩阵。 " y1 V" L/ y8 Q$ e+ L 1 L- ]4 I2 B8 }5 e3 j Zmagic(n)生成行列相加均为同一个数字的方阵。pascal(n)生成帕斯卡尔矩阵。hilb(n)生成希尔伯特矩阵。vander(v)生成范德蒙德矩阵。等等。5 l5 p" I. l" ^. I+ o2 G R; i7 K
2 _( S k9 `( ?7 A& b, u
这些矩阵一般都有相应的学术背景,用到的时候,可以用命令help elmat在最后一个栏目中看看有没有自己要找的特殊矩阵,如果有,点进去进一步研究即可。- K; h: u3 s: f% ^! d7 ^
& U. }0 Q! |) X; b& |$ S6 |; H! u2.矩阵的特征信息# _+ z' p& _" |6 f
# Y/ H2 F' y4 |& v2 X1 j0 G. i- ^
size(X) %获得矩阵X的行、列数。比如,X是一个3*5的矩阵,p=size(X)返回p=[3 5] * m* x7 U/ [- y. y# H! u( u: y ( ~) S/ w3 D; w% Q e# Nlength() %对于矢量,返回的是矢量的长度;对数组,返回的是数组最长的那一个维度的长度。 " I4 N- s& |# v' t; j- `! C4 c* w& t+ ~# g
ndims() %相当于length(size(x))。' U7 T' h6 B6 z. Z
# z3 R$ _3 W& g) X1 Q* m
numel() %数组中元素的个数。 . b4 ]" |7 P2 V( ?, @* p8 p+ p 2 u6 z0 ]: h" |2 ^' W, U; I8 Zisempty()和isequal()等is*型函数 %测试矩阵是否满足某些条件 ' [4 b* k/ r0 ^, A2 T* M! j, e) n1 i. A6 c# X/ g
[V,D] = eig(A) %矩阵A的特征值D和特征向量V。" O |# l$ }7 C+ X) o* S