跳过线性代数的开发者的矩阵数学
Source: Dev.to
矩阵与基本操作
表示
矩阵只是一个二维数字数组。例如,一个 3×3 矩阵:
| 1 | 2 | 3 |
|---|---|---|
| 4 | 5 | 6 |
| 7 | 8 | 9 |
在 JavaScript 中可以这样创建:
const matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];元素逐项相加
两个矩阵必须具有相同的维度。
function add(A, B) {
return A.map((row, i) => row.map((val, j) => val + B[i][j]));
}矩阵乘法
乘法 不是 元素逐项的。结果中位置 (i, j) 的元素是 A 的第 i 行与 B 的第 j 列的点积。
要求:A 的列数必须等于 B 的行数。一个 m×n 矩阵乘以一个 n×p 矩阵得到一个 m×p 矩阵。
function multiply(A, B) {
const rows = A.length;
const cols = B[0].length;
const n = B.length;
const result = Array.from({ length: rows }, () =>
Array(cols).fill(0)
);
for (let i = 0; i
Array.from({ length: n }, (_, j) => (i === j ? 1 : 0))
);
}转置
交换行和列;第 i 行变为第 i 列。
function transpose(M) {
return M[0].map((_, j) => M.map(row => row[j]));
}转置在机器学习流水线中经常使用,用来在 “特征‑列” 与 “特征‑行” 布局之间切换。
行列式
方阵的行列式是一个单一数值,用来指示可逆性(非零)或奇异性(零)。
2×2 行列式:
function det2x2(M) {
return M[0][0] * M[1][1] - M[0][1] * M[1][0];
}通用行列式(余子式展开):
function determinant(M) {
const n = M.length;
if (n === 1) return M[0][0];
if (n === 2) return det2x2(M);
let det = 0;
for (let j = 0; j
[...row.slice(0, j), ...row.slice(j + 1)]
);
det += M[0][j] * determinant(minor) * (j % 2 === 0 ? 1 : -1);
}
return det;
}实际应用
CSS 变换
每个 CSS 变换(translate、rotate、scale、skew)在内部都表示为矩阵操作。浏览器会构建一个 4×4 的变换矩阵并将其应用到每个像素上。
/* CSS 声明 */
transform: rotate(45deg) scale(1.5) translate(10px, 20px);
/* 在内部计算为矩阵 */
transform: matrix(1.06, 1.06, -1.06, 1.06, -11.21, 25.61);3D 图形
游戏引擎和 3D 渲染器使用 4×4 矩阵进行相机定位、对象变换以及从三维世界空间到二维屏幕空间的投影。
机器学习
神经网络本质上是一系列矩阵乘法(权重)与非线性激活函数交替进行的过程。训练过程就是在调整这些权重矩阵。
图像处理
卷积滤波器(模糊、锐化、边缘检测)通过小卷积核——即矩阵——与局部图像块相乘来实现。
实用工具
想要快速、交互式地进行计算(乘法、行列式、逆矩阵、转置、特征值等),可以尝试以下免费在线矩阵计算器: