Le 18 janv. 2012 à 00:27, Douglas Bates <[email protected]> a écrit :
> On Tue, Jan 17, 2012 at 4:51 PM, Jelmer Ypma <[email protected]> wrote: >> Hi all, > >> I've been trying some examples using the RcppEigen package, which at >> first sight seems to work great. However, I ran into something that I >> don't completely understand. Adapting from >> /pkg/RcppEigen/inst/unitTests/runit.sparse.R, I tried the code below, >> where I use Eigen::RowMajor storage instead of the default. From C++ I >> output the matrix mm, which is then passed back to R. > >> Within C++ the matrix is a 9 x 3 matrix as specified, but when the >> matrix is passed to R, it turns into a 3 x 9 matrix. I'm assuming the >> 'C' in dgCMatrix stands form ColMajor. Does this mean that the >> Rcpp::wrap (and potentially Rcpp::as) are not implemented for >> Eigen::RowMajor sparse matrices? > > Yes. I do not have sufficient experience in template metaprogramming > to be able to detect the RowMajor setting in the corresponding wrap > function. The wrap function for sparse matrices is, naturally, a > specialization of eigen_wrap_plain_dense in the file > RcppEigen/inst/include/RcppEigenWrap.h. I believe Romain wrote that > code as it looks beyond my capabilities. I will have a look. > That templated function should have a specialization for > Eigen::RowMajor and produce a Matrix::dgRMatrix object instead of a > Matrix::dgCMatrix. It happens that getting such an object back into > Eigen from R would be a problem because the as methods for > SparseMatrix<double> assume they will be passed a dgCMatrix. > > Safest thing to do is to stick with dgCMatrix objects and Eigen::ColMajor. > >> Many thanks in advance, >> Jelmer >> >> The output from the script below is: >>> fx_row1() >> Nonzero entries: >> (1,0) (1,0) (1,0) (1,1) (1,1) (1,1) (1,2) (1,2) (1,2) >> >> Column pointers: >> 0 1 2 3 4 5 6 7 8 $ >> >> 1 0 0 >> 1 0 0 >> 1 0 0 >> 0 1 0 >> 0 1 0 >> 0 1 0 >> 0 0 1 >> 0 0 1 >> 0 0 1 >> >> 3 x 9 sparse Matrix of class "dgCMatrix" >> >> [1,] 1 1 1 . . . . . . >> [2,] . . . 1 1 1 . . . >> [3,] . . . . . . 1 1 1 >> >> >> ==================== >> library('inline') >> library('RcppEigen') >> >> fx_row <- cxxfunction( , ' >> >> Eigen::SparseMatrix<double, Eigen::RowMajor> mm(9,3); >> mm.reserve(9); >> for (int irow = 0; irow < 9; ++irow) { >> mm.startVec(irow); >> mm.insertBack(irow, irow / 3) = 1.0; >> } >> mm.finalize(); >> >> Rcpp::Rcout << mm << std::endl; >> return wrap(mm); >> ' , plugin = "RcppEigen", verbose=TRUE ) >> >> fx_row() >> _______________________________________________ >> Rcpp-devel mailing list >> [email protected] >> https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel > _______________________________________________ > Rcpp-devel mailing list > [email protected] > https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel _______________________________________________ Rcpp-devel mailing list [email protected] https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel
