首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RcppArmadillo样本.h编译错误

RcppArmadillo样本.h编译错误
EN

Stack Overflow用户
提问于 2017-04-03 02:41:57
回答 1查看 795关注 0票数 0

我正在编写一个包,它的一些函数调用了RcppArmadillo中的RcppArmadillo::sample。但是,我在编译时遇到了以下错误。

包含在函数的Citrus.cpp:2: Citrus.cpp:2中的文件中::RcppArmadillo::sample(const&,int,bool,(Rcpp::n数控向量),T=arma::subview_col: Citrus.cpp:241:从这里实例化了./R/x86_64-unknown-linux-gnu-library/3.0/RcppArmadillo/include/RcppArmadilloExtensions/sample.h:48:错误:‘const arma::subview_col’没有名为‘size’的成员,./R/x86_64-unknown-linux-gnu-library/3.0/RcppArmadillo/include/RcppArmadilloExtensions/sample.h:48:错误:没有匹配函数调用‘arma::subview_col::subview_col(const&)’./R/x86_64-unknown-linux-gnu-library/3.0/RcppArmadillo/include/armadillo_bits/subview_meat.hpp:2608:备注:候选人为: arma::subview_col::subview_col() with eT = double ./R/x86_64-unknown-linux-gnu-library/3.0/RcppArmadillo/include/armadillo_bits/subview_meat.hpp:2608: note:arma::subview_col::subview_col(const::Mat&,arma::uword,arma::uword,arma::uword)加上eT = double eT: arma::subview_col::subview_col(const::Mat&,arma::uword)与eT = double ./R/x86_64-unknown gnu eT注释: arma::subview_col::subview_col(const arma::subview_col&) make:* Citrus.o错误1

我使用的RcppArmadillo是0.7.700.0.0。

同样的错误出现在linux和OSX上。使用Rstudio编译时,错误消息如下所示:no member named 'size' in 'arma::subview_col<double>'. no matching constructor for initialization of 'arma::subview_col<double>'

我在以前的工作中经常使用RcppArmadillo::sample。突然间不起作用了。我很感谢你的帮助。

EN

回答 1

Stack Overflow用户

发布于 2017-04-03 04:40:21

这一特性适用于arma::vecNumericVector中的预子集数据,无论是一直都有,将来也是如此。不要将它与从子集操作(例如.col().cols().submat())获得的中间向量一起使用。

您遇到的问题是,您已经决定在对sample的调用中子集数据。(您省略了诊断此部分的代码,因此我在这里进行推测。)因为sample()需要同时处理Rcpp和Armadillo数据类型,所以从来没有调用过Armadillo特定大小的成员函数。相反,库选择调用STL容器的STL成员函数( 鲤鱼 ),因为这是在两个对象之间共享的。然而,armadillo将成员函数的实现限制为“活动”数据结构,而不是临时数据结构。因此,.size()成员函数没有为subview_col实现。因此,我们最终得出的错误是:

错误:“构造arma::subview_col”没有名为“size”的成员

要克服这一限制并节省内存,请使用将重用内存的克托尔,从而避免需要创建中间arma::subview_col

代码语言:javascript
复制
// [[Rcpp::depends(RcppArmadillo)]]
#include <RcppArmadillo.h>

#include <RcppArmadilloExtensions/sample.h>

// [[Rcpp::export]]
void adv_rnd(int nrow, int ncol, bool replace = true){
    // Create a matrix of given dimensions
    arma::mat X(nrow, ncol);
    X.randn();

    // Show state before randomization
    Rcpp::Rcout << "Before Randomization:" << std::endl << X << std::endl;

    // Randomize each column
    for(int i = 0; i < ncol; ++i){
        arma::vec Y(X.colptr(i), nrow, false, true);
        X.col(i) = Rcpp::RcppArmadillo::sample(Y, nrow, replace);
    }

    // Show state after randomization
    Rcpp::Rcout << "After Randomization:" << std::endl << X << std::endl;

}

样本输出:

代码语言:javascript
复制
> adv_rnd(3,3)
Before Randomization:
  -0.7197   1.2590  -0.5898
   0.0253   0.1493  -0.0685
  -0.6074   1.3843   0.0400

After Randomization:
  -0.7197   1.2590   0.0400
  -0.6074   1.2590  -0.5898
  -0.6074   0.1493  -0.0685
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43175765

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档