向量的定义
从几何上讲,向量就是有方向,有大小的有向线段。
向量的运算
负向量
要得到任意维向量的负向量,只需要简单的将向量每个分量都变负即可。数学表达式:
−
[
a
b
.
.
.
x
]
=
[
−
a
−
b
.
.
.
−
x
]
\begin{gathered} -\begin{bmatrix}a\\b\\...\\x\end{bmatrix} = \begin{bmatrix}-a\\-b\\...\\-x\end{bmatrix} \end{gathered}
−⎣⎢⎢⎡ab...x⎦⎥⎥⎤=⎣⎢⎢⎡−a−b...−x⎦⎥⎥⎤
向量大小
向量大小也常被称为向量的长度或模。
也就是向量各分量的平方和的平方根。计算公式如下:
∥
v
∥
=
∑
i
=
1
n
v
i
2
\lVert v \rVert = \sqrt{\sum_{i=1}^n v_{i}^2}
∥v∥=i=1∑nvi2
向量与标量的乘法
标量与向量的乘法非常直接,将向量的每个分量都与标量相乘即可。标量与向量乘的顺序并不重要,但经常把标量写在左边,数学表达式为:
k
[
a
1
a
2
.
.
.
a
n
]
=
[
a
1
a
2
.
.
a
n
]
k
=
[
k
a
1
k
a
2
.
.
.
k
a
n
]
\begin{gathered} k\begin{bmatrix}a_{1}\\a_{2}\\...\\a_{n}\end{bmatrix}= \begin{bmatrix}a_{1}\\a_{2}\\..\\a_{n}\end{bmatrix}k= \begin{bmatrix}ka_{1}\\ka_{2}\\...\\ka_{n}\end{bmatrix} \end{gathered}
k⎣⎢⎢⎡a1a2...an⎦⎥⎥⎤=⎣⎢⎢⎡a1a2..an⎦⎥⎥⎤k=⎣⎢⎢⎡ka1ka2...kan⎦⎥⎥⎤
标准化向量
对任意非零向量
v
v
v,都能计算出一个和
v
v
v方向相同的单位向量
v
n
o
r
m
v_{norm}
vnorm。这个过程就称为向量的标准化,要标准化向量,将向量除以它的模(大小)即可。
v
n
o
r
m
=
v
∥
v
∥
,
v
≠
0
v_{norm}=\frac {v} {\lVert v \rVert} ,v\not =0
vnorm=∥v∥v,v=0
零向量不能被标准化。数学上是不允许的,因为将导致除零。几何上也没有意义,因为零向量没有方向。
向量的加法和减法
如果两个向量的维度相同,那么它们能相加,或相减。结果向量的维度与原向量相同。
向量加法的运算法则很简单,两个向量相加,将对应分量相加即可。
[
a
1
a
2
.
.
.
a
n
]
+
[
b
1
b
2
.
.
.
b
n
]
=
[
a
1
+
b
1
a
2
+
b
2
.
.
.
a
n
+
b
n
]
\begin{gathered} \begin{bmatrix}a_1\\a_2\\...\\a_n\end{bmatrix}+ \begin{bmatrix}b_1\\b_2\\...\\b_n\end{bmatrix}= \begin{bmatrix}a_1+b_1\\a_2+b_2\\...\\a_n+b_n\end{bmatrix} \end{gathered}
⎣⎢⎢⎡a1a2...an⎦⎥⎥⎤+⎣⎢⎢⎡b1b2...bn⎦⎥⎥⎤=⎣⎢⎢⎡a1+b1a2+b2...an+bn⎦⎥⎥⎤
减法解释为加负向量:
a
−
b
=
a
+
(
−
b
)
a-b=a+(-b)
a−b=a+(−b)
一个点到另一个点的向量(减法的应用)
计算一个点到另一个点的位移是一种非常普遍的需求,可以使用向量减法来解决这个问题。
图1展示了怎样用
b
−
a
b-a
b−a计算
a
a
a到
b
b
b的位移向量。
距离公式
该公式用来计算两点之间的距离。
首先定义距离为两点之间线段的长度。因为向量是有向线段,所以从几何意义上说,两点之间的距离等于从一个点到另一个点的向量的长度。
先计算从a到b的向量d,在3D的情况下:
d
=
b
−
a
=
[
b
x
−
a
x
b
y
−
a
y
b
z
−
a
z
]
\begin{gathered} d=b-a=\begin{bmatrix}b_x-a_x\\b_y-a_y\\b_z-a_z\end{bmatrix} \end{gathered}
d=b−a=⎣⎡bx−axby−aybz−az⎦⎤
a到b的距离等于向量d的长度:
距
离
(
a
,
b
)
=
∥
d
∥
=
(
b
x
−
a
x
)
2
+
(
b
y
−
a
y
)
2
+
(
b
z
−
a
z
)
2
距离(a,b)=\lVert d \rVert = \sqrt{(b_x-a_x)^2+(b_y-a_y)^2+(b_z-a_z)^2}
距离(a,b)=∥d∥=(bx−ax)2+(by−ay)2+(bz−az)2
这样就推导出了3D距离公式,2D距离公式也很好推导出来:
距
离
(
a
,
b
)
=
∥
b
−
a
∥
=
(
b
x
−
a
x
)
2
+
(
b
y
−
a
y
)
2
距离(a,b)=\lVert b-a \rVert = \sqrt{(b_x-a_x)^2+(b_y-a_y)^2}
距离(a,b)=∥b−a∥=(bx−ax)2+(by−ay)2
向量点乘
向量点乘就是对应分量乘积的和,其结果是个分量。向量点乘不能省略点乘号。
[
a
1
a
2
.
.
.
a
n
]
⋅
[
b
1
b
2
.
.
.
b
n
]
=
a
1
b
1
+
a
2
b
2
+
.
.
.
+
a
n
b
n
\begin{gathered} \begin{bmatrix}a_1\\a_2\\...\\a_n\end{bmatrix}\cdot \begin{bmatrix}b_1\\b_2\\...\\b_n\end{bmatrix}=a_1b_1+a_2b_2+...+a_nb_n \end{gathered}
⎣⎢⎢⎡a1a2...an⎦⎥⎥⎤⋅⎣⎢⎢⎡b1b2...bn⎦⎥⎥⎤=a1b1+a2b2+...+anbn
用连加符号简写:
a
⋅
b
=
∑
i
=
1
n
a
i
b
i
a\cdot b=\sum_{i=1}^n a_ib_i
a⋅b=i=1∑naibi
一般来说,点乘结果描述了两个向量的“相似”程度,点乘结果越大,两向量越相近。
点乘等于向量大小与向量夹角的cos值的积:
a
⋅
b
=
∥
a
∥
∥
b
∥
cos
θ
a\cdot b=\lVert a \rVert \lVert b \rVert \cos\theta
a⋅b=∥a∥∥b∥cosθ
解得:
θ
=
arccos
(
a
⋅
b
∥
a
∥
∥
b
∥
)
\theta = \arccos(\frac {a\cdot b} {\lVert a \rVert \lVert b \rVert})
θ=arccos(∥a∥∥b∥a⋅b)
如果a、b是单位向量,就可以避免上面公式的除法运算:
θ
=
arccos
(
a
⋅
b
)
\theta = \arccos(a\cdot b)
θ=arccos(a⋅b)
如果不需要
θ
\theta
θ的确切值而只需要a和b的夹角类型,可以只取用点乘结果的符号。
- 如果 a ⋅ b a\cdot b a⋅b大于0,则 0 ° ⩽ θ < 90 ° 0\degree\leqslant\theta<90\degree 0°⩽θ<90°
- 如果 a ⋅ b a\cdot b a⋅b等于0,则 θ = 90 ° \theta = 90\degree θ=90°
- 如果 a ⋅ b a\cdot b a⋅b小于0,则 90 ° < θ ⩽ 180 ° 90\degree<\theta\leqslant180\degree 90°<θ⩽180°
注意:如果a、b任意一个向量为零,那么 a ⋅ b a\cdot b a⋅b的结果也为零。因此点乘对零向量的解释是,零向量对任意其他向量都垂直。(当然,前面定义零向量平行于或垂直于任意向量那是不对的,因为零向量没有方向。)
向量的投影
给定两个向量v和n,能将v分解成两个分量:
v
⊥
v_{\perp}
v⊥和
v
∥
v_{\parallel}
v∥。它们分别垂直和平行于n,并且满足
v
=
v
⊥
+
v
∥
v=v_{\perp}+v_{\parallel}
v=v⊥+v∥。一般称平行分量
v
∥
v_\parallel
v∥为v在n上的投影。
我们使用点乘计算投影:
下面我们先求
v
∥
v_\parallel
v∥。观察到
v
∥
v_\parallel
v∥平行于n,它可以表示为:
v
∥
=
n
∥
v
∥
∥
∥
n
∥
v_\parallel=n\frac {\lVert v_\parallel \rVert} {\lVert n \rVert}
v∥=n∥n∥∥v∥∥。
因此只要求出
v
∥
v_\parallel
v∥的模就能计算出该投影向量的值了。很幸运,三角分解能帮助我们求出该值:
cos
θ
=
∥
v
∥
∥
∥
v
∥
\cos\theta=\frac{\lVert v_\parallel \rVert}{\lVert v \rVert}
cosθ=∥v∥∥v∥∥
cos
θ
∥
v
∥
=
∥
v
∥
∥
\cos\theta\lVert v \rVert=\lVert v_\parallel \rVert
cosθ∥v∥=∥v∥∥
将其代入之前的公式:
v
∥
=
n
cos
θ
∥
v
∥
∥
n
∥
=
n
cos
θ
∥
v
∥
∥
n
∥
∥
n
∥
2
=
n
v
⋅
n
∥
n
∥
2
\begin{gathered} v_\parallel=n\frac {\cos\theta\lVert v \rVert} {\lVert n \rVert} \\=n\frac {\cos\theta\lVert v \rVert\lVert n \rVert} {\lVert n \rVert^2} \\=n\frac{v\cdot n}{\lVert n \rVert^2} \end{gathered}
v∥=n∥n∥cosθ∥v∥=n∥n∥2cosθ∥v∥∥n∥=n∥n∥2v⋅n
当然,如果是n单位向量,那除法就没必要了。
知道了
v
∥
v_\parallel
v∥,求
v
⊥
v_\perp
v⊥就很容易了,如下:
v
⊥
+
v
∥
=
v
v
⊥
=
v
−
v
∥
=
v
−
n
v
⋅
n
∥
n
∥
2
v_\perp+v_\parallel = v \\v_\perp=v-v_\parallel \\=v-n\frac{v\cdot n}{\lVert n \rVert^2}
v⊥+v∥=vv⊥=v−v∥=v−n∥n∥2v⋅n
向量的叉乘
另一种向量乘法称作叉乘或叉积,尽可应用于3D向量。
术语叉乘来自记法
a
×
b
a\times b
a×b中的叉号。
叉乘的公式为:
[
x
1
y
1
z
1
]
×
[
x
2
y
2
z
2
]
=
[
y
1
z
2
−
z
1
y
2
z
1
x
2
−
x
1
z
2
x
1
y
2
−
y
1
x
2
]
\begin{bmatrix}x_1\\y_1\\z_1\end{bmatrix}\times\begin{bmatrix}x_2\\y_2\\z_2\end{bmatrix}=\begin{bmatrix}y_1z_2-z_1y_2\\z_1x_2-x_1z_2\\x_1y_2-y_1x_2\end{bmatrix}
⎣⎡x1y1z1⎦⎤×⎣⎡x2y2z2⎦⎤=⎣⎡y1z2−z1y2z1x2−x1z2x1y2−y1x2⎦⎤
当点乘和叉乘放在一起时,叉乘优先计算,因为点乘返回一个标量,同时标量和向量之间不能叉乘。
向量叉乘不满足交换律,满足反交换律:
a
×
b
=
−
(
b
×
a
)
a\times b=-(b\times a)
a×b=−(b×a)
叉乘也不满足结合律。
几何解释
叉乘得到的向量垂直于原来的两个向量。
图中,向量a和b在一个平面中。向量
a
×
b
a\times b
a×b指向该平面的正上方,垂直于a和b。
a
×
b
a\times b
a×b的长度等于向量的大小与向量夹角sin值的积,如下:
∥
a
×
b
∥
=
∥
a
∥
∥
b
∥
sin
θ
\lVert a\times b\rVert=\lVert a\rVert\lVert b\rVert\sin\theta
∥a×b∥=∥a∥∥b∥sinθ
可以看到,
∥
a
×
b
∥
\lVert a\times b\rVert
∥a×b∥也等于以a和b为两边的平行四边形的面积。
如果a、b平行或任意一个为0,则
a
×
b
=
0
a\times b=0
a×b=0。叉乘对零向量的解释为:它平行于任意其他向量。(当然,前面定义零向量平行于或垂直于任意向量那是不对的,因为零向量没有方向。)
已经证明了 a × b a\times b a×b垂直于a、b。但是垂直于a、b有两个方向。那 a × b a\times b a×b指向哪个方向呢?通过将a的头和b的尾相接,并检查从a到b是顺时针还是逆时针,能够确定 a × b a\times b a×b的方向。
-
左手坐标系:
如果a和b呈顺时针,则 a × b a\times b a×b指向您。
如果a和b呈逆时针,则 a × b a\times b a×b远离您。 -
右手坐标系:
如果a和b呈顺时针,则 a × b a\times b a×b远离您。
如果a和b呈逆时针,则 a × b a\times b a×b指向您。