在矩阵中,若数值为0的元素数目远远多于非0元素的数目,
并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵;
与之相反,若非0元素数目占大多数时,则称该矩阵为稠密矩阵。
###### R稀疏矩阵 #####
### 1. Matrix包的Matrix函数
require(Matrix)
# detach("package:Matrix")
mat <- Matrix(data = 0L, nrow=1000, ncol = 100, sparse = TRUE) #dgCMatrix
print(object.size(mat), unit="KB") #1.9 Kb
dim(mat) #[1] 3201 818
## 普通matrix占用空间大得多
mat2 <- matrix(data = 0L, nrow=1000, ncol = 100) #dgCMatrix
class(mat2) # 1] "matrix" "array"
print(object.size(mat2), unit="KB") # 390.8 KbKb
### 2. Matrix::sparseMatrix函数
i <- c(1,5:8)
j <- c(8,2:5)
x <- length(i) * (1:5)
# i,j 为不为0的行,列。 x为值
mat3 <- sparseMatrix(i, j, x = x) # dgCMatrix
mat3[8,1]
summary(mat3)
### 3. matrix转换 as(*, "dgCMatrix")
mat4 <- matrix(data=c(0,0,1,2,0,3,0,0,0), nrow=3, ncol=3)
mat5 <- as(mat4, "dgCMatrix") # dgCMatri
### 4. new("dgCMatrix", ...),...处填写dgCMatrix类的属性具体值
# 虽然R是统计语言,但R也可以面向对象编程。S4对象是标准的面向对象实现方式,
# 有专门的类定义函数setClass()和类的实例化函数new()。
# "dgCMatrix" 本质上就是一个类,所以我们可以直接用new函数来实例化这个类创建对象。
indptr <- c(2L, 0L, 2L) #必为整数
indices <- c(0L, 1L, 3L, 3L) #必为整数
data <- c(1, 2, 3)
mat6 <- new('dgCMatrix', i=indptr, p=indices, x=data, Dim=c(3L,3L)) #Dim参数必为整数
### 5. 稀疏矩阵读取和保存
# Matrix::readMM #读取稀疏矩阵
# Matrix::writeMM #保存稀疏矩阵
writeMM(mat6, file=file.path(tempdir(), "mat6.mtx"))
mat7 <- Matrix::readMM(file=file.path(tempdir(), "mat6.mtx"))