N * N 阶矩阵算法
一、 n * n 阶矩阵
假设,有两个 2 * 2 阶矩阵 A、B,A = [[1,2],[3,4]],B = [[3,2],[1,4]],他们相乘的结果是 C,也就是 C = A * B,我们回顾一下数学解法,大概是这样的:
C = A * B = |
二、 算法实现
1. 暴力破解法
n * n 阶矩阵的解法有几种方式,分而治之、暴力破解等,我这里用的方法就是暴力破解的方法,时间和空间复杂度肯定是比较差的,不过能快速获得结果,用 js 的实现代码如下:
function matrix(A, B) { |
- 最外层 i:锁定 A 的当前行。
- 中间层 j:锁定 B 的当前列,定下我们要计算的结果格子 C[i][j]。
- 最内层 k:横着扫 A 的第 i 行(A[i][k]),同时竖着扫 B 的第 j 列(B[k][j]),把对应项相乘,不断加到 C[i][j] 上。
2. 优化
上面的算法,对于较大的矩阵(例如 N > 1000),计算量会呈立方级暴增,直接导致主线程卡死。
如果有高性能计算或处理大型矩阵的需求,可以考虑以下优化路径:
算法层面优化 Strassen 算法:
- 利用分治法将时间复杂度降低至约为 \mathcal{O}(n^{2.807})。
- Coppersmith–Winograd 类算法:理论上能降得更低,但常数项很大,一般用于学术界。
工程与工程性能优化(Cache / CPU 友好)
- 转置矩阵(Loop Tiling/Reordering):在 CPU / JS 引擎中,连续读取内存远快于跳跃读取。由于 B[k][j] 是按列读取的(内存不连续),可以先对 B 进行转置,使内层循环对内存的访问保持连续,极大地提升缓存命中率(Cache Hit Rate)。
- TypedArray (如 Float64Array):代替 JS 的普通嵌套数组,内存更加紧凑且能获得引擎的优化。
- WebAssembly / SIMD / WebGL (GPU 计算):对于大规模矩阵运算,利用 WebGL / WebGPU 或 WASM 开展并行计算才是生产环境下的最佳实践(如 TensorFlow.js)。
矩阵转置 + 类型化数组(TypedArray)
- 优化原理:转置 B 矩阵(Loop Reordering):原本访问 B[k][j] 是按列读取,跨度大、不连续;先将 B 转置为 B^T,访问 B^T[j][k] 就变成了按行连续读取,缓存命中率(Cache Hit)大幅提升。
- Float64Array 连续内存:一维打平的数组在内存中是完全连续的,避免了 JS 嵌套数组(数组的数组)带来的指针追溯开销。
function multiplyMatrixOptimized(A, B) { |
WebGPU / WebGL(GPU 并行加速)
矩阵乘法中每个格子的计算都是互相独立的。利用 WebGPU/WebGL 可以将 N \times N 次计算同时分发给 GPU 的成百上千个核心并行运算,运算时间会从 CPU 的 \mathcal{O}(n^3) 体验降低到极短的瞬间。
在实际生产中,一般不会手动编写复杂的 Shader,而是借力成熟的高性能 GPU 框架(如 TensorFlow.js):
import * as tf from '@tensorflow/tfjs'; |
本文标题:N * N 阶矩阵算法
文章作者:Canace
发布时间:2018-07-30
最后更新:2026-07-22
原始链接:https://canace.site/n-n-order-matrix-algorithm/
版权声明:转载请注明出处
分享