使用Rcpp生成特定随机矩阵时遇函数重载错误求助
Rcpp生成随机矩阵的函数调用错误解决
问题场景
原本用于提取子矩阵的Rcpp代码运行正常,但添加正态随机逻辑后编译报错:
#include <Rcpp.h> using namespace Rcpp; // [[Rcpp::export]] NumericMatrix testFunction1(IntegerVector idx, NumericMatrix x){ NumericMatrix temp(idx.size(),idx.size()); for(R_len_t i=0; i< idx.size(); i++){ for(R_len_t j=0; j< idx.size(); j++){ temp(i,j) = x(idx[i],idx[j]); } } return temp; }
修改后的代码(添加随机逻辑):
// [[Rcpp::export]] NumericMatrix testFunction1(IntegerVector idx, NumericMatrix x){ NumericMatrix temp(idx.size(),idx.size()); for(R_len_t i=0; i< idx.size(); i++){ for(R_len_t j=0; j< idx.size(); j++){ temp(i,j) = R::rnorm(1, mu = x(idx[i],idx[j]), sd = 1); } } return temp; }
编译错误信息:
reference to overloded function could not be resolved; did you mean to call it?
错误原因
Rcpp提供的R::rnorm函数有两种重载形式:
double rnorm():默认生成均值0、标准差1的正态随机数double rnorm(double mean, double sd):指定均值和标准差生成单个随机数
你错误地传入了3个参数(多余的第一个参数1),还使用了不存在的命名参数mu(函数参数名是mean而非mu),导致编译器无法匹配到正确的函数重载,从而报错。
修正后的代码
#include <Rcpp.h> using namespace Rcpp; // [[Rcpp::export]] NumericMatrix testFunction1(IntegerVector idx, NumericMatrix x){ NumericMatrix temp(idx.size(), idx.size()); for(R_len_t i = 0; i < idx.size(); i++){ for(R_len_t j = 0; j < idx.size(); j++){ // 正确调用R::rnorm,传入均值和标准差两个参数 temp(i,j) = R::rnorm(x(idx[i], idx[j]), 1.0); } } return temp; }
补充说明
如果需要批量生成正态随机数,也可以使用Rcpp的向量版rnorm函数,签名为NumericVector rnorm(int n, double mean, double sd),能更高效地生成多个随机值。
内容的提问来源于stack exchange,提问作者ann
相关产品推荐
相关产品推荐

