矩阵是线性代数最重要的工具,它具有极强的几何意义可以和向量概念结合,对于处理图像、状态转移,信息统计等有非常重要的意义。这里只是简单回忆起矩阵乘法的计算方法。
矩阵
-
有的人接触矩阵是从求解线性方程组引出
行列式
的概念;有的人是从信息统计学入手的,理解什么是 “信息”,如何对信息作摘要开始的; -
这里只是一个
3x3
的矩阵,注意:计算机遇到的矩阵有时可能非常大,需要额外的优化算法,矩阵分块计算之类的。不同类型的矩阵优化算法是另一个话题,例如“稀疏矩阵”处理吧啦吧啦~
矩阵乘法
- 公式定义:解释:A行B列得到AijA_{ij}Aij, 假设矩阵行列从1开始计数。
- 给定i、p 得到每个新数位需要累加A矩阵的列数或B矩阵的行数。
Am×n×Bn×p=Cm×pAip=∑a=1nAiaBap A_{m \times n} \times B_{n \times p} = C_{m \times p} \\ A_{ip} = \sum_{a=1}^{n} A_{ia}B_{ap} Am×n×Bn×p=Cm×pAip=a=1∑nAiaBap
过程
结果
几何意义
- 还有一部分人是从向量延伸过来的,国外的课程通常从向量开始教起,这很容易建立起几何直观。而图形学中理解
3D
变换恰恰需要向量基础(把矩阵的每一列看成一个维度的向量即:
XYZ三维直角坐标系中的矩阵的基坐标—归一化的基向量)
x⃗=(1,0,0);y⃗=(0,1,0);z⃗=(0,0,1);记住:[100010001][0]每列表示一个基向量,分量依次表达了在原初两两正交的基坐标上投影的分向量。[1]空间中的任意一点的坐标P(a,b,c)=a⋅x⃗+b⋅y⃗+c⋅z⃗向量加法得到的每一个分量,对应新的基坐标下数乘、累加后的结果。[2]若基向量的模长∣x⃗∣!=1,说明该维度上的基坐标经过了缩放[3]若基向量的模长仍为1,若它有变化则肯定是经过了旋转变化 \vec x = (1, 0, 0); \vec y = (0, 1, 0); \vec z = (0, 0, 1); \\ 记住: \begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix} \\ [0] 每列表示一个基向量, 分量依次表达了在原初两两正交的基坐标上投影的分向量。 \\ [1] 空间中的任意一点的坐标 P(a,b,c) = a\cdot\vec{x} + b\cdot\vec{y} + c\cdot\vec{z} \\ 向量加法得到的每一个分量,对应新的基坐标下数乘、累加后的结果。\\ [2] 若基向量的模长 |\vec x| != 1, 说明该维度上的基坐标经过了缩放 \\ [3] 若基向量的模长仍为1,若它有变化则肯定是经过了旋转变化 \\ x=(1,0,0);y=(0,1,0);z=(0,0,1);记住:100010001[0]每列表示一个基向量,分量依次表达了在原初两两正交的基坐标上投影的分向量。[1]空间中的任意一点的坐标P(a,b,c)=a⋅x+b⋅y+c⋅z向量加法得到的每一个分量,对应新的基坐标下数乘、累加后的结果。[2]若基向量的模长∣x∣!=1,说明该维度上的基坐标经过了缩放[3]若基向量的模长仍为1,若它有变化则肯定是经过了旋转变化
WebGPU中是“列主序”
JS如何传递数据给WebGPU
- JS
[col0⋅xcol0⋅ycol0⋅zcol1⋅xcol1⋅ycol1⋅zcol2⋅xcol2⋅ycol2⋅z]\begin{bmatrix} col0\cdot x & col0\cdot y & col0\cdot z \\ col1\cdot x & col1\cdot y & col1\cdot z \\ col2\cdot x & col2\cdot y & col2\cdot z \end{bmatrix}col0⋅xcol1⋅xcol2⋅xcol0⋅ycol1⋅ycol2⋅ycol0⋅zcol1⋅zcol2⋅z
// JS 端一维数组(传给 mat3x3f 的例子)
const mat = new Float32Array([
a0, a1, a2, // 第一列 (column 0)
b0, b1, b2, // 第二列 (column 1)
c0, c1, c2 // 第三列 (column 2)
]);
- WGSL
mat3x3f(
vec3f(a0, a1, a2), // column 0
vec3f(b0, b1, b2), // column 1
vec3f(c0, c1, c2) // column 2
)
- WGSL读取JS传入的数据表达形式的 **“视觉效果”**是
矩阵转置
后的。 - 设定固定步长的字节数,逐步读取写到matrix的每一列。
| a0 b0 c0 |
| a1 b1 c1 |
| a2 b2 c2 |