在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)
您能帮我发现错误吗?
首先,没有向量存储在中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)