Sprase Matrix objects in R

In this post, we take a look sparse matrix objects in R in terms of object size.

If most of entries in a matrix are 0, we call the matrix is sparse. Using sparse matrix object, we can save memory. For example, an Erdös-Rényi graph can be stored as a sparse matrix. The code chunk below is where the edge probability is 0.1, that is, the expected number of edges is \(0.1 {200 \choose 2} = 1990\) out of 19900 pairs.

A <- sample_gnp(200,0.1) #From igraph R package

#object size
A %>% as_adj(sparse = T) %>% object.size %>% print # sparse Matrix::dgCMatrix
## 51144 bytes
A %>% as_adj(sparse = F) %>% object.size %>% print # dense matrix
## 320216 bytes

We observe that sparse matrix object use much less memory than the usual matrix in R (about 1/6). If there are more zeros, we can save more memory. Figure below displays memory usages of sparse (black) and dense (red) matrix objects to save Erdos-Renyi graph with various edge probability. We observe that sparse matrix requires less memory than usual matrix object.

Object size for 200 by 200 dense and sparse matrix. Erdos-Renyi graphs with edge probablities from 0.01 to 0.5 are generated.

Figure 1: Object size for 200 by 200 dense and sparse matrix. Erdos-Renyi graphs with edge probablities from 0.01 to 0.5 are generated.

sessionInfo()
## R version 4.2.0 (2022-04-22)
## Platform: x86_64-apple-darwin17.0 (64-bit)
## Running under: macOS Big Sur/Monterey 10.16
## 
## Matrix products: default
## BLAS:   /Library/Frameworks/R.framework/Versions/4.2/Resources/lib/libRblas.0.dylib
## LAPACK: /Library/Frameworks/R.framework/Versions/4.2/Resources/lib/libRlapack.dylib
## 
## locale:
## [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] bench_1.1.2  dplyr_1.0.9  igraph_1.3.1 Matrix_1.4-1 knitr_1.39  
## 
## loaded via a namespace (and not attached):
##  [1] highr_0.9        bslib_0.3.1      compiler_4.2.0   pillar_1.7.0    
##  [5] jquerylib_0.1.4  tools_4.2.0      digest_0.6.29    tibble_3.1.7    
##  [9] jsonlite_1.8.0   evaluate_0.15    lifecycle_1.0.1  lattice_0.20-45 
## [13] pkgconfig_2.0.3  rlang_1.0.2      cli_3.3.0        rstudioapi_0.13 
## [17] yaml_2.3.5       blogdown_1.10    xfun_0.31        fastmap_1.1.0   
## [21] stringr_1.4.0    generics_0.1.2   sass_0.4.1       vctrs_0.4.1     
## [25] tidyselect_1.1.2 grid_4.2.0       glue_1.6.2       R6_2.5.1        
## [29] fansi_1.0.3      rmarkdown_2.14   bookdown_0.26    purrr_0.3.4     
## [33] magrittr_2.0.3   htmltools_0.5.2  ellipsis_0.3.2   utf8_1.2.2      
## [37] stringi_1.7.6    crayon_1.5.1
Youngseok Song
Youngseok Song
Assistant Professor in the Department of Statistics

My research interests include high-dimensional inference, graphical modeling, network analysis, robust statistics, robust learing, and statistical genomics.