将Rcpp Armadillo矩阵转换为double *

Ste*_*ore -1 armadillo rcpp

在RcppArmadillo中,我需要知道如何转换arma::mat为c样式的数组double *以用于其他功能。

当我运行以下功能时,计算机崩溃:

R部分:

      nn3 <- function(x){
         results=.Call("KNNCV", PACKAGE = "KODAMA", x)
         results
      }
Run Code Online (Sandbox Code Playgroud)

C ++部分:

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

最后,我尝试:

     nn3(as.matrix(iris[,-5]))
Run Code Online (Sandbox Code Playgroud)

您能帮我发现错误吗?

Dir*_*tel 5

首先,没有向量存储在中double*。您可以将C样式的指针强制转换为double;但是没有足够的长度信息,不会给您带来多少好处。

按照约定,大多数类似的C ++类都为您提供了一个.begin()内存块开始处的迭代器(Armadillo恰好保证是连续的,就像std::vector),因此您可以尝试这样做。

除此之外(确实非常好),Armadillo文档还告诉您有关memptr()的信息,这可能是您想要的。此处的示例的直接副本:

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

      double* A_mem = A.memptr();
const double* B_mem = B.memptr();
Run Code Online (Sandbox Code Playgroud)