这章讲的是MATLAB里面的常用数学算法,顺道复习一下线代。(有些概念或者术语是直译的,有的不准确以后再修正。)
线性代数
矩阵环境
创建矩阵
- matrix——将实数虚数放在一张二维表里的变量
- array ——广义的向量、矩阵、高维数表。
>> A=pascal(3) %symmetric对称矩阵,matric
A =
1 1 1
1 2 3
1 3 6
>> B=magic(3) %魔方矩阵,matric
B =
8 1 6
3 5 7
4 9 2
>> C=fix(10*rand(3,2)) %一个3-by-2的矩阵matrix
C =
8 9
9 6
1 0
>> u=[3;1;4] %一个列向量vector,m-by-1
u =
3
1
4
>> v=[2 0 -1] %一个行向量vector,1-by-n
v =
2 0 -1
>> s=7 %一个标量scalar,1-by-1
s =
7
矩阵加减法 Addition&subtraction
Note:相同size的矩阵才可以相加减
向量乘法和转置
长度相同的行向量和列向量可以相乘。谁在前谁在后都行:
- 行*列=标量。(内积、标量积、点积)
- 列*行=方阵(阶数等于行/列向量长度)。
- 两个列向量不可以做乘法,要其中一个转成行向量再乘。
任何矩阵都可以转置,“ .’ ”共轭转置,“ ’ ”普通转置
Note:symmetric对称矩阵的转置等于它本身
矩阵乘法
reflects composition of the underlying linear transformations
allow compact representation of systems of simultaneous linear equations.
- 能反映基本线性变化的规律
- 用于解联立线性方程
基本形式:C=A*B
- 其中A的列数=B的行数,或A、B中有一个为标量(标量可以乘任何)
- A为m×p矩阵,B为p×n阶矩阵,C为m×n阶矩阵。
- 不满足交换律!!!!
- 左乘一个行向量→行向量;右乘一个列向量→列向量。
单位矩阵
- 用 I 表示(斜体的I);
- 定义:对角线元素为1,其余全为0;
- 在满足维度条件时:I*A=A, A*I=A
>> eye(2,3) %不懂这种类似单位阵的矩阵有啥用
ans =
1 0 0
0 1 0
>> eye(3) %生成n阶单位阵
ans =
1 0 0
0 1 0
0 0 1
Kronecker内积
定义:Z=kron(X, Y)就是X中的每一个元素乘Y矩阵,如果X是m×n的,Y是p×q的,则Z是mp×nq的。
用途:通常X或Y是单位阵,用于将小矩阵复制扩大成大矩阵。
>> X=[1 2; 3 4]
X =
1 2
3 4
>> I=eye(2,2)
I =
1 0
0 1
>> kron(X,I)
ans =
1 0 2 0
0 1 0 2
3 0 4 0
0 3 0 4
>> kron(I,X)
ans =
1 2 0 0
3 4 0 0
0 0 1 2
0 0 3 4
范数 Norm
在matlab中可以用函数 norm(x,p)计算向量x的p范数。其中p默认为2,此时即为欧氏距离euclidean length。常用的还有p=1和p=∞
>> [norm(v,1) norm(v) norm(v,inf)]
ans =
3.0000 2.2361 2.0000
同理,可以用函数 norm(A,p)计算向量A的p范数。其中p默认为2,常用的还有p=1和p=∞
>> [norm(C,1) norm(C) norm(C,inf)]
ans =
18.0000 16.0727 17.0000
多线程运算(略)
线性方程组
computational considerations
解联立方程组可理解为——给定矩阵A和矩阵b,是否存在唯一的矩阵x,使得Ax=b或者xA=b?
对于这一问题的理解可以从1×1的矩阵考虑:
是否存在唯一的x,使得7×x=21。明显有解x=3。那么我们是怎么找到这个解的呢?我们其实做了一次除法x=21/7=3。
那么把这种思路推广到矩阵中,出现的一个问题就是,矩阵乘法没有交换律,所以有左乘右乘之分,因此除法也有左除和右除,因此前面提到的问题就有下列两种情况:
x=A\b和x=b/A
什么意思:
①A在左就左除在右就右除(左右相对于x)
②甭管是backslash还是slash,A一直在分母位置上。
由于xA=b的情况较少,下面的讨论均基于Ax=b的形式。
假设coefficient matrix 系数矩阵A是m×n的(没必要非得方阵),那么就有三种情况:
- m=n ——有唯一解 square system
- m>n ——超定,可以找到最小二乘解(?) overdetermined system
- m
算法函数
使用函数mldivide()或使用“\”
**x = A\B
x = mldivide(A,B)**
通解
通解表示Ax=b的所有可行解。获得通解的步骤为:
- 解齐次线性方程组Ax=0。具体做法是null()函数创建一个空的解空间(一组基),所有解都是这个解空间的基的线性组合。
- 找到Ax=b的一个特解。
- 前两步找到的“基+特解”就是Ax=b的通解了。
n阶系数矩阵(方阵)
对线性方程组进行初等变换,化为最简型之后:
①如果系数矩阵的秩R(A)<增广矩阵的秩R(A,b),则方程组就无解
②如果系数矩阵的秩R(A)=增广矩阵的秩R(A,b),则方程组有解,
【a】R(A)=R(A,b)=方程组未知数个数n时,有唯一解。
【b】R(A)=R(A,b)<方程组未知数个数n时,有无穷多解。
因此,在求解线性方程组的时候,可以先用rref()求增广矩阵的行最简型,或者rank()求秩
>> b2=[3;6;0];
>> A=[1 3 7;-1 4 4;1 10 18];
>> rref([A b])
ans =
1.0000 0 2.2857 2.0000
0 1.0000 1.5714 1.0000
0 0 0 0
>> rank([A b]) %rank(A)=rank([A b])<n无穷多解
ans =
2
>> b2=[3;6;0];
>> rref([A b2])
ans =
1.0000 0 2.2857 0
0 1.0000 1.5714 0
0 0 0 1.0000
>> rank([A b2]) %rank(A)<rank([A b])无解
ans =
3
(1)非奇异系数矩阵
方阵A为非奇异矩阵(nonsingular),即A是满秩矩阵(full rank),即A的行列式不为零。所以解x和b size相同。由于是方阵,因此有唯一解。
(2) 奇异系数矩阵
(为什么叫奇异矩阵,因为有0行,即singular value)
方阵A没有线性无关列,此时A不满秩,若A的秩=b的秩,则Ax=b有唯一解。否则,无穷多解。
【这里还有点乱,回去再捋捋】
对于矩阵A,如果存在一个矩阵B,使得AB=BA=I,其中I为与A,B同维数的单位阵,就称A为可逆矩阵(或者称A可逆),并称B是A的逆矩阵,简称逆阵。
矩阵A可逆的充分必要条件是|A|≠0。
奇异矩阵阵或非方阵的矩阵不存在逆矩阵,但可以用函数pinv()求其伪逆矩阵。函数返回一个与A的转置矩阵A’ 同型的矩阵X,并且满足:AXA=A,XAX=X。此时,称矩阵X为矩阵A的伪逆,也称为广义逆矩阵。
确定解
奇异方程组的求解,举例:
>> b=[5;2;12]
b =
5
2
12
>> A=[1 3 7;-1 4 4;1 10 18]
A =
1 3 7
-1 4 4
1 10 18
>> rank(A) %A是奇异的,不可逆
ans =
2
>> pinv(A)*b %用A的伪逆和b相乘
ans =
0.3850
-0.1103
0.7066
解相当于x=pinv(A)*b,所以可以通过验证:
Ax是否=b,判断该结果是否正确:
>> A*pinv(A)*b
ans =
5.0000
2.0000
12.0000
最小平方解
当rank(A)
>> b2=[3;6;0];
>> pinv(A)*b2
ans =
-1.0892
1.2512
-0.5235
>> A*pinv(A)*b2 %得到的结果是[-1;4;2]≠[3;6;0]
ans =
-1.0000
4.0000
2.0000
超定方程组
超定方程组经常出现在曲线拟合的问题中。例如,为了找出一组数据y与t之间的关系,首先输入数据:
>> load('linear.mat')
>> t=[0 .3 .8 1.1 1.6 2.3]';
>> y=[.82 .72 .63 .60 .55 .50]';
>> D=table(t,y)
D =
t y
___ ____
0 0.82
0.3 0.72
0.8 0.63
1.1 0.6
1.6 0.55
2.3 0.5
考虑用指数衰减函数建模:
这里向量y可由另外两个向量线性组合表示,一个是常向量1,另一个是exp(t),需要用最小二乘拟合法计算未知参数c1和c2.
有6组数据(上面的table),需要求两个未知数(所谓的“x”),建立6×2的矩阵(所谓的“A”)
>> E=[ones(size(t)) exp(-t)]
E =
1.0000 1.0000
1.0000 0.7408
1.0000 0.4493
1.0000 0.3329
1.0000 0.2019
1.0000 0.1003
由于y=Ec(即“b=Ax”),要求c,所以c=E\y
>> c=E\y
c =
0.4760
0.3413
可以绘制曲线观察拟合结果:
>> T=[0:0.1:2.5]'; %默认生成列向量
>> Y=[ones(size(T)) exp(-T)]*c;
>> plot(T,Y,