我有一个矩阵m和一个向量v.我想将第一列矩阵乘以m向量的第一个元素v,并将第二列矩阵乘以向量的第二m个元素v,依此类推.我可以使用以下代码完成它,但我正在寻找一种不需要两个转置调用的方法.我怎样才能在R中更快地做到这一点?
m <- matrix(rnorm(120000), ncol=6)
v <- c(1.5, 3.5, 4.5, 5.5, 6.5, 7.5)
system.time(t(t(m) * v))
# user system elapsed
# 0.02 0.00 0.02
Run Code Online (Sandbox Code Playgroud) 我c++使用Rcpp和RcppArmadillo包编译这个简单的代码时遇到了一些麻烦.使用以下简单示例将矩阵的每列乘以数字标量:
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变量v为2.0如下....
code <- 'arma::mat …Run Code Online (Sandbox Code Playgroud)