一个n阶变换矩阵A施加到向量x,对向量x进行线性变换,若转换后的向量T(x)与向量x方向相同,即变换矩阵A没有影响到向量x的方向,向量x则称为变换矩阵A的特征向量。
例如变换矩阵A:

向量矩阵x:

变换矩阵A施加到向量矩阵x,对x进行线性变换:

向量矩阵x和向量矩阵Ax的向量几何表示如下图所示:

图像左侧是向量矩阵x的几何图形,图像右侧是向量矩阵Ax的几何图形。对比向量矩阵x变换前后图形,可以看出向量(1,-1)和向量(1,0)变换后,方向没有发生变化,仅是在同一方向上被伸缩,向量(1,-1)和向量(1,0)也称为变换矩阵A上的特征向量。
观察下图,下图将向量矩阵x和向量矩阵Ax内的向量连接起来,构成一个四边形,经观察发现,变换前后四边形的外轮廓形状没有改变,实际上这是特征向量(1,-1)和(1,0)决定了四边形的外轮廓,因此向量(1,-1)和(1,0)也称为特征向量。

向量(1,-1)变换后向量长度放大2倍,向量(1,0)变换后向量长度放大3倍。我们来看向量(1,-1)的变换过程:

变换矩阵A施加到特征向量x(1,-1),变换结果等同于使用一个纯量γ乘以该特征向量x。
即:

γ称为特征向量x对应的特征值,上面的公式说明特征向量x应用在矩阵A上的线性变换,可以由γ确定。
我们再来看向量(1,0)的变换过程:
可以得出矩阵A的2个特征向量和特征值:
特征值γ = 2 特征向量(1,-1)
特征值γ = 3 特征向量(1,0)
可以把矩阵A的特征向量构成一个新的矩阵D,矩阵D也称为特征矩阵:

使用特征矩阵可以简化n阶矩阵A的幂运算,通过特征矩阵将矩阵A转换为对角矩阵,对角矩阵的n次运算,就是对角矩阵对角线上元素的n次运算。
对角矩阵只在主对角线上含有非零元素,其它位置都是零。

矩阵C为对角矩阵,对角矩阵也可以用向量表示:
如矩阵C用向量表示为:

对角矩阵的乘法运算非常高效,diag(v)与向量x相乘时,只需要将向量x中的每个元素x(i)放大v(i)倍即可。
如何讲矩阵A转换为对角矩阵呢?这就要用到矩阵A的特征矩阵D了,应用下面的推导公式可以讲矩阵A转换为对角矩阵,公式的推导过程可以查阅其它资料,这里就不详述了。

其中矩阵D是由矩阵A的特征向量构成的矩阵,矩阵C为矩阵A的对角矩阵,D(-1)是矩阵D的逆矩阵。矩阵A的对角矩阵为:

计算矩阵A的n次方公式如下:

C是矩阵A的对角矩阵,对角矩阵的幂运算非常简单,就是对角矩阵对角线上元素的n次运算。
例如:

附:Python绘图代码
import numpy as np
import matplotlib.pyplot as plt
# 设置中文字体
plt.rcParams['font.sans-serif']=['SimHei']
# 设置正常显示负号
plt.rcParams['axes.unicode_minus']=False
#定义变换矩阵A
def A():
return np.array([
[3,1],
[0,2]
])
# 定义待变换的向量组
# 矩阵X为变换的向量组
X = np.array([[1,-1],
[1,0],
[2,3]
])
# 绘制变换前向量组X
ax1 = plt.subplot(1,2,1)
ax1.set_title("向量矩阵X")
ax1.set_xlim(-2,2)
ax1.set_ylim(-2,2)
for item in X:
ax1.quiver(-1,-1,item[0],item[1], angles='xy', scale_units='xy', color=np.random.rand(3,),scale=1,width=0.005)
# 绘制变换后向量Tx
Ax = np.matmul(A(),np.transpose(X))
print(Ax)
ax2 = plt.subplot(1,2,2)
ax2.set_title("向量矩阵Ax")
ax2.set_xlim(-6,6)
ax2.set_ylim(-6,6)
for item in np.transpose(Ax):
ax2.quiver(-5,-2,item[0],item[1], angles='xy', scale_units='xy', color=np.random.rand(3,),scale=1,width=0.005)
plt.show()
附:计算矩阵A对角矩阵的Python代码
import numpy as np #定义矩阵A def A(): return np.array([ [3,1], [0,2] ]) #定义矩阵A的特征向量矩阵 def D(): return np.array([ [1,1], [-1,0] ]) # 计算矩阵D的逆矩阵 invD = np.linalg.inv(D()) print(invD) # 计算矩阵invD与矩阵A的乘积 invDA = np.matmul(invD,A()) # 计算矩阵A的对角矩阵 invDAD = np.matmul(invDA,D()) print(invDAD)