# Math in anywhere | Vector
# Vector
向量指一个同时具有大小和方向,且满足平行四边形法则的几何对象。我们用数据结构的视角来看,向量可以用数组或者链表来表达。常记为a或者a,或者AB=B−A
x=⎣⎢⎢⎢⎢⎡a0a1⋮an⎦⎥⎥⎥⎥⎤
这里a0,a1,⋯,an 表示向量中的每个元素,其中有 n 个数就代表向量的维。一个向量的长度我们记为 (1 范数):
∣∣a∣∣
而关于 维
这个概念,我可以把他理解为某个尺度 / 属性上的值。
一般来说特征有很多维,因此我们可以使用向量来表示某个物体的特征。其中,向量的每个元素就代表一维特征,而元素的值代表了相应特征的值,我们称这类向量为特征向量(Feature Vector)
矩阵的几何意义是坐标的变换。如果一个矩阵存在特征向量和特征值,那么这个矩阵的特征向量就表示了它在空间中最主要的运动方向。注意区分这两个概念
# Basic Operation
# Normalized
标准化操作能够让我们获得一个特定方向的单位向量,而这个单位向量我们就用来代表这个特定方向,我们通常记为:
a^=∣∣a∣∣a
# Addition
代数加法:首先需要满足维度相同,然后对应元素相加
a+b=⎣⎢⎢⎢⎢⎡a0a1⋮an⎦⎥⎥⎥⎥⎤+⎣⎢⎢⎢⎢⎡b0b1⋮bn⎦⎥⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎡a0+b0a1+b1⋮an+bn⎦⎥⎥⎥⎥⎤
几何相加:
- 平行四边形法则:两个向量从起点相同,构成的平行四边形的对角线(夹在两个向量之间)
- 三角形法则:一个向量的起点为一个向量的终点,构成三角形的第三条边。
# Multiply
向量的乘法有两种类型:
- 点乘(标量积) 也就是结果是一个数(标量)
- 叉乘(向量积) 也就是结果是一个向量 (向量)
点乘:
a⋅b=∣∣a∣∣ ∣∣b∣∣cosθif(unit vector){cosθ=a^⋅b^}
cosθ=∣∣a∣∣∣∣b∣∣a⋅b
作为标量积满足基本的运算:
a⋅b=b⋅a
a⋅(b+c)=a⋅c+b⋅a
(ka)⋅b=a⋅kb=k(a⋅b)
几何计算:
a⋅b=⎣⎢⎢⎢⎢⎡a0a1⋮an⎦⎥⎥⎥⎥⎤⋅⎣⎢⎢⎢⎢⎡b0b1⋮bn⎦⎥⎥⎥⎥⎤=a0b0+a1b1+⋯+anbn
投影计算:
b⊥=ka^k=∣∣b⊥∣∣=∣∣b∣∣cosθ
叉乘:
对于线性无关的两个向量 a 和 b ,它们的外积写作a×b,是a 和 b 所在平面的法线向量,与 a 和 b 都垂直,外积作为一个向量,其方向取决于右手定则
右手定则:
四指指向第一个向量的方向,四指往第二个向量方向握拳,此时大拇指的指向就是。这也意味着叉乘不支持乘法的交换律,因为和初始向量的位置有关。
如上图演示了用法:
A×B=C
外积的定义为:
a×b=∥a∥∥b∥sin(θ) n
其中 θ 表示a 和b 在它们所定义的平面上的夹角0∘≤θ≤180∘。∥a∥ 和∥b∥ 是向量 a 和b 的模长,而 n 则是一个与 a、b 所构成的平面垂直的单位向量,方向由右手定则决定。根据上述公式,当 a 与 b 平行(即 {θ 为 0° 或 180°)时,它们的外积为零向量 0。
几何计算:
u×v=∣∣∣∣∣∣∣iu1v1ju2v2ku3v3∣∣∣∣∣∣∣
然后需要计算哪一个维度,就将该维度所在的行,所在的列去掉,剩下部分构成的行列式的结果即为系数。
u×v=∣∣∣∣∣u2v2u3v3∣∣∣∣∣i−∣∣∣∣∣u1v1u3v3∣∣∣∣∣j+∣∣∣∣∣u1v1u2v2∣∣∣∣∣k=(u2v3−u3v2)i−(u1v3−u3v1)j+(u1v2−u2v1)k
几何意义:
如果以向量a 和 b 为边构成一个平行四边形,那么这两个向量外积的模长与这个平行四边形的正面积相等:
∥a×b∥=∥a∥∥b∥sinθ.
# Vector Space
对一般域 F,V 记为 F - 向量空间。若 F 是实数域ℝ,则 V 称为实数向量空间;
若 F 是复数域ℂ,则 V 称为复数向量空间;
若 F 是有限域,则 V 称为有限域向量空间
公理 | 说明 |
---|
向量加法的结合律 | u + (v + w) = (u + v) + w |
向量加法的交换律 | u + v = v + u |
向量加法的单位元 | 存在一个叫做零向量的元素 0 ∈ V,使得对任意 u ∈ V 都满足 u + 0 = u |
向量加法的逆元素 | 对任意 v ∈ V 都存在其逆元素−v ∈ V 使得 v + (−v) = 0 |
标量乘法与标量的域乘法相容 | a(bv) = (ab)v |
标量乘法的单位元 | 域 F 存在乘法单位元 1 满足 1v = v |
标量乘法对向量加法的分配律 | a(u + v) = au + av |
标量乘法对域加法的分配律 | (a + b)v = av + bv |
如果V 满足上述的公理,我们就称V 是F 上的向量空间。
# Vector Distance
Manhattan Distance
曼哈顿距离,这个距离度量的名字来自美国曼哈顿地区,从一个十字路口开车到另外一个十字路口,驾驶距离是多少呢?当然不是两点之间的直线距离,因为你无法穿越挡在其中的高楼大厦。你只能驾车绕过这些建筑物,实际的驾驶距离就叫作曼哈顿距离。
我们在二维空间中:假设两个点x(x1,x2) 与y(y1,y2)
MD(x,y)=∣x1−y1∣+∣x2−y2∣
推广到 n 维空间,曼哈顿距离:
MD(x,y)=i=1∑n∣xi−yi∣
从图里也能发现曼哈顿距离的特点:曼哈顿距离和路径无关,但是有多条路线。
Euclidean Distance
欧氏距离,其实就是欧几里得距离。欧氏距离是一个常用的距离定义,指在 n 维空间中两
个点之间的真实距离。
我们在二维空间中:假设两个点d(p1,p1) 与q(q1,q2)
ED(x,y)=(q1−p1)2+(q2−p2)2
推广到 n 维空间,欧式距离:
ED(x,y)=i=1∑n(pi−qi)2
从图里也能发现欧式距离的特点:也就是直线距离,只有一种路线。
Chebyshev Distance
切比雪夫其实是在模拟国际象棋里国王的走法。国王可以走临近 8 个格子里的任何一个,那么国王从格子(x1,x2) 走到格子(y1,y2) 最少需要多少步呢?其实就是二维空间里的切比雪夫距离。一开始,为了走尽量少的步数,国王走的一定是斜线,所以横轴和纵轴方向都会减 1,直到国王的位置和目标位置在某个轴上没有差距,这个时候就改为沿另一个轴每次减 1。
我们在二维空间中:假设两个点x(x1,x2) 与y(y1,y2)
CD(x,y)=max(∣x1−y1∣,∣x2−y2∣)
推广到 n 维空间,切比雪夫距离:
CD(x,y)=argi=1nmax∣xi−yi∣
arg max :就是使后面这个式子达到最大值时的变量的取值
上述三种距离,都可以用一种通用的形式表示,那就是闵可夫斯基距离,也叫闵氏距离。
在二维空间中,两个点x(x1,x2) 与y(y1,y2) 间的闵氏距离:
MKD(x,y)=p∣x1−y1∣p+∣x2−y2∣p
推广到 n 维空间,闵氏距离:
MKD(x,y)=pi=1∑n∣xi−yi∣p
其中p 是一个变参数,不同的 p 取值就能转化不同的距离:
- p=1,曼哈顿距离
- p=2,欧氏距离
- p=∞,切比雪夫距离
当p 趋近于无穷大的时候,就是切比雪夫距离。这是因为p 当趋近于无穷大的时候,最大的∣xi−yi∣,会占到全部权重。
# Vector length
向量的长度,也叫向量的模,是向量所对应的点到空间原点的距离。通常我们使用欧氏距离来表示向量的长度。范数常常被用来衡量某个向量空间中向量的大小或者长度
- L1 范数∣∣x∣∣,它是x 向量各个元素绝对值之和,对应于向量和原点之间的曼哈顿距离
- L2 范数∣∣x∣∣2,它是x 向量各个元素平方和的21 次方,对应于向量和原点之间的欧式距离
- Lp 范数∣∣x∣∣p,它是x 向量各个元素绝对值p 次方和的p1 次方,对应于向量和原点之间的闵式距离
- L∞ 范数∣∣x∣∣∞,它是x 向量各个元素绝对值最大那个元素的绝对值,对应于向量和原点之间的切比雪夫距离
# Vector angle
向量夹角的余弦,它计算了空间中两个向量所形成夹角的余弦值:
Cosine(X,Y)=∑i=1nxi2×∑i=1nyi2∑i=1n(xi×yi)
分子是两个向量的点乘,而分母是两者长度(或 L2 范数)的乘积,而 L2 范数可以使用向量点乘自身的转置来实现。夹角余弦的取值范围在 [-1,1],
- 当两个向量的方向重合时夹角余弦取最大值 1,
- 当两个向量的方向完全相反夹角余弦取最小值 -1
- 值越大,说明夹角越小,两点相距就越近
- 值越小,说明夹角越大,两点相距就越远
# Application
在 CG 领域,向量点乘的应用:
- 测量两个向量的夹角(两个方向的距离)
- 向量分解
- 确定向量的朝向(向前 / 向后)
在 CG 领域,向量叉乘的应用:
- 确定向量的位置(左还是右)
- 确定向量的位置(里还是外
# Matrix
是指矩阵内的元素行索引和纵索引互换,例如xij 变为xji,相应的,矩阵的形状由转置前的 n × m 变为转置后的 m × n。从几何的角度来说,矩阵的转置就是原矩阵以对角线为轴进行翻转后的结果。下面这张图展示了矩阵转置之后的矩阵
在线性代数中,n 阶单位矩阵,是一个n×n 的方形矩阵,其主对角线元素为 1,其余元素为 0。单位矩阵以In 表示:
I1=[1], I2=[1001], I3=⎣⎢⎡100010001⎦⎥⎤, ⋯, In=⎣⎢⎢⎢⎢⎡10⋮001⋮0⋯⋯⋱⋯00⋮1⎦⎥⎥⎥⎥⎤
逆矩阵:就是和原矩阵相乘结果是单位矩阵
X−1X=In
逆矩阵的一些基本性质:
(A−1)−1=A(λA)−1=λ1×A−1(AB)−1=B−1A−1(AT)−1=(A−1)T(AT为A的转置)det(A−1)=det(A)1(det为行列式)
# Basic operation
# Addition
相同 n X m 矩阵,对应元素相加
# Multiply
# Application
# From A Example
首先我们看一个例子:
这是我们的目标变换:
[x′y′]=[s00s][xy]
推广到各种变换,都能转化成线性矩阵何向量的乘积,一般性的:
[x′y′]=[acbd][xy]x′=Mx
Scale
Reflection
Shear
Rotation
Note:旋转的轴点我们默认使用原点
# Homogeneous Coordinates
貌似一个 2 x 2 的矩阵就能表示大多数点 / 向量的变换,但思考以下的问题:
此时矩阵无法处理平移的问题,需要额外计算:
[x′y′]=[acbd][xy]+[txty]
这使得看起来非常臃肿,同时也证明了平移变换不是线性变换。
为了解决无法统一的问题,我们引入了齐次坐标系:通过增加的一个维度的信息,来将我们的平移变换统一起来。
齐次坐标:就是将一个原本是 n 维的向量用一个 n+1 维向量来表示,是指一个用于投影几何里的坐标系统,如同用于欧氏几何里的笛卡儿坐标一般。
我们做出以下定义:
Point=⎝⎛xy1⎠⎞Vector=⎝⎛xy0⎠⎞
多出一维的信息,我们用来区分是向量还是点,因为如果作为点,有唯一性,当第三维维 1 是,就是该点坐标。有了这些定义后,我们就能推出以下的关系:
vector+vector=vectorpoint−point=vectorpoint+vector=pointpoint+point=mid_point
我们可以将公式(27)进行转化为以下:
⎣⎢⎡x′y′1⎦⎥⎤=⎣⎢⎡ac0bd0txty1⎦⎥⎤⎣⎢⎡xy1⎦⎥⎤
于是线性变换和平移变换在齐次坐标系就统一了:
逆转换
当我们知道一个点 / 向量的变换矩阵后,我们就能通过这个变换矩阵的逆矩阵使得变换后的点 / 向量回复原样
目标转化
如果我们有一个起始图像和目标图像的关系如下:
这里有两种思路:
- 先进行平移再进行线性变换(此时要注意到旋转轴点是原点)
- 先进行线性变换再进行平移
我们可以看到先进行线性变换才能获得正确的目标,因为大多数线性变换是基于原点进行的,如果先进行平移则会导致图像坐标到原点左边的距离改变。这也再次体现了矩阵计算不遵守交换律:
R45⋅T(1,0)=T(1,0)⋅R45
目标转化分解
上面我们提到都是图像初始点在原点的情况,如果我们的起始图像不是在原点那怎么处理呢,主要分为以下三步:
- 平移到原点
- 线性变换
- 平移回去
矩阵表示:
T(c)⋅R(a)⋅T(−c)
# Generalize to high-dimensional
3D_Point=⎝⎜⎜⎜⎛xyz1⎠⎟⎟⎟⎞3D_Vector=⎝⎜⎜⎜⎛xyz0⎠⎟⎟⎟⎞
Scale
S(sx,sy,sz)=⎝⎜⎜⎜⎛sx0000sy0000sz00001⎠⎟⎟⎟⎞
Translation
S(sx,sy,sz)=⎝⎜⎜⎜⎛100001000010txtytz1⎠⎟⎟⎟⎞
Rotation
旋转和 2 维的有一些不同,此时会有不同的旋转轴,要分情况讨论:
绕 x 轴旋转:
Rx(a)=⎝⎜⎜⎜⎛10000cosasina00−sinacosa00001⎠⎟⎟⎟⎞
绕 z 轴旋转:
Rz(a)=⎝⎜⎜⎜⎛cosasina00−sinacosa0000100001⎠⎟⎟⎟⎞
绕 y 轴旋转:
Ry(a)=⎝⎜⎜⎜⎛cosa0−sina00100sina0cosa00001⎠⎟⎟⎟⎞
Note: y 轴的旋转部分和 x,y 都不一样。
任何 3D 旋转都能分解为:
Rx,y,z(α,β,γ)=Rx(α)Ry(β)Rz(γ)
Rodrigues’ Rotation
vrot=vcosθ+(k×v)sinθ+k (k⋅v)(1−cosθ)
这个公式中vrot 是我们的目标向量,v 是我们的初始向量,k 是我们给定一个方向的单位向量,这个公式的推导过程如下,首先我们来看一个变换。
已知初始向量v 和给定的方向的单位向量k,我们可以把向量v 分解为平行和垂直于向量k 的向量,记为(因为垂直叉乘后模等于原来模本身):
v∥=(v⋅k)kv⊥=−k×(k×v)
然后我们可以把目标向量vrot 也分解到平行和垂直于向量k 的向量,我们可以得出:
v∥rot=v∥
因为在平行于k 的方向上,旋转不改变,接着来看垂直方向:
∣v⊥rot∣v⊥rot=∣v⊥∣,=cos(θ)v⊥+sin(θ)k×v⊥
最后我们将公式进行化简:
vrot=v∥rot+v⊥rot=v∥+cos(θ)v⊥+sin(θ)k×v=v∥+cos(θ)(v−v∥)+sin(θ)k×v=cos(θ)v+(1−cosθ)v∥+sin(θ)k×v=cos(θ)v+(1−cosθ)(k⋅v)k+sin(θ)k×v
进一步,我们讨论k×v 的矩阵表示形式K:
K=k×v=∣∣∣∣∣k2v2k3v3∣∣∣∣∣i−∣∣∣∣∣k1v1k3v3∣∣∣∣∣j+∣∣∣∣∣k1v1k2v2∣∣∣∣∣k=(k2v3−k3v2)i−(k1v3−k3v1)j+(k1v2−k2v1)k=⎣⎢⎡kyvz−kzvykzvx−kxvzkxvy−kyvx⎦⎥⎤=⎣⎢⎡0kz−ky−kz0kxky−kx0⎦⎥⎤⎣⎢⎡vxvyvz⎦⎥⎤
最后我们就能得到我们的计算公式:
R(k,θ)=cos(θ)⋅k+(1−cos(θ))k⋅k⊥+sin(θ)⎝⎛0kz−ky−kz0kxky00⎠⎞
同样可以推出:
R=kcosθ+(sinθ)K+(1−cosθ)K2