将Rcpp犰狳矩阵转换为双倍*

时间:2016-05-11 15:53:18

标签: rcpp armadillo

在RcppArmadillo中,我需要知道如何将arma::mat转换为c样式数组double *以便在其他函数中使用。

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

R部分:

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

C ++部分:

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

最后,我尝试:

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

你能帮我找到错误吗?

1 个答案:

答案 0 :(得分:4)

首先,向量存储在double* 中没有这样的东西。你可以强制转换为C型指针加倍;但没有长度信息,不会给你带来太大的收获。

按照惯例,大多数类似的C ++类为你提供了一个.begin()迭代器到内存块的开头(Armadillo恰好保证是连续的,就像std::vector一样),所以你可以试试。

除此之外(确实很好)Armadillo documentation告诉你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();