An earlier article discussed
sparse matrix conversion
but stopped short of showing how to create custom as<>() and wrap() methods
or functions. This post started to close this gap.
We will again look at sparse matrices from the
Matrix package for R, as well as
the SpMat class from Armadillo.
At least for now we will limit outselves to the
case of double element types. These uses the sp_mat typedef which will be
our basic type for sparse matrices at the C++ level.
Nota bene: At the time of the update of the post, very similar
code (by Romain) has just been added to the SVN repo for
RcppArmadillo; it should appear in the next regular CRAN
release. Because we cannot redefine method with the same signature,
we renamed the code presented here as_<>() and wrap_(). Of
course, for conversion not already present in the package, names
without underscores should be used instead. My thanks to Romain for
improving over the initial versions I wrote in the first version of
Nota bene 2: As of RcppArmadillo release 0.3.920.1 (based on Armadillo 3.920.1)
there is also a new constructor taking vectors rowind, colptr and values.
First, we look at the as method.
Next, we look at the corresponding wrap() method.
We can now illustrate this with a simple example. Note that the
compiler will use the methods as<>() and wrap() from the package
rather than the ones depicted here. However, the ones shown here compile as
well and are functionally identical.
First, we create a sparse matrix. We then the function we just showed to
to a minimal (and boring) transformation: we double the values of the matrix.
The key really in the seamless passage of matrix A from R down to the C++
code where it is accessed as m, and the return of the new matrix n which
becomes B at the R level.