稀疏矩阵与零相乘结果未按稀疏格式存储的原因及实现方法
对角零矩阵的稀疏存储问题解析
问题重现
执行以下R代码:
library(Matrix) Diagonal(5) * 0
得到输出:
5 x 5 diagonal matrix of class "ddiMatrix" [,1] [,2] [,3] [,4] [,5] [1,] 0 . . . . [2,] . 0 . . . [3,] . . 0 . . [4,] . . . 0 . [5,] . . . . 0
未按完全稀疏格式存储的原因
Diagonal(5)生成的是ddiMatrix类型的对角稀疏矩阵,这类矩阵的设计目的是专门存储对角线上有非零元素的矩阵,内部会固定记录对角位置的元素索引。- 当你将其乘以0后,所有对角元素变为0,但
Matrix包会默认保留原矩阵的ddiMatrix类结构——它依然会标记出对角位置的元素(哪怕值为0),而不是自动丢弃所有零元素转换成真正的“无任何非零元素”的稀疏矩阵(比如dgCMatrix类型)。所以输出里对角位置显示0,本质是这个矩阵还在按对角矩阵的结构存储,而非完全稀疏的格式。
实现完全稀疏存储的方法
- 方法一:用
drop0()移除零元素drop0()函数会自动剔除矩阵中所有值为0的元素,将其转换为标准的稀疏矩阵格式:
drop0(Diagonal(5) * 0)
执行后会得到5 x 5 sparse Matrix of class "dgCMatrix",无任何非零元素,完全按稀疏规则存储。
- 方法二:直接创建全零稀疏矩阵
跳过对角矩阵的中间步骤,直接生成全零的稀疏矩阵:
Matrix(0, nrow = 5, ncol = 5, sparse = TRUE)
生成的同样是dgCMatrix类型的全零稀疏矩阵,不会保留对角结构。
内容的提问来源于stack exchange,提问作者shani
相关产品推荐
相关产品推荐

