首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【愚公系列】2023年08月 3D数学-矩阵运算和变换

【愚公系列】2023年08月 3D数学-矩阵运算和变换

作者头像
愚公搬代码
发布2025-05-28 17:29:50
发布2025-05-28 17:29:50
14700
代码可运行
举报
文章被收录于专栏:历史专栏历史专栏
运行总次数:0
代码可运行

前言

1.矩阵的定义

矩阵是由数字或符号排成的矩形阵列。矩阵中的每个数字或符号称为元素。矩阵用于在数学、物理学、工程学和计算机科学等领域中描述和解决线性方程组、向量、转换、空间几何等问题。矩阵通常由方括号表示,如下所示:

A = \begin{bmatrix} a_{11} & a_{12} & \cdots & a_{1n} \\ a_{21} & a_{22} & \cdots & a_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{m1} & a_{m2} & \cdots & a_{mn} \\ \end{bmatrix}

其中,

a_{ij}

表示矩阵

A

的第

i

行第

j

列的元素。

m

表示矩阵的行数,

n

表示矩阵的列数。如果一个矩阵的行数和列数相等,那么它就是一个方阵。

2.矩阵和方程的关系

矩阵和方程有着密切的关系,矩阵可以用来表示方程的系数,从而可以通过矩阵运算来求解方程。

具体来说,对于一个包含

n

个未知数的线性方程组,可以将其表示为如下形式:

\begin{cases} a_{11}x_1 + a_{12}x_2 + \cdots + a_{1n}x_n = b_1 \\ a_{21}x_1 + a_{22}x_2 + \cdots + a_{2n}x_n = b_2 \\ \cdots \\ a_{n1}x_1 + a_{n2}x_2 + \cdots + a_{nn}x_n = b_n \\ \end{cases}

其中,

a_{ij}

表示第

i

个方程中第

j

个未知数的系数,

b_i

表示第

i

个方程的等式右边的常数。

将上述方程组中的系数和常数放在一个

n\times(n+1)

的矩阵中,即:

\begin{pmatrix} a_{11} & a_{12} & \cdots & a_{1n} & b_1 \\ a_{21} & a_{22} & \cdots & a_{2n} & b_2 \\ \cdots & \cdots & \cdots & \cdots & \cdots \\ a_{n1} & a_{n2} & \cdots & a_{nn} & b_n \\ \end{pmatrix}

可以发现,在这个矩阵中,每个方程的系数和常数都被组织为矩阵的一行,而整个方程组则被组织为矩阵的

n

行。这个矩阵被称为增广矩阵。

对于这个增广矩阵,可以通过一系列矩阵变换来将其化简为一个简单的形式,从而可以求解这个方程组。

矩阵变换的具体步骤包括交换矩阵中的两行、将矩阵中某一行乘以一个非零常数、将矩阵中某一行加上另一行的某个倍数。通过这些矩阵变换,可以将增广矩阵化为如下形式:

\begin{pmatrix} a_{11}^{'} & a_{12}^{'} & \cdots & a_{1n}^{'} & b_1^{'} \\ 0 & a_{22}^{'} & \cdots & a_{2n}^{'} & b_2^{'} \\ \cdots & \cdots & \cdots & \cdots & \cdots \\ 0 & 0 & \cdots & a_{nn}^{'} & b_n^{'} \\ \end{pmatrix}

其中,矩阵中的斜线上方都是

0

,而斜线上的元素则称为主元。

通过这种化简方式,可以用简单的代数运算来解决方程组问题,矩阵成为了一个重要的工具。

一、矩阵运算和变换

1.矩阵运算

1.1 矩阵加减

矩阵加减是指两个相同维数的矩阵进行加减运算。

设A和B为两个n行m列的矩阵,则它们的和C = A + B也是一个n行m列的矩阵,其中C的每个元素为A和B对应元素的和,即Cij = Aij + Bij。

同理,它们的差D = A - B也是一个n行m列的矩阵,其中D的每个元素为A和B对应元素的差,即Dij = Aij - Bij。

1.2 矩阵乘标量

矩阵乘标量是指将一个标量(通常为实数或复数)乘以一个矩阵的每一个元素。假设

A

是一个

m \times n

的矩阵,

k

是一个标量,则

A

乘以

k

的结果为:

kA = \begin{bmatrix} k a_{11} & k a_{12} & \cdots & k a_{1n} \\ k a_{21} & k a_{22} & \cdots & k a_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ k a_{m1} & k a_{m2} & \cdots & k a_{mn} \end{bmatrix}

其中

a_{ij}

表示矩阵

A

的第

i

行第

j

列的元素。注意,矩阵乘标量仅仅是将矩阵的每个元素乘以标量,而不会改变矩阵的形状。

1.3 矩阵相乘

矩阵相乘是指将两个矩阵按照一定的规则进行相乘,得到一个新的矩阵。具体的规则是:

设A是一个m × n的矩阵,B是一个n × p的矩阵,那么矩阵C = AB就是一个m × p的矩阵,且它的每个元素cij都是由A的第i行与B的第j列对应元素相乘后求和得到的,即:

cij = Σ(ai * bj),其中i = 1, 2, …, m,j = 1, 2, …, p。

其中,ai表示A矩阵第i行的元素,bj表示B矩阵第j列的元素。

需要注意的是,只有当矩阵A的列数等于矩阵B的行数时,才能进行矩阵相乘操作。否则会出现维度不匹配的错误。

2.3*3矩阵旋转

2.1 矩阵X旋转

矩阵绕X轴旋转的公式如下:

代码语言:javascript
代码运行次数:0
运行
复制
[1     0           0       ]
[0     cosθ        -sinθ   ]
[0     sinθ        cosθ    ]

其中,θ表示旋转角度。这个公式的推导可以通过以下步骤进行:

  1. 假设有一个三维向量a = [x, y, z],它绕X轴旋转θ角度后变为b = [x’, y’, z’]。
  2. 我们可以将向量a投影到XOY平面上,得到长度为r = sqrt(y^2 + z^2)的向量c = [0, y/r, z/r],即c的长度为1。
  3. 根据三角函数的定义,可以得到绕X轴旋转θ角度后的向量b的坐标为:
代码语言:javascript
代码运行次数:0
运行
复制
x' = x
y' = c[2] * cosθ - c[3] * sinθ = y * cosθ - z * sinθ
z' = c[2] * sinθ + c[3] * cosθ = y * sinθ + z * cosθ

其中,c[2]表示向量c在Y轴上的投影,c[3]表示向量c在Z轴上的投影。

  1. 将上面的公式写成矩阵形式,可以得到绕X轴旋转θ角度的矩阵为:
代码语言:javascript
代码运行次数:0
运行
复制
[1     0           0       ]
[0     cosθ        -sinθ   ]
[0     sinθ        cosθ    ]

这就是绕X轴旋转θ角度的矩阵公式。

2.2 矩阵Y旋转

矩阵绕Y轴旋转的角度为θ时,可以通过以下推导得出旋转矩阵:

假设需要旋转的点为P=(x, y, z),则旋转后得到的点P’=(x’, y’, z’),其中:

x’ = x * cosθ + z * sinθ y’ = y z’ = -x * sinθ + z * cosθ

将上述式子整合成矩阵形式,得到旋转矩阵R:

R = | cosθ 0 sinθ 0 | | 0 1 0 0 | | -sinθ 0 cosθ 0 | | 0 0 0 1 |

其中,第一行和第三行代表了x和z坐标的旋转,第二行代表y坐标不变,最后一行代表不变量。

因此,对于任意一个绕Y轴旋转角度为θ的点P,可以通过R矩阵的变换得到旋转后的点P’。

2.3 矩阵Z旋转

假设旋转矩阵为

R_z(\theta)

,表示绕Z轴旋转角度

\theta

,则:

R_z(\theta) = \begin{bmatrix} \cos\theta & -\sin\theta & 0 \\ \sin\theta & \cos\theta & 0 \\ 0 & 0 & 1 \end{bmatrix}

在推导过程中,我们可以使用以下两条性质:

  1. 矩阵乘法结合律:
(AB)C = A(BC)

  1. 对于任意向量
\mathbf{v} = (x,y,z)^T

,绕Z轴旋转角度

\theta

的公式为:

\begin{aligned} R_z(\theta)\mathbf{v} &= \begin{bmatrix} \cos\theta & -\sin\theta & 0 \\ \sin\theta & \cos\theta & 0 \\ 0 & 0 & 1 \end{bmatrix}\begin{bmatrix} x \\ y \\ z \end{bmatrix} \\ &= \begin{bmatrix} \cos\theta x - \sin\theta y \\ \sin\theta x + \cos\theta y \\ z \end{bmatrix} \end{aligned}

现在考虑将矩阵

R_z(\theta)

表示成两个矩阵的乘积的形式。我们需要将其矩阵元分解成两个矩阵的矩阵元的乘积。

设有矩阵

A

B

,满足:

AB = \begin{bmatrix} a_{11} & a_{12} & a_{13} \\ a_{21} & a_{22} & a_{23} \\ a_{31} & a_{32} & a_{33} \end{bmatrix}\begin{bmatrix} b_{11} & b_{12} & b_{13} \\ b_{21} & b_{22} & b_{23} \\ b_{31} & b_{32} & b_{33} \end{bmatrix} = \begin{bmatrix} c_{11} & c_{12} & c_{13} \\ c_{21} & c_{22} & c_{23} \\ c_{31} & c_{32} & c_{33} \end{bmatrix}

则有:

\begin{aligned} c_{11} &= a_{11}b_{11} + a_{12}b_{21} + a_{13}b_{31} \\ c_{12} &= a_{11}b_{12} + a_{12}b_{22} + a_{13}b_{32} \\ c_{13} &= a_{11}b_{13} + a_{12}b_{23} + a_{13}b_{33} \\ c_{21} &= a_{21}b_{11} + a_{22}b_{21} + a_{23}b_{31} \\ c_{22} &= a_{21}b_{12} + a_{22}b_{22} + a_{23}b_{32} \\ c_{23} &= a_{21}b_{13} + a_{22}b_{23} + a_{23}b_{33} \\ c_{31} &= a_{31}b_{11} + a_{32}b_{21} + a_{33}b_{31} \\ c_{32} &= a_{31}b_{12} + a_{32}b_{22} + a_{33}b_{32} \\ c_{33} &= a_{31}b_{13} + a_{32}b_{23} + a_{33}b_{33} \end{aligned}

现在我们考虑将

R_z(\theta)

分解成两个矩阵

A

B

的乘积形式。注意到对于

\theta=0

时,

R_z(\theta)

就是单位矩阵,因此我们可以选择

A

B

满足

A=\mathbf{I}

(单位矩阵)和

B=R_z(\theta)

现在我们要找到矩阵

A

B

的矩阵元分解形式,使得

AB=R_z(\theta)

。根据矩阵乘法结合律,我们可以先假设

A

B

的某些矩阵元的乘积等于

R_z(\theta)

的对应矩阵元,然后求解这些矩阵元的值。

具体来说,我们假设:

\begin{aligned} a_{11}b_{11} + a_{12}b_{21} + a_{13}b_{31} &= \cos\theta & &\qquad a_{11}b_{12} + a_{12}b_{22} + a_{13}b_{32} &= -\sin\theta \\ a_{21}b_{11} + a_{22}b_{21} + a_{23}b_{31} &= \sin\theta & &\qquad a_{21}b_{12} + a_{22}b_{22} + a_{23}b_{32} &= \cos\theta \\ a_{31}b_{11} + a_{32}b_{21} + a_{33}b_{31} &= 0 & &\qquad a_{31}b_{12} + a_{32}b_{22} + a_{33}b_{32} &= 0 \\ \end{aligned}

由此可以得到:

A = \begin{bmatrix} \cos\theta & -\sin\theta & 0 \\ \sin\theta & \cos\theta & 0 \\ 0 & 0 & 1 \end{bmatrix},\ B = \begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix}

因此,我们可以将

R_z(\theta)

表示成两个矩阵的乘积形式:

R_z(\theta) = \begin{bmatrix} \cos\theta & -\sin\theta & 0 \\ \sin\theta & \cos\theta & 0 \\ 0 & 0 & 1 \end{bmatrix}\begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix}

这就是

R_z(\theta)

的矩阵分解形式,其中第一个矩阵表示绕Z轴旋转

\theta

角度的变换,第二个矩阵表示单位变换。

3.4*4矩阵旋转

3.1 矩阵X旋转

首先,我们需要知道绕X轴旋转的矩阵表达式:

\begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & \cos \theta & -\sin \theta & 0 \\ 0 & \sin \theta & \cos \theta & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}

其中,

\theta

表示绕X轴旋转的角度。

接下来,我们来推导4*4矩阵绕X旋转矩阵。

假设我们有一个4*4矩阵A:

\begin{bmatrix} a_{11} & a_{12} & a_{13} & a_{14} \\ a_{21} & a_{22} & a_{23} & a_{24} \\ a_{31} & a_{32} & a_{33} & a_{34} \\ a_{41} & a_{42} & a_{43} & a_{44} \end{bmatrix}

为了让矩阵A绕X轴旋转,我们可以如下操作:

  1. 将矩阵A进行平移,使其中心点处于原点。

这一步操作可以通过平移矩阵来实现:

\begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ -\frac{a_{11}+a_{21}+a_{31}+a_{41}}{4} & -\frac{a_{12}+a_{22}+a_{32}+a_{42}}{4} & -\frac{a_{13}+a_{23}+a_{33}+a_{43}}{4} & 1 \end{bmatrix}\begin{bmatrix} a_{11} & a_{12} & a_{13} & a_{14} \\ a_{21} & a_{22} & a_{23} & a_{24} \\ a_{31} & a_{32} & a_{33} & a_{34} \\ a_{41} & a_{42} & a_{43} & a_{44} \end{bmatrix}=\begin{bmatrix} a'_{11} & a'_{12} & a'_{13} & a'_{14} \\ a'_{21} & a'_{22} & a'_{23} & a'_{24} \\ a'_{31} & a'_{32} & a'_{33} & a'_{34} \\ a'_{41} & a'_{42} & a'_{43} & a'_{44} \end{bmatrix}
  1. 绕X轴旋转角度为
\theta

这一步操作可以通过绕X轴旋转矩阵来实现:

\begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & \cos \theta & -\sin \theta & 0 \\ 0 & \sin \theta & \cos \theta & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}\begin{bmatrix} a'_{11} & a'_{12} & a'_{13} & a'_{14} \\ a'_{21} & a'_{22} & a'_{23} & a'_{24} \\ a'_{31} & a'_{32} & a'_{33} & a'_{34} \\ a'_{41} & a'_{42} & a'_{43} & a'_{44} \end{bmatrix}=\begin{bmatrix} a''_{11} & a''_{12} & a''_{13} & a''_{14} \\ a''_{21} & a''_{22} & a''_{23} & a''_{24} \\ a''_{31} & a''_{32} & a''_{33} & a''_{34} \\ a''_{41} & a''_{42} & a''_{43} & a''_{44} \end{bmatrix}
  1. 将矩阵A进行平移,使其回到原来的位置。

这一步操作可以通过平移矩阵来实现:

\begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ \frac{a_{11}+a_{21}+a_{31}+a_{41}}{4} & \frac{a_{12}+a_{22}+a_{32}+a_{42}}{4} & \frac{a_{13}+a_{23}+a_{33}+a_{43}}{4} & 1 \end{bmatrix}\begin{bmatrix} a''_{11} & a''_{12} & a''_{13} & a''_{14} \\ a''_{21} & a''_{22} & a''_{23} & a''_{24} \\ a''_{31} & a''_{32} & a''_{33} & a''_{34} \\ a''_{41} & a''_{42} & a''_{43} & a''_{44} \end{bmatrix}=\begin{bmatrix} b_{11} & b_{12} & b_{13} & b_{14} \\ b_{21} & b_{22} & b_{23} & b_{24} \\ b_{31} & b_{32} & b_{33} & b_{34} \\ b_{41} & b_{42} & b_{43} & b_{44} \end{bmatrix}

于是,我们得到了4*4矩阵绕X旋转矩阵:

\begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & \cos \theta & -\sin \theta & 0 \\ 0 & \sin \theta & \cos \theta & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}\begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ -\frac{a_{11}+a_{21}+a_{31}+a_{41}}{4} & -\frac{a_{12}+a_{22}+a_{32}+a_{42}}{4} & -\frac{a_{13}+a_{23}+a_{33}+a_{43}}{4} & 1 \end{bmatrix}\begin{bmatrix} a_{11} & a_{12} & a_{13} & a_{14} \\ a_{21} & a_{22} & a_{23} & a_{24} \\ a_{31} & a_{32} & a_{33} & a_{34} \\ a_{41} & a_{42} & a_{43} & a_{44} \end{bmatrix}\begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ \frac{a_{11}+a_{21}+a_{31}+a_{41}}{4} & \frac{a_{12}+a_{22}+a_{32}+a_{42}}{4} & \frac{a_{13}+a_{23}+a_{33}+a_{43}}{4} & 1 \end{bmatrix}=\begin{bmatrix} b_{11} & b_{12} & b_{13} & b_{14} \\ b_{21} & b_{22} & b_{23} & b_{24} \\ b_{31} & b_{32} & b_{33} & b_{34} \\ b_{41} & b_{42} & b_{43} & b_{44} \end{bmatrix}

其中,

b_{ij}

表示旋转后的矩阵元素。

3.2 矩阵Y旋转

假设我们要将一个点

(x, y, z)

绕 Y 轴旋转

\theta

角度,那么旋转后的新点坐标为

(x', y', z')

我们可以先将坐标系绕 Y 轴逆时针旋转

\theta

角度,这样点

(x, y, z)

就落在了新的坐标系中。此时,点

(x', y', z')

的坐标就是它在新坐标系中的坐标。然后再将坐标系逆时针旋转

-\theta

角度,这样点

(x', y', z')

就回到了原来的坐标系中。

根据三维坐标系中的旋转矩阵推导公式可知:

\begin{bmatrix}x'\\y'\\z'\\1\end{bmatrix} = \begin{bmatrix}\cos\theta & 0 & \sin\theta & 0\\0 & 1 & 0 & 0\\-\sin\theta & 0 & \cos\theta & 0\\0 & 0 & 0 & 1\end{bmatrix} \begin{bmatrix}x\\y\\z\\1\end{bmatrix}

因此,绕 Y 轴旋转

\theta

角度的矩阵为:

\begin{bmatrix}\cos\theta & 0 & \sin\theta & 0\\0 & 1 & 0 & 0\\-\sin\theta & 0 & \cos\theta & 0\\0 & 0 & 0 & 1\end{bmatrix}
3.3 矩阵Z旋转

假设我们有一个4x4的矩阵

M

,它的每个元素为

m_{ij}

,我们想要将它绕着Z轴旋转一个角度

\theta

。为了完成这个任务,我们可以使用下面的矩阵

R

R=\begin{bmatrix} \cos(\theta) & -\sin(\theta) & 0 & 0 \\ \sin(\theta) & \cos(\theta) & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ \end{bmatrix}

我们将

M

R

相乘,得到一个新的矩阵

M'

,它是旋转后的矩阵:

M' = M\times R

这里是具体的推导过程:

  1. 我们先考虑矩阵
R

如何作用于矩阵

M

上。为了方便,我们假设

M

的每列分别为

M_1, M_2, M_3, M_4

。那么矩阵

R

作用于

M

上,就相当于将每列旋转一个角度

\theta

,得到新的列向量

M'_1, M'_2, M'_3, M'_4

。因此,我们可以将矩阵

R

表示为一个函数

f

,它将列向量

M_i

映射到新的列向量

M'_i

M'_i = f(M_i) = R\times M_i
  1. 现在我们需要将
f

应用于整个矩阵

M

上。考虑到矩阵乘法的性质,我们可以将

f

应用于

M

的每一列,然后将结果拼起来组成新的矩阵

M'

M' = [f(M_1), f(M_2), f(M_3), f(M_4)]
f

代入上式,得到:

\begin{aligned} M' &= [R\times M_1, R\times M_2, R\times M_3, R\times M_4] \\ &=\begin{bmatrix} \cos(\theta) & -\sin(\theta) & 0 & 0 \\ \sin(\theta) & \cos(\theta) & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ \end{bmatrix} \begin{bmatrix} m_{11} & m_{12} & m_{13} & m_{14} \\ m_{21} & m_{22} & m_{23} & m_{24} \\ m_{31} & m_{32} & m_{33} & m_{34} \\ m_{41} & m_{42} & m_{43} & m_{44} \\ \end{bmatrix} \\ &=\begin{bmatrix} \cos(\theta)m_{11}-\sin(\theta)m_{21} & \cos(\theta)m_{12}-\sin(\theta)m_{22} & \cos(\theta)m_{13}-\sin(\theta)m_{23} & \cos(\theta)m_{14}-\sin(\theta)m_{24} \\ \sin(\theta)m_{11}+\cos(\theta)m_{21} & \sin(\theta)m_{12}+\cos(\theta)m_{22} & \sin(\theta)m_{13}+\cos(\theta)m_{23} & \sin(\theta)m_{14}+\cos(\theta)m_{24} \\ m_{31} & m_{32} & m_{33} & m_{34} \\ m_{41} & m_{42} & m_{43} & m_{44} \\ \end{bmatrix} \end{aligned}

因此,将一个4x4的矩阵绕着Z轴旋转一个角度

\theta

,就可以使用上面的矩阵

R

,并将它与原矩阵

M

相乘得到旋转后的矩阵

M'
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-08-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
    • 1.矩阵的定义
    • 2.矩阵和方程的关系
  • 一、矩阵运算和变换
    • 1.矩阵运算
      • 1.1 矩阵加减
      • 1.2 矩阵乘标量
      • 1.3 矩阵相乘
    • 2.3*3矩阵旋转
      • 2.1 矩阵X旋转
      • 2.2 矩阵Y旋转
      • 2.3 矩阵Z旋转
    • 3.4*4矩阵旋转
      • 3.1 矩阵X旋转
      • 3.2 矩阵Y旋转
      • 3.3 矩阵Z旋转
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档