【问题标题】:Multiply matrix columns into a vector in Eigen将矩阵列乘以 Eigen 中的向量
【发布时间】:2019-03-29 11:50:10
【问题描述】:

我想将矩阵 A 的列与向量 v 相乘,最后得到每一列的总和。我使用 Eigen 库,编码如下:

for (int j = 0 ; j< A.cols(); j++)
    C.col(j).noalias() = V.cwiseProduct(A.col(j));
V2 = C.colwise().sum();

但是,它仍然很慢。 我也使用了以下产品,但这些产品更慢。

1. C = A * V.asDiagonal();
2. C = A.array().rowwise() * V.transpose().array();

有什么想法吗?

【问题讨论】:

  • 什么编译器?什么编译器标志(例如必须打开优化)?多少时间是“慢”的,在什么硬件上? minimal reproducible example好吗?
  • 感谢@AviGinsburg 的回复。编译器是 g++。现在时间约为 0.03 秒,矩阵 A 的大小为 (38,000 , 160)。

标签: c++ matrix vector eigen


【解决方案1】:

嗯...您正在寻找的是一个普通的标准向量矩阵产品:

V2.noalias() = V.transpose() * A;

.noalias() 是可选的,它只是在这里为您节省一个临时的。

如果您确实需要中间矩阵 C,那么您的两个选项应该与您手工制作的 for 循环一样快,前提是您纠正它们以使它们计算相同的东西:

C = V.asDiagonal() * A;
C = A.array().colwise() * V.array();

不要忘记启用编译器优化,例如-O3 -march=native

【讨论】:

  • 谢谢@ggael。是的,对于其余代码,我需要中间矩阵 C。有两个选项比我手工制作的 for 循环更快,在其他一些情况下更慢。编译器优化已启用03,但不知道-march=native。看来这是最快的方法了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-24
  • 1970-01-01
  • 1970-01-01
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多