矩阵是一个表示二维空间的数组,这种数组很精妙,很有用,所以很多人来研究它。矩阵可以看作是一个变换。在线形代数中,矩阵可以把一个向量瞬间变换到另一个位置(或者从一个坐标系变到另一个坐标系,一个意思)。矩阵的“基”,实际就是变换时候用的坐标系。而所谓的相似矩阵,就是同样的变换,只不过使用了不同的坐标系。线形代数中费了很大力气来找相似矩阵,实际上就是要使这些相似的矩阵有一个好看的外表,而不改变其变换的功用。
矩阵虽然是二维空间的,但是我们常常把矩阵的大小成为矩阵的维度。比如一个3乘3的矩阵就可以说是一个三维矩阵。
矩阵转置(Transpose)
两个转置的矩阵A和B有如下特点
Aij = Bji
反矩阵(Inverse)
互为反阵的矩阵有如下特点
AB = BA = I
若B为A的反阵,则B = A^-1
有(AB)^-1 = B^-1 * A^-1
矩阵乘法符合结合律(Associative),如
(AB)C = A(BC)
符合分布律(Distributive)
A(B + C) = AB + AC
不符合交换律(Commutative)
AB != BA
定义一个n*n的行列式
det A = |A| = sigma( (-1)^(1+i) * A1i ), i = 1 to n
矩阵可以用来表示欧拉角的旋转,叫做旋转矩阵。有关欧拉角,看这里 。
例如:
绕x轴旋转x度:
1 0 0
Rx = 0 cosx sinx
0 -sinx cosx
绕y轴旋转y度:
cosy 0 -siny
Ry = 0 1 0
siny 0 cosy
绕z轴旋转z度:
cosz sinz 0
Rz = -sinz cosz 0
0 0 1
以上公式可由空间几何知识推导出来。注意组合矩阵时次序很重要。
Rx * Ry != Ry * Rx
如果除了用矩阵表达旋转,还要表达物体平移,那么可以加上一个元素构成4乘4的矩阵。下面给出一个例子。
空间里面的一个物体,先把它平移(0, 1200, 0) ,再绕x旋转-0.25弧度,最后再平移(0, -1200, 0),怎样用矩阵表示?
根据:
cos(0.25) = 0.969
sin(0.25) = 0.247
cos(-0.25) = 0.969
sin(-0.25) = -0.247
令:
I1=
1 0 0 0
0 1 0 0
0 0 1 0
0 1200 0 1
I2 =
1 0 0 0
0 .969 -.247 0
0 .247 .969 0
0 0 0 1
I3 =
1 0 0 0
0 1 0 0
0 0 1 0
0 -1200 0 1
m = I3 * I2 * I1 =
1 0 0 0
0 0.969 -0.247 0
0 0.247 0.969 0
0 37.2 296.4 1
若有一个点a在(7,1000,900),移动后的坐标为a * m = (7 , 1228.5, 921.5)。若有一点b在(53, 0, 900), 移动后的坐标在 b * m = (53 , 259.5 , 1168.5)。
注意这样一个现象:a和b的运动顺序是I1->I2->I3,但是运算顺序却应该是 a * I3 * I2 * I1 和 b * I3 * I2 * I1
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
另一种旋转矩阵:
绕x轴旋转x度:
1 0 0
Rx = 0 cosx -sinx
0 sinx cosx
绕y轴旋转y度:
cosy 0 siny
Ry = 0 1 0
-siny 0 cosy
绕z轴旋转z度:
cosz -sinz 0
Rz = sinz cosz 0
0 0 1
举例:
I1 =
1 0 0 0
0 1 0 1200
0 0 1 0
0 0 0 1
I2 =
1.0000 0 0 0
0 0.9690 0.2470 0
0 -0.2470 0.9690 0
0 0 0 1.0000
I3 =
1 0 0 0
0 1 0 -1200
0 0 1 0
0 0 0 1
m2 = I1 * I2 * I3 =
1.0000 0 0 0
0 0.9690 0.2470 37.2000
0 -0.2470 0.9690 296.4000
0 0 0 1.0000
m2 * a' =
7
1228.5
921.5
1
原理与之前描述的类似,只是变换矩阵的格式稍加改变,乘法顺序相反,可以得到同样的结果。这种形式在图形学中也很常见。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
以上是绕某轴旋转的矩阵,下面介绍一种关于如何在已知最终方向的情况下构建旋转矩阵的方法。
根据两个向量的叉乘法则,互相垂直的两个向量叉乘之积为第三个正交轴的向量。那么,在已知旋转后两个方向x(左向)和y(上方)的情况下,可以求出第三轴z(正前方)的方向。
设x = (x1 x2 x3)
y = (y1 y2 y3)
z = x * y = (z1 z2 z3) =
(
x2y3 - x3y2
x3y1 - x1y3
x1y2 - x2y1
)
=
|i j k |
|x1 x2 x3|
|y1 y2 y3|
再由x, y和z构建旋转矩阵:
x1 x2 x3
y1 y2 y3
z1 z2 z3