程序员的数学:线性代数。机器学习以及计算机图形图像学的数学基础。
那么我们可以制作一个视角(我们毕竟使用三个维度)矩阵代码:
template<typename T>
Matrix4x4<T> perspective(T fovy, T aspect, T near, T far){
T q = 1.0f / tan((0.5f * fovy) * (3.14 / 180));
T A = q / aspect;
T B = (near + far) / (near - far);
T C = (2.0f * near * far) / (near - far);
return Matrix4x4<T>(
Vector4<T>(A,0,0,0),
Vector4<T>(0,q,0,0),
Vector4<T>(0,0,B,-1),
Vector4<T>(0,0,C,0));
}
内积(点积、点乘或数量积)投影变换:多维空间投影到一维空间。
向量的点乘,也叫向量的内积、数量积,对两个向量执行点乘运算,就是对这两个向量对应位一一相乘之后求和的操作,点乘的结果是一个标量。
\[a=\left[a_{1}, a_{2}, \ldots a_{n}\right]\] \[b=\left[b_{1}, b_{2}, \ldots b_{n}\right]\] \[a \bullet b=a_{1} b_{1}+a_{2} b_{2}+\ldots+a_{\mathrm{n}} b_{n}\]可以用来表征或计算两个向量之间的夹角,以及在 $b$ 向量在 $a$ 向量方向上的投影。
根据这个公式就可以计算向量 $a$ 和向量 $b$ 之间的夹角。从而就可以进一步判断这两个向量是否是同一方向,是否正交(也就是垂直)等方向关系。
\[a \bullet b=|a| \ |b| \cos \theta\]两个向量的叉乘,又叫向量积、外积、叉积,叉乘的运算结果是一个向量而不是一个标量。并且两个向量的叉积与这两个向量组成的坐标平面垂直。
\[\begin{array}{l} a=\left(x_{1}, y_{1}, z_{1}\right) \\ b=\left(x_{2}, y_{2}, z_{2}\right) \end{array}\] \[a \times b=\left(y_{1} z_{2}-y_{2} z_{1},-\left(x_{1} z_{2}-x_{2} z_{1}\right), x_{1} y_{2}-x_{2} y_{1}\right)\]在三维几何中,向量 $a$ 和向量 $b$ 的叉乘结果是一个向量,更为熟知的叫法是法向量,该向量垂直于 $a$ 和 $b$ 向量构成的平面。
在 3D 图像学中,叉乘的概念非常有用,可以通过两个向量的叉乘,生成第三个垂直于 a,b 的法向量,从而构建 X、Y、Z 坐标系。
在二维空间中,叉乘还有另外一个几何意义就是:axb 的模等于由向量 $a$ 和向量 $b$ 构成的平行四边形的面积。
\[| \vec a \times \vec b | = |\vec a| \cdot |\vec b| \cdot \sin \theta\]在线性代数中, LU 分解(LU Factorization)是矩阵分解的一种,可以将一个矩阵分解为一个单位下三角矩阵和一个上三角矩阵的乘积(有时是它们和一个置换矩阵的乘积)。 LU 分解主要应用在数值分析中,用来解线性方程、求反矩阵或计算行列式。
矩阵的乘法的几何意义就是空间变换。