【发布时间】:2014-08-28 11:38:54
【问题描述】:
我正在尝试一个简单的 Hadamard 产品,ie 一个矩阵,其中向量 fv 的第一个元素乘以矩阵 tm 的所有第 1 列元素,第二个乘以第 2 列等。
小例子:
set.seed(123)
tm <- matrix(rnorm(25,2,1),nrow=5)
fv <- rep(1,5)
tm
[,1] [,2] [,3] [,4] [,5]
[1,] 1.439524 3.7150650 3.224082 3.78691314 0.9321763
[2,] 1.769823 2.4609162 2.359814 2.49785048 1.7820251
[3,] 3.558708 0.7349388 2.400771 0.03338284 0.9739956
[4,] 2.070508 1.3131471 2.110683 2.70135590 1.2711088
[5,] 2.129288 1.5543380 1.444159 1.52720859 1.3749607
library(inline)
etest <- cxxfunction(signature(tm="NumericMatrix",
fv="NumericVector"),
plugin="RcppEigen",
body="
NumericVector fvv(fv);
NumericMatrix tmm(tm);
const Eigen::Map<Eigen::MatrixXd> ttm(as<Eigen::Map<Eigen::MatrixXd> >(tmm));
const Eigen::Map<Eigen::VectorXd> ffv(as<Eigen::Map<Eigen::VectorXd> >(fvv));
Eigen::MatrixXd prod = ttm*ffv.transpose();
return(wrap(prod));
")
etest(tm,fv)
[,1] [,2] [,3] [,4] [,5]
[1,] 1.439524 1.439524 1.439524 1.439524 1.439524
[2,] 1.769823 1.769823 1.769823 1.769823 1.769823
[3,] 3.558708 3.558708 3.558708 3.558708 3.558708
[4,] 2.070508 2.070508 2.070508 2.070508 2.070508
[5,] 2.129288 2.129288 2.129288 2.129288 2.129288
这应该只是返回tm 而不是广播第一列,我不知道它实际上认为它在做什么。我是否遗漏了一些明显的东西?
编辑:etest(tm,diag(fv)) 给了我我想要的东西,但这应该可以在 eigen 内实现?
【问题讨论】: