That looks very similar, if not identical to what dgCMatrix uses. Can
you direct me to a constructor where I could feed such information ?
Romain
Le 08/12/12 17:35, c s a ?crit :
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
<mailto: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,
>>
>> - 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.
<mailto:Rcpp-devel at lists.r-forge.r-project.org>