矩阵对向量的操作

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)}")![Figure_1](https://img2024.cnblogs.com/blog/2143851/202606/2143851-20260627101745921-831390815.png)
posted @ 2026-06-27 10:18  redufa  阅读(5)  评论(0)    收藏  举报