Jennifer Lyon
2012-Aug-31 23:22 UTC
[R] using apply with sparse matrix from package Matrix
Hi: I was trying to use apply on a sparse matrix from package Matrix, and I get the error: Error in asMethod(object) : Cholmod error 'problem too large' at file ../Core/cholmod_dense.c, line 106 Is there a way to apply a function to all the rows without bumping into this problem? Here is a simplified example:> dim(sm)[1] 72913 43052> class(sm)[1] "dgCMatrix" attr(,"package") [1] "Matrix"> str(sm)Formal class 'dgCMatrix' [package "Matrix"] with 6 slots ..@ i : int [1:6590004] 789 801 802 1231 1236 11739 17817 17943 18148 18676 ... ..@ p : int [1:43053] 0 147 303 450 596 751 908 1053 1188 1347 ... ..@ Dim : int [1:2] 72913 43052 ..@ Dimnames:List of 2 .. ..$ : NULL .. ..$ : NULL ..@ x : num [1:6590004] 0.601 0.527 0.562 0.641 0.684 ... ..@ factors : list()> my.sum<-apply(sm, 1, sum)Error in asMethod(object) : Cholmod error 'problem too large' at file ../Core/cholmod_dense.c, line 106> sessionInfo()R version 2.15.1 (2012-06-22) Platform: x86_64-unknown-linux-gnu (64-bit) locale: [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 [7] LC_PAPER=C LC_NAME=C [9] LC_ADDRESS=C LC_TELEPHONE=C [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C attached base packages: [1] stats graphics grDevices utils datasets methods base other attached packages: [1] Matrix_1.0-6 lattice_0.20-6 stringr_0.6.1 loaded via a namespace (and not attached): [1] grid_2.15.1 plyr_1.7.1 Thanks. Jen
Martin Maechler
2012-Sep-04 16:58 UTC
[R] using apply with sparse matrix from package Matrix
>>>>> Jennifer Lyon <jennifer.s.lyon at gmail.com> >>>>> on Fri, 31 Aug 2012 17:22:57 -0600 writes:> Hi: > I was trying to use apply on a sparse matrix from package Matrix, > and I get the error: > Error in asMethod(object) : > Cholmod error 'problem too large' at file ../Core/cholmod_dense.c, line 106 > Is there a way to apply a function to all the rows without bumping > into this problem? > Here is a simplified example: >> dim(sm) > [1] 72913 43052 >> class(sm) > [1] "dgCMatrix" > attr(,"package") > [1] "Matrix" >> str(sm) > Formal class 'dgCMatrix' [package "Matrix"] with 6 slots > ..@ i : int [1:6590004] 789 801 802 1231 1236 11739 17817 > 17943 18148 18676 ... > ..@ p : int [1:43053] 0 147 303 450 596 751 908 1053 1188 1347 ... > ..@ Dim : int [1:2] 72913 43052 > ..@ Dimnames:List of 2 > .. ..$ : NULL > .. ..$ : NULL > ..@ x : num [1:6590004] 0.601 0.527 0.562 0.641 0.684 ... > ..@ factors : list() >> my.sum<-apply(sm, 1, sum) > Error in asMethod(object) : > Cholmod error 'problem too large' at file ../Core/cholmod_dense.c, line 106 So, actually it would have worked (though not efficiently) if your sm matrix would have been much smaller. However, we provide rowSums(), rowMeans(), colSums(), colMeans() for all of our matrices, including the sparse ones. So your present problem can be solved using my.sum <- rowSums(sm) Best regards, Martin Maechler, ETH Zurich