【问题标题】:Multiplying a column vector by a numeric scalar in RcppArmadillo在 RcppArmadillo 中将列向量乘以数值标量
【发布时间】:2013-08-21 15:28:05
【问题描述】:

我在使用RcppRcppArmadillo 包编译这个简单的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 )

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

【问题讨论】:

    标签: r matrix rcpp armadillo


    【解决方案1】:

    如果您想将矩阵 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
    

    【讨论】:

    • +1 好答案!你也应该把它作为this question的答案。
    • 或者,如果您不感兴趣,我会将它(当然带有链接和信用)添加到我的答案中,并添加到其他答案的基准中。
    • 当然!继续添加它:-)
    【解决方案2】:

    每当我为此类问题挠头时,我都会从减少问题开始。尝试仅使用 Armadillo 标头的 C++ 三行代码。让它工作,然后将其移至 RcppArmadillo。

    编辑:一个可以比你的答案做得更好,因为你不需要单独乘以每一列(尽管可以)。无论如何,这只是炫耀 Rcpp 属性

    > cppFunction("arma::mat simon(arma::mat m, double v) { return m * v;}", 
    +             depends="RcppArmadillo")
    > simon(matrix(1:4,2,2), 3)
         [,1] [,2]
    [1,]    3    9
    [2,]    6   12
    > 
    

    【讨论】:

    • 谢谢。您对这个问题的评论对这个新手很有帮助。
    • 嗨,Dirk,感谢您的编辑。实际上,我想我是从你的书中吸取教训并减少问题。我真正想要做的是将每列乘以向量的每个对应元素(在this question 之后),但我想我会先让这个更简单的例子工作,但这个解决方案很好地说明了 Rcpp 属性。谢谢。
    【解决方案3】:

    感谢@DirkEddelbuettel 的评论,这仅仅是因为我没有定义v...

    code <- '
    arma::mat out = Rcpp::as<arma::mat>(m);
    double scl = Rcpp::as<double>(v);
    for(int i = 0; i < out.n_cols; ++i){
      out.col(i) *= scl;
    }
    return Rcpp::wrap( out );
    '
    
    armMult <- cxxfunction( signature( m = "numeric" , v = "numeric" ),
                            code , plugin = "RcppArmadillo" )
    
    armMult( m , 2.0 )
         [,1] [,2]
    [1,]    2    6
    [2,]    4    8
    

    【讨论】:

      猜你喜欢
      • 2013-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-22
      • 2012-12-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多