![Figure_1]()
import numpy as np
import matplotlib.pyplot as plt
# 临时设置字体,忽略rc配置文件警告
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 原始演示向量
v = np.array([1, 0])
# 1. 五种基础变换矩阵
# 1.轴向拉伸:x拉伸2倍,y不变
M_stretch = np.array([[2, 0],
[0, 1]])
v_stretch = M_stretch @ v
# 2.整体旋转:逆时针90°
M_rotate = np.array([[0, -1],
[1, 0]])
v_rotate = M_rotate @ v
# 3.横向剪切
M_shear = np.array([[1, 1],
[0, 1]])
v_shear = M_shear @ v
# 4.镜像反射(x轴上下翻转)
M_reflect = np.array([[1, 0],
[0, -1]])
v_reflect = M_reflect @ np.array([1, 1])
# 5.混合变换:拉伸+旋转(你之前的极分解矩阵)
A = np.array([[2, -1],
[1, 2]])
v_mix = A @ v
# 创建2行3张子图
fig, axes = plt.subplots(2, 3, figsize=(16, 10))
axes = axes.flatten()
# 统一绘图函数
def plot_vec(ax, orig, trans, title, vec_name="v"):
ax.set_aspect('equal')
ax.grid(alpha=0.3)
ax.axhline(0, c='k', lw=0.7)
ax.axvline(0, c='k', lw=0.7)
ax.quiver(0, 0, orig[0], orig[1], angles='xy', scale_units='xy', scale=1,
color='blue', linewidth=2, label=f'原始向量 {vec_name}')
ax.quiver(0, 0, trans[0], trans[1], angles='xy', scale_units='xy', scale=1,
color='red', linewidth=2, label='变换后向量')
ax.set_title(title)
ax.legend()
ax.set_xlim(-2.5, 3)
ax.set_ylim(-2.5, 3)
# 子图1:轴向拉伸
plot_vec(axes[0], v, v_stretch, "1.轴向拉伸变换 矩阵[[2,0],[0,1]]")
# 子图2:整体旋转
plot_vec(axes[1], v, v_rotate, "2.整体旋转变换(90°) 矩阵[[0,-1],[1,0]]")
# 子图3:横向剪切
plot_vec(axes[2], v, v_shear, "3.横向剪切变换 矩阵[[1,1],[0,1]]")
# 子图4:镜像反射
plot_vec(axes[3], np.array([1, 1]), v_reflect, "4.镜像反射变换(x轴翻转) 矩阵[[1,0],[0,-1]]", vec_name="(1,1)")
# 子图5:混合变换
plot_vec(axes[4], v, v_mix, "5.混合变换:拉伸+整体旋转 矩阵[[2,-1],[1,2]]")
# 第6张子图空白说明
axes[5].axis('off')
text_info = """
五种基础变换特点总结:
1. 轴向拉伸:可实数特征分解,只有缩放无旋转
2. 整体旋转:复数特征值,实数域不能特征分解
3. 剪切变换:亏损矩阵,无法对角化
4. 镜像反射:实对称矩阵,可正交特征分解
5. 混合拉伸+旋转:只能用极分解/SVD分解
"""
axes[5].text(0.05, 0.95, text_info, fontsize=12, va='top')
plt.tight_layout()
plt.show()
# 打印各变换结果
print("=== 各变换向量结果 ===")
print(f"原始向量: {v}")
print(f"轴向拉伸后: {v_stretch}")
print(f"旋转90°后: {v_rotate}")
print(f"横向剪切后: {v_shear}")
print(f"镜像变换(1,1)后: {v_reflect}")
print(f"拉伸+旋转混合变换后: {np.round(v_mix,3)}")