线性变换及对应矩阵
如何判断一个操作是不是线性变换?线性变换需满足以下两个要求:
即变换
例1,二维空间中的投影操作,
“坏”例1,二维空间的平移操作,即平面平移:
%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
fig = plt.figure()
sp1 = plt.subplot(221)
vectors_1 = np.array([[0,0,3,2],])
X_1, Y_1, U_1, V_1 = zip(*vectors_1)
plt.axhline(y=0, c='black')
plt.axvline(x=0, c='black')
sp1.quiver(X_1, Y_1, U_1, V_1, angles='xy', scale_units='xy', scale=1)
sp1.set_xlim(0, 10)
sp1.set_ylim(0, 5)
sp1.set_xlabel("before shifted")
sp2 = plt.subplot(222)
vector_2 = np.array([[0,0,3,2],
[3,2,2,0],
[0,0,5,2],
[0,0,10,4]])
X_2,Y_2,U_2,V_2 = zip(*vector_2)
plt.axhline(y=0, c='black')
plt.axvline(x=0, c='black')
sp2.quiver(X_2, Y_2, U_2, V_2, angles='xy', scale_units='xy', scale=1)
sp2.set_xlim(0, 10)
sp2.set_ylim(0, 5)
sp2.set_xlabel("shifted by horizontal 2 then double")
sp3 = plt.subplot(223)
vectors_1 = np.array([[0,0,6,4],])
X_1, Y_1, U_1, V_1 = zip(*vectors_1)
plt.axhline(y=0, c='black')
plt.axvline(x=0, c='black')
sp3.quiver(X_1, Y_1, U_1, V_1, angles='xy', scale_units='xy', scale=1)
sp3.set_xlim(0, 10)
sp3.set_ylim(0, 5)
sp3.set_xlabel("double the vector")
sp4 = plt.subplot(224)
vector_2 = np.array([[0,0,6,4],
[6,4,2,0],
[0,0,8,4]])
X_2,Y_2,U_2,V_2 = zip(*vector_2)
plt.axhline(y=0, c='black')
plt.axvline(x=0, c='black')
sp4.quiver(X_2, Y_2, U_2, V_2, angles='xy', scale_units='xy', scale=1)
sp4.set_xlim(0, 10)
sp4.set_ylim(0, 5)
sp4.set_xlabel("doubled vector shifted by horizontal 2")
plt.subplots_adjust(hspace=0.33)
plt.draw()
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
plt.close(fig)
比如,上图中向量长度翻倍,再做平移,明显与向量平移后再翻倍的结果不一致。
有时我们也可以用一个简单的特例判断线性变换,检查
所以平面平移操作并不是线性变换。
“坏”例2,求模运算,
例2,旋转
所以从上面的例子我们知道,投影与旋转都是线性变换。
例3,矩阵乘以向量,
线性变换的核心,就是该变换使用的相应的矩阵。
比如我们需要做一个线性变换,将一个三维向量降至二维,
如果我们希望知道线性变换
所以我们可以根据
现在我们需要考虑,如何把一个与坐标无关的线性变换变成一个与坐标有关的矩阵呢?
在
我们打算构造一个矩阵
我们用二维空间的投影矩阵作为例子:
fig = plt.figure()
vectors_1 = np.array([[0, 0, 3, 2],
[0, 0, -2, 3]])
X_1, Y_1, U_1, V_1 = zip(*vectors_1)
plt.axis('equal')
plt.axhline(y=0, c='black')
plt.axvline(x=0, c='black')
plt.quiver(X_1, Y_1, U_1, V_1, angles='xy', scale_units='xy', scale=1)
plt.plot([-6, 12], [-4, 8])
plt.annotate('$v_1=w_1$', xy=(1.5, 1), xytext=(10, -20), textcoords='offset points', size=14, arrowprops=dict(arrowstyle="->"))
plt.annotate('$v_2=w_2$', xy=(-1, 1.5), xytext=(-60, -20), textcoords='offset points', size=14, arrowprops=dict(arrowstyle="->"))
plt.annotate('project line', xy=(4.5, 3), xytext=(-90, 10), textcoords='offset points', size=14, arrowprops=dict(arrowstyle="->"))
ax = plt.gca()
ax.set_xlim(-5, 5)
ax.set_ylim(-4, 4)
ax.set_xlabel("Project Example")
plt.draw()
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
plt.close(fig)
从图中可以看到,设输入向量的基为
找出这个矩阵并不困难,
本例中我们选取的基极为特殊,一个沿投影方向,另一个沿投影法线方向,其实这两个向量都是投影矩阵的特征向量,所以我们得到的线性变换矩阵是一个对角矩阵,这是一组很好的基。
所以,如果我们选取投影矩阵的特征向量作为基,则得到的线性变换矩阵将是一个包含投影矩阵特征值的对角矩阵。
继续这个例子,我们不再选取特征向量作为基,而使用标准基
总结通用的计算线性变换矩阵
- 确定输入空间的基
,确定输出空间的基 ; - 计算
,求出的系数 就是矩阵 的第一列; - 继续计算
,求出的系数 就是矩阵 的第二列; - 以此类推计算剩余向量直到
; - 最终得到矩阵
。
最后我们介绍一种不一样的线性变换,
设输入为
,基为 ; 则输出为导数:
,基为 ; 所以我们需要求一个从三维输入空间到二维输出空间的线性变换,目的是求导。求导运算其实是线性变换,因此我们只要知道少量函数的求导法则(如
),就能求出它们的线性组合的导数。 有
,从输入输出的空间维数可知, 是一个 矩阵, 。
最后,矩阵的逆相当于对应线性变换的逆运算,矩阵的乘积相当于线性变换的乘积,实际上矩阵乘法也源于线性变换。