在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]))
你能帮我找到错误吗?
答案 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();