[Rcpp-devel] row iterators in RcppArmadillo

Jonathan Fintzi fintzij at uw.edu
Wed Oct 12 23:54:39 CEST 2016


Hi Dirk,

I take your point. Given that the conversion is essentially free, temporary
conversion makes the most sense.

Thank you again!
Jon

On Wed, Oct 12, 2016 at 2:36 PM, Dirk Eddelbuettel <edd at debian.org> wrote:

>
> Hi Jon,
>
> On 12 October 2016 at 14:20, Jonathan Fintzi wrote:
> | Thanks for the quick response. In the broader project, the vector being
> copied
> | from is an Rcpp::NumericVector that contatenates vectorized versions of a
> | number of other objects that are integrated numerically using the boost
> odeint
> | solvers. I couldn't quite get the numerical integrators to play nice with
> | Armadillo objects, and in using std::copy I was trying to avoid
> converting the
> | vector 'v' to an arma::vec since I would have to convert it back for
> further
> | integration. Perhaps this was a mistake?
>
> Yes -- the transformation in as essentially costless.  We have some
> benchmarking that show that.
>
> | Still, I don't quite understand why armadillo row pointers don't work
> which
> | armadillo column pointers are fine.
>
> Now you phrase your question as "arma-only" (which makes sense) but that
> is not what your code does, is it?
>
> I see that you are having an issue mixing things. So I suggest an easy
> simplification. You are of course free to ignore that -- but you may then
> have to provide another layer as the compiler so far appears to be unhappy.
>
> Dirk
>
> | Thanks,
> | Jon
> |
> | On Wed, Oct 12, 2016 at 2:10 PM, Dirk Eddelbuettel <edd at debian.org>
> wrote:
> |
> |
> |     On 12 October 2016 at 13:43, Jonathan Fintzi wrote:
> |     | Hello,
> |     |
> |     | I am trying to use the std::copy() function to copy elements from
> an
> |     | Rcpp::NumericVector into rows of armadillo matrices. A simplified
> version
> |     of my
> |     | code is as follows:
> |     |
> |     | cppFunction('void copyinto(Rcpp::NumericVector& v, arma::mat& d1,
> |     arma::mat&
> |     | d2) {
> |     |         std::copy(v.begin(), v.begin() + 3, d1.begin_row(0));
> |     |         std::copy(v.begin() + 3, v.end(), d2.begin_row(0));
> |     | }', depends = "RcppArmadillo")
> |
> |     You should not need to mix an _Rcpp_ vector with an _Armadillo_
> matrix
> |     using
> |     std::copy.  Check the decent Armadillo docs -- all the subsetting and
> |     slicing
> |     can be done with Armadillo.  And that is what I would do.
> |
> |     But maybe I didn't quite understand what you are really after.
> |
> |     Dirk
> |
> |     | v <- runif(6)
> |     | d1 <- matrix(0.0, 3,3)
> |     | d2 <- matrix(0.0, 3,3)
> |     |
> |     | copyinto(v, d1, d2)
> |     |
> |     | However, when I attempt to compile the code, I receive a list of
> |     compilation
> |     | errors including "no type named 'XXXXXX' in 'class
> arma::Mat<double>
> |     | row_iterator", where XXXXXX is iterator_category, value_type,
> |     difference_type,
> |     | pointer, and reference.
> |     |
> |     | If I change the iterators to column iterators (e.g.
> d1.begin_col(0))
> |     everything
> |     | compiles and works just fine. I feel that I must be missing
> something
> |     quite
> |     | basic here, but in searching around I haven't been able to
> identify my
> |     mistake.
> |     |
> |     | Thank you for your help!
> |     | Jon
> |     | _______________________________________________
> |     | 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
> |
> |     --
> |     http://dirk.eddelbuettel.com | @eddelbuettel | edd at debian.org
> |
> |
>
> --
> http://dirk.eddelbuettel.com | @eddelbuettel | edd at debian.org
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20161012/5e5eeca0/attachment-0001.html>


More information about the Rcpp-devel mailing list