Stefano Cacciatore
Stefano Cacciatore

Reputation: 45

Convert Rcpp Armadillo matrix to double*

In RcppArmadillo, I need to know how I can convert arma::mat to c-style array double * for use in other functions.

When I run the following functions, the computer crashes:

R part:

      nn3 <- function(x){
         results=.Call("KNNCV", PACKAGE = "KODAMA", x)
         results
      }

C++ part:

     double  KNNCV(arma::mat x) {
        double *cvpred = x.memptr();
        return cvpred[1];
     }

and at the end, I try:

     nn3(as.matrix(iris[,-5]))

Can you help me to find the errors, please?

Upvotes: 0

Views: 1991

Answers (1)

Dirk is no longer here
Dirk is no longer here

Reputation: 368629

First, there is no such such thing as vector stored in a double*. You can cast to a C-style pointer to double; but without length information that does not buy you much.

By convention, most similar C++ classes give you a .begin() iterator to the beginning of the memory block (which Armadillo happens to guarantee to be contiguous, just like std::vector) so you can try that.

Other than that the (very fine indeed) Armadillo documentation tells you about memptr() which is probably what you want here. Straight copy from the example there:

      mat A = randu<mat>(5,5);
const mat B = randu<mat>(5,5);

      double* A_mem = A.memptr();
const double* B_mem = B.memptr();

Upvotes: 8

Related Questions