稀疏矩阵 作者:马育民 • 2026-01-31 22:27 • 阅读:10005 # 介绍 **稀疏矩阵(Sparse Matrix)** 是数值计算、数据科学和机器学习中非常核心的概念,指的是**绝大多数元素为零(或默认值),仅少数元素为非零有效值**的矩阵。 # 定义 在数学与计算机领域,稀疏矩阵是指**非零元素的数量远少于零元素数量,且非零元素分布无规律**的矩阵。 简单说:**零元素占绝对主导,非零元素稀疏分布**。 ### 判定标准 没有绝对统一的数学阈值,但行业内通用的经验标准是: **非零元素占比 ≤ 5%**(即每100个元素中,非零元素不超过5个),即可视为稀疏矩阵。 反之,非零元素占比高的矩阵称为**稠密矩阵(Dense Matrix)**。 ### 直观示例 一个 6×6 的稀疏矩阵(非零元素仅 `4` 个,占比约 `4/36 ≈ 11%`,接近稀疏特征,更大规模矩阵会更典型):  如果是 `10000×10000` 的矩阵,仅 `1000` 个非零元素,就是典型的稀疏矩阵。 --- # 核心问题:存储冗余 稀疏矩阵需要特殊处理的核心原因:如果用 **普通二维数组(稠密存储)**存储稀疏矩阵,会出现严重的**空间浪费**。 - 比如 `10000×10000` 的矩阵,稠密存储需要 1亿个元素的空间; - 即便只有 `1000` 个非零元素,仍要为9999万个零元素分配内存,完全冗余。 因此,稀疏矩阵的核心研究方向是:**设计高效的压缩存储结构,只存非零元素及其位置,不存零元素**。 --- # 存储方式 稀疏矩阵的存储结构有多种,按复杂度和应用场景分为**基础结构**和**高效结构**,分别适配教学、小规模场景和工业级、大规模场景。 ### 三元组顺序表(最基础,对应“稀疏数组”) 这是最易理解的压缩存储方式,也是你之前问的**稀疏数组**的底层逻辑,核心是用**三元组(行号,列号,值)** 记录每个非零元素。 ##### 结构设计 - 用一个二维数组存储,每行是一个三元组; - 第一行存储 **元信息**:矩阵总行数、总列数、非零元素总数; - 后续每行存储一个非零元素的(行,列,值)。 ##### 示例:上面6×6矩阵的三元组存储 ``` 6 6 4 \\ 元信息:6行、6列、4个非零元素 1 1 5 \\ 非零元素1:行1列1,值5 2 4 9 \\ 非零元素2:行2列4,值9 4 5 7 \\ 非零元素3:行4列5,值7 ``` 原本需要36个存储单元,现在仅需12个,空间大幅压缩。 ### 十字链表(链式存储) 三元组是顺序存储,**插入/删除非零元素效率低**(需要移动数组元素),十字链表用**链式结构**解决这个问题: - 每个非零元素是一个节点,包含:行号、列号、值、**行方向指针**(指向同行下一个非零元素)、**列方向指针**(指向同列下一个非零元素); - 形成“行链表+列链表”的十字交叉结构,插入/删除仅需修改指针,效率高; - 缺点:指针占用额外空间,实现复杂,适合频繁修改的稀疏矩阵。 ### CSR/CSC 压缩存储(工业级主流) 这是机器学习、数值计算中 **最常用的高效存储方式**,分为 CSR(行压缩)和 CSC(列压缩),核心是用 **三个一维数组**存储所有信息,无冗余、访问效率高。 以 CSR(Compressed Sparse Row,行压缩)为例,三个数组: 1. `val`:按行优先顺序,存储所有非零元素的值; 2. `col_ind`:存储`val`中每个元素对应的列号; 3. `row_ptr`:记录**每行第一个非零元素在`val`中的起始索引**,长度为“行数+1”,最后一位是总非零元素数。 ##### 示例:上面6×6矩阵的CSR存储 - `val = [5, 9, 7]`(非零元素按行排列) - `col_ind = [1, 4, 5]`(对应每个元素的列号) - `row_ptr = [0, 0, 1, 2, 2, 3, 3]` - `row_ptr[0]=0`:第0行第一个非零元素在`val`的索引0(无元素); - `row_ptr[1]=0`:第1行第一个非零元素在`val`的索引0; - `row_ptr[2]=1`:第2行第一个非零元素在`val`的索引1; - `row_ptr[6]=3`:总非零元素数为3。 CSR/CSC 优势:**内存占用极小、矩阵乘法等运算效率极高**,是Scipy、PyTorch、TensorFlow中稀疏矩阵的默认存储方式。 --- # 优缺点 ### 优点 - **空间效率极高**:仅存储非零元素,大规模稀疏矩阵可节省95%以上的内存; - **计算效率优化**:运算时跳过零元素,避免无效计算(如乘法中零元素相乘可直接忽略); - **适配大规模数据**:机器学习、推荐系统中,数据天然稀疏(如用户-商品评分矩阵,99%为零),只能用稀疏矩阵处理。 ### 缺点 - **实现与操作复杂**:相比稠密矩阵,压缩存储的索引计算、元素访问逻辑更复杂; - **部分运算效率低**:如随机访问某个元素、插入/删除元素,需要遍历索引或修改指针,不如稠密矩阵直接; - **工具支持有限**:部分基础库对稀疏矩阵的运算支持不如稠密矩阵完善,需依赖专业库(如Scipy、PyTorch Sparse)。 --- # 应用场景 稀疏矩阵的应用几乎覆盖所有“数据天然稀疏”的领域,核心场景包括: 1. **推荐系统**:用户-商品交互矩阵(大部分用户未购买/评分,值为零); 2. **自然语言处理(NLP)**:词袋模型(BoW)、TF-IDF矩阵(一篇文档仅含少量词汇,其余词汇对应值为零); 3. **图计算**:图的邻接矩阵(节点数多,边数少,非零元素对应边); 4. **数值分析**:有限元分析、偏微分方程求解中的系数矩阵(天然稀疏); 5. **计算机图形学**:三维模型的稀疏纹理矩阵、稀疏光照矩阵; 6. **搜索引擎**:网页-关键词索引矩阵(每个网页仅含少量关键词)。 --- # 总结 1. **核心本质**:稀疏矩阵是**非零元素占比极低**的矩阵,核心问题是存储冗余; 2. **与稀疏数组的关系**:稀疏数组是稀疏矩阵的**基础压缩存储实现(三元组顺序表)**,是“逻辑对象-存储方案”的关系; 3. **存储方案**:基础用三元组(稀疏数组),工业级用CSR/CSC,频繁修改用十字链表; 4. **核心价值**:用压缩存储解决大规模稀疏数据的内存与计算效率问题,是大数据、机器学习的基础数据结构。 原文出处:http://www.malaoshi.top/show_1GW2hHCtUXaL.html