将列向量乘以RcppArmadillo中的数字标量

Sim*_*lon 2 r matrix armadillo rcpp

c++使用RcppRcppArmadillo包编译这个简单的代码时遇到了一些麻烦.使用以下简单示例将矩阵的每列乘以数字标量:

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 );'
Run Code Online (Sandbox Code Playgroud)

试图使用...编译它

require( RcppArmadillo )
armMult <- cxxfunction( signature( m = "numeric" , v = "numeric" ),
                        code , plugin = "RcppArmadillo" )
Run Code Online (Sandbox Code Playgroud)

导致编译错误....

#error: no match for 'operator*=' in 'arma::Mat<eT>::col(arma::uword) [with eT = double, arma::uword = unsigned int](((unsigned int)i)) *= v'
Run Code Online (Sandbox Code Playgroud)

但是,如果我们交换numeric变量v2.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 );'
Run Code Online (Sandbox Code Playgroud)

它编译得很好......

armMult <- cxxfunction( signature(m="numeric"),
                        code,plugin="RcppArmadillo")
Run Code Online (Sandbox Code Playgroud)

然后我们可以......

m <- matrix( 1:4 , 2 , 2 )

armMult( m )
     [,1] [,2]
[1,]    2    6
[2,]    4    8
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么?如何使用简单的数字标量来完成此工作.我希望能够传递一个像......的标量

armMult( m , 2.0 )
Run Code Online (Sandbox Code Playgroud)

并返回与上面相同的结果.

chr*_*ris 8

如果要将矩阵A的每一列乘以向量x的对应元素,请尝试以下方法:

Rcpp:::cppFunction(
    "arma::mat fun(arma::mat A, arma::rowvec x) 
    { 
        A.each_row() %= x;
        return A;
    }", depends = "RcppArmadillo"
)

fun(matrix(rep(1, 6), 3, 2), c(5, 1))

     [,1] [,2]
[1,]    5    1
[2,]    5    1
[3,]    5    1
Run Code Online (Sandbox Code Playgroud)