矩阵与线性变换
1741字,阅读需时6分钟
来自专栏
课程/专栏

变换本质是一个函数,它是一个映射,它接受输入内容并输出对应结果。

例如函数:

 001.png

当x取不同实数时,都会有唯一对应的输出结果来对应输入的x。

对线性代数来说,变换是接受一个向量,并输出一个向量。在线性代数中,一个向量到另外一个向量的映射之所以称为变换,不称为函数,是因为考虑到了向量的变换实际是向量的运动。

如:二维空间的向量A到向量B的变换,实际是向量A通过变换移动到了向量B的位置。

A =(10,0,60.0)    B=(56.6,22.3)

002.png

图中向量A到向量B的变换是一种旋转变换,该变换为线性变换,它满足下面的性质。

设旋转变换为T,对线性空间V中的任意向量A和B及实数k,均有

T(A+B)= T(A)+T(B)

T(kA) = kT(A)

要验证旋转变换是否是线性变换,需要求出变换T,看变换T是否满足线性变换的两个性质。下图是二维空间向量V围绕原点逆时针旋转的示意图。

003.png

如上图所示,向量V绕原点逆时针旋转θ角,得到向量V’,假设向量V=(x,y),则向量V’为:

004.png

旋转变换T为:

005.png

若T是线性变换,应满足线性变换的两个性质。下面我们用Python程序来验证T是线性变换。验证代码如下:

import numpy as np
 
# 定义向量A
A = np.array([3,2])
# 定义向量B
B = np.array([-1,5])
# 定义纯量K
k = 3.14
# 定义旋转角度
r = 30
 
# 定义变换T函数
# v:向量  a:旋转的角度
def T(v,a):
    # 转换为弧度
    a = a / 180 * np.pi
    # 向量v旋转a到m
    m = np.array([v[0]*np.cos(a)-v[1]*np.sin(a),
                  v[0]*np.sin(a)+v[1]*np.cos(a)])
    return m
 
print("T(A+B)=T(A)+T(B):%s:%s" % (str(T(A+B,r)),str(T(A,r)+T(B,r))))
print("kT(A)=T(kA):%s:%s" % (str(k*T(A,r)),str(T(k*A,r))))

输出结果如下图所示:

006.png

旋转变换T可以用矩阵表示,T也称为旋转变换矩阵:

007.png

计算向量V到向量V’的转换可以使用矩阵乘法:

008.png

使用矩阵乘法可以对多个二维向量组进行旋转:

009.png

Python代码如下:

import numpy as np
 
#定义旋转矩阵T
# a:旋转角度
def T(a):
    # 转换为弧度
    a = a / 180 * np.pi
    return np.array([
        [np.cos(a),-np.sin(a)],
        [np.sin(a),np.cos(a)]
    ])
 
# 定义矩阵A
# 矩阵A为待旋转的向量组
A = np.array([[3,2],
             [-1,5],
             [5,-2],
             [2,-3],
             [1,-1]
])
# 对矩阵A进行转置再相乘
C = np.matmul(T(30),np.transpose(A))
print(C)

输出结果如下图所示:

010.png

我要评论
全部评论