Armadillo sparse matrices are stored in Compressed Sparse Column format:<br><br><a href="http://en.wikipedia.org/wiki/Sparse_matrix#Compressed_sparse_column_.28CSC_or_CCS.29">http://en.wikipedia.org/wiki/Sparse_matrix#Compressed_sparse_column_.28CSC_or_CCS.29</a><br>
<br>This layout is used by a majority of external solvers. <br><br>It would be far more efficient to take this layout into account when copying matrices, instead of blindly (and slowly) copying element by element. <br><br>
<br>On Sunday, December 9, 2012, Romain Francois <<a href="mailto:romain@r-enthusiasts.com">romain@r-enthusiasts.com</a>> wrote:<br>> Le 08/12/12 09:45, Søren Højsgaard a écrit :<br>>><br>>> Dear all,<br>
>><br>>> I want to use a matrix (of type "dgCMatrix" from the Matrix package) in RcppArmadillo, so I do:<br>>><br>>> library(inline)<br>>> src <- '<br>>> using namespace arma;<br>
>> using namespace Rcpp;<br>>> SpMat<double> X = as<SpMat<double> >(XX_);<br>>> '<br>>> foo <- cxxfunction(signature(XX_=""), body=src, plugin="RcppArmadillo")<br>
>><br>>> - 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.<br>
>><br>>> Any thoughts? Thanks in advance.<br>>> Regards<br>>> Søren<br>><br>> Doug might know better about the internals of Matrix types. This is just following the recipee from how these are handled in RcppEigen:<br>
><br>> #include <RcppArmadillo.h><br>> // [[Rcpp::depends(RcppArmadillo)]]<br>> using namespace Rcpp ;<br>><br>> // [[Rcpp::export]]<br>> void convert(S4 mat){<br>> IntegerVector dims = mat.slot( "Dim" ) ;<br>
> IntegerVector i = mat.slot( "i" ) ;<br>> IntegerVector p = mat.slot( "p" ) ;<br>> NumericVector x = mat.slot( "x" ) ;<br>><br>> int nrow = dims[0], ncol = dims[1] ;<br>
> arma::sp_mat res( nrow, ncol) ;<br>> for(int j = 0; j < ncol; ++j) {<br>> for (int k = p[j]; k < p[j + 1]; ++k) res( i[k], j ) = x[k];<br>> }<br>> std::cout << res << std::endl ;<br>
><br>> }<br>><br>><br>> /*** R<br>> require(Matrix)<br>> i <- c(1,3:8); j <- c(2,9,6:10); x <- 7 * (1:7)<br>> ( A <- sparseMatrix(i, j, x = x) )<br>><br>> convert(A)<br>
> ***/<br>><br>> I don't think there is a better way to fill multiple values ina SpMat, maybe Conrad has insights.<br>><br>> Romain<br>><br>> --<br>> Romain Francois<br>> Professional R Enthusiast<br>
> +33(0) 6 28 91 30 30<br>><br>> R Graph Gallery: <a href="http://gallery.r-enthusiasts.com">http://gallery.r-enthusiasts.com</a><br>><br>> blog: <a href="http://romainfrancois.blog.free.fr">http://romainfrancois.blog.free.fr</a><br>
> |- <a href="http://bit.ly/RE6sYH">http://bit.ly/RE6sYH</a> : OOP with Rcpp modules<br>> `- <a href="http://bit.ly/Thw7IK">http://bit.ly/Thw7IK</a> : Rcpp modules more flexible<br>><br>> _______________________________________________<br>
> Rcpp-devel mailing list<br>> <a href="mailto:Rcpp-devel@lists.r-forge.r-project.org">Rcpp-devel@lists.r-forge.r-project.org</a><br>> <a href="https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel">https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel</a><br>
>