我最近开始使用Rcpp包将我的R代码的一些段写入C ++。
给定一个数据矩阵,我有以下Rcpp函数,它可以计算某些观察值的协方差的内核重加权估计值。
cppFunction('
NumericVector get_cov_1obs(NumericMatrix cdata, int ID, float radius){
int nrow = cdata.nrow(), ncol = cdata.ncol();
float norm_ = 0;
float w;
NumericMatrix out(ncol, ncol);
NumericMatrix outer_prod(ncol, ncol);
for (int i=0; i<ncol;i++){
for (int j=0;j<ncol;j++){
out(i,j) = 0;
outer_prod(i,j) = 0;
}
}
for (int i=0; i<nrow;i++){
w = exp( -(i-ID)*(i-ID)/(2*radius));
norm_ += w;
for (int j=0; j<ncol;j++){
for (int k=0;k<ncol;k++){
outer_prod(j,k) = cdata(i,j) * cdata(i,k);
}
}
for (int j=0; j<ncol;j++){
for (int k=0;k<ncol;k++){
out(j,k) += outer_prod(j,k)*w;
}
}
}
for (int i=0; i<ncol;i++){
for (int j=0;j<ncol;j++){
out(i,j) /= norm_;
}
}
return out;
}')
我想快速估算数据集中所有观察结果的内核重新协调矩阵并将它们存储为数组。由于Rcpp不处理数组,我编写了以下R函数:
get_kern_cov_C = function(data, radius){
# data is data for which we wish to estimate covariances
# radius is the radius of the gaussian kernel
# calculate covariances:
kern_cov = array(0, c(ncol(data),ncol(data),nrow(data)))
for (i in 1:nrow(data)){
kern_cov[,,i] = get_cov_1obs(cdata=data, ID = i-1, radius=radius)
}
return(kern_cov)
}
这似乎工作正常(并且很多,比R快很多)然而问题是偶尔(看似随机)我得到以下形式的错误:
Error in kern_cov[, , i] = get_cov_1obs(cdata = data, ID = i - 1, radius = radius) :
incompatible types (from X to Y)
其中 X 是内置的或NULL, Y 是double。
我粗略地理解为什么会发生这种情况(我正在尝试将内置/ NULL变量放入一个double)但我不确定错误是在代码中。我怀疑这可能与内存管理有关,因为它只是偶尔发生。
答案 0 :(得分:0)
您也可以在C(++)级别测试NULL,在这种情况下可能应该这样做。
至于为什么会发生这种情况:恐怕你需要调试它。