[Rcpp-devel] Eigen::RowMajor

Douglas Bates bates at stat.wisc.edu
Wed Jan 18 00:27:28 CET 2012


On Tue, Jan 17, 2012 at 4:51 PM, Jelmer Ypma <jelmerypma at gmail.com> 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.

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
> Rcpp-devel at lists.r-forge.r-project.org
> https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel


More information about the Rcpp-devel mailing list