Хочу проверить использование BI C в статистике. Мой маленький пример, который сохраняется как check_bi c. cpp, представлен следующим образом:
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
using namespace Rcpp;
using namespace arma;
// [[Rcpp::export]]
List check_bic(const int N = 10, const int p = 20, const double seed=0){
arma_rng::set_seed(seed); // for reproducibility
arma::mat Beta = randu(p,N); //randu/randn:random values(uniform and normal distributions)
arma::vec Bic = randu(N);
uvec ii = find(Bic == min(Bic)); // may be just one or several elements
int id = ii(ii.n_elem); // fetch the last one element
vec behat = Beta.col(id); // fetch the id column of matrix Beta
List ret;
ret["Bic"] = Bic;
ret["ii"] = ii;
ret["id"] = id;
ret["Beta"] = Beta;
ret["behat"] = behat;
return ret;
}
Затем я компилирую check_bi c. cpp в R на
library(Rcpp)
library(RcppArmadillo);
sourceCpp("check_bic.cpp")
, и компиляция может пройти успешно. Однако, когда я запускаю
check_bic(10,20,0)
в R, он показывает ошибки как
error: Mat::operator(): index out of bounds
Error in check_bic(10, 20, 0) : Mat::operator(): index out of bounds
Я проверяю код . cpp построчно, и думаю, проблемы, вероятно, возникают в
uvec ii = find(Bic == min(Bic)); // may be just one or several elements
int id = ii(ii.n_elem); // fetch the last one element
, так как если uvec ii
имеет только один элемент, то ii.n_elem
может быть NaN или что-то еще в R cpp (хотя в Matlab это нормально), хотя я не Понять, как бороться с делом. Любая помощь?