[Rcpp-devel] Sparse matrices with RcppArmadillo

c s conradsand.arma at gmail.com
Sat Dec 8 17:35:09 CET 2012


Armadillo sparse matrices are stored in Compressed Sparse Column format:

http://en.wikipedia.org/wiki/Sparse_matrix#Compressed_sparse_column_.28CSC_or_CCS.29

This layout is used by a majority of external solvers.

It would be far more efficient to take this layout into account when
copying matrices, instead of blindly (and slowly) copying element by
element.


On Sunday, December 9, 2012, Romain Francois <romain at r-enthusiasts.com>
wrote:
> Le 08/12/12 09:45, Søren Højsgaard a écrit :
>>
>> Dear all,
>>
>> I want to use a matrix (of type "dgCMatrix" from the Matrix package) in
RcppArmadillo, so I do:
>>
>> library(inline)
>> src <- '
>> using namespace arma;
>> using namespace Rcpp;
>> SpMat<double> X = as<SpMat<double> >(XX_);
>> '
>> foo <- cxxfunction(signature(XX_=""), body=src, plugin="RcppArmadillo")
>>
>> - but this fails. It seems to me (browsing the web) that SpMat are
supported, but I might be wrong here. I have no indication that dgCMatrix
matrices can be "converted" to SpMat's. I know that I can work with
dgCMatrix matrices with RcppEigen, but what I need is to extract
submatrices and that is very easy to do with RcppArmadillo.
>>
>> Any thoughts? Thanks in advance.
>> Regards
>> Søren
>
> Doug might know better about the internals of Matrix types. This is just
following the recipee from how these are handled in RcppEigen:
>
> #include <RcppArmadillo.h>
> // [[Rcpp::depends(RcppArmadillo)]]
> using namespace Rcpp ;
>
> // [[Rcpp::export]]
> void convert(S4 mat){
>     IntegerVector dims = mat.slot( "Dim" ) ;
>     IntegerVector i = mat.slot( "i" ) ;
>     IntegerVector p = mat.slot( "p" ) ;
>     NumericVector x = mat.slot( "x" ) ;
>
>     int nrow = dims[0], ncol = dims[1] ;
>     arma::sp_mat res( nrow, ncol) ;
>     for(int j = 0; j < ncol; ++j) {
>         for (int k = p[j]; k < p[j + 1]; ++k) res( i[k], j ) = x[k];
>     }
>     std::cout << res << std::endl ;
>
> }
>
>
> /*** R
>     require(Matrix)
>     i <- c(1,3:8); j <- c(2,9,6:10); x <- 7 * (1:7)
>     ( A <- sparseMatrix(i, j, x = x) )
>
>     convert(A)
> ***/
>
> I don't think there is a better way to fill multiple values ina SpMat,
maybe Conrad has insights.
>
> Romain
>
> --
> Romain Francois
> Professional R Enthusiast
> +33(0) 6 28 91 30 30
>
> R Graph Gallery: http://gallery.r-enthusiasts.com
>
> blog:            http://romainfrancois.blog.free.fr
> |- http://bit.ly/RE6sYH : OOP with Rcpp modules
> `- http://bit.ly/Thw7IK : Rcpp modules more flexible
>
> _______________________________________________
> Rcpp-devel mailing list
> Rcpp-devel at lists.r-forge.r-project.org
> https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20121209/1101076b/attachment.html>


More information about the Rcpp-devel mailing list