Проверьте BI C через RcppArmadillo (R cpp) - PullRequest
0 голосов
/ 31 января 2020

Хочу проверить использование 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 это нормально), хотя я не Понять, как бороться с делом. Любая помощь?

...