【发布时间】:2013-08-21 15:28:05
【问题描述】:
我在使用Rcpp 和RcppArmadillo 包编译这个简单的c++ 代码时遇到了一些麻烦。举个简单的例子,将矩阵的每一列乘以一个数值标量:
code <- 'arma::mat out = Rcpp::as<arma::mat>(m);
for(int i = 0; i < out.n_cols; ++i){
out.col(i) *= v;
}
return Rcpp::wrap( out );'
尝试使用...编译它
require( RcppArmadillo )
armMult <- cxxfunction( signature( m = "numeric" , v = "numeric" ),
code , plugin = "RcppArmadillo" )
导致编译错误....
#error: no match for 'operator*=' in 'arma::Mat<eT>::col(arma::uword) [with eT = double, arma::uword = unsigned int](((unsigned int)i)) *= v'
但是,如果我们将numeric 变量v 替换为2.0,如下所示......
code <- 'arma::mat out = Rcpp::as<arma::mat>(m);
for(int i = 0; i < out.n_cols; ++i){
out.col(i) *= 2.0; //Notice we use 2.0 instead of a variable
}
return Rcpp::wrap( out );'
它编译得很好......
armMult <- cxxfunction( signature(m="numeric"),
code,plugin="RcppArmadillo")
然后我们可以做...
m <- matrix( 1:4 , 2 , 2 )
armMult( m )
[,1] [,2]
[1,] 2 6
[2,] 4 8
我在这里缺少什么?如何使用简单的数字标量进行这项工作。我希望能够传递一个标量...
armMult( m , 2.0 )
并返回与上面相同的结果。
【问题讨论】: