我正在编写一个包,它的一些函数调用了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。突然间不起作用了。我很感谢你的帮助。
发布于 2017-04-03 04:40:21
这一特性适用于arma::vec或NumericVector中的预子集数据,无论是一直都有,将来也是如此。不要将它与从子集操作(例如.col()、.cols()或.submat())获得的中间向量一起使用。
您遇到的问题是,您已经决定在对sample的调用中子集数据。(您省略了诊断此部分的代码,因此我在这里进行推测。)因为sample()需要同时处理Rcpp和Armadillo数据类型,所以从来没有调用过Armadillo特定大小的成员函数。相反,库选择调用STL容器的STL成员函数( 鲤鱼 ),因为这是在两个对象之间共享的。然而,armadillo将成员函数的实现限制为“活动”数据结构,而不是临时数据结构。因此,.size()成员函数没有为subview_col实现。因此,我们最终得出的错误是:
错误:“构造arma::subview_col”没有名为“size”的成员
要克服这一限制并节省内存,请使用将重用内存的克托尔,从而避免需要创建中间arma::subview_col。
// [[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;
}样本输出:
> 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.0685https://stackoverflow.com/questions/43175765
复制相似问题