加权外积的矢量化
Vectorization of weighted outer product
我希望加快近似加权协方差的计算。
具体来说,我有一个Eigen::VectorXd(N) w
和一个Eigen::MatrixXd(M,N) points
.我想计算w(i)*points.col(i)*(points.col(i).transpose())
的总和。
我正在使用 for 循环,但想看看我是否可以走得更快:
Eigen::VectorXd w = Eigen::VectorXd(N) ;
Eigen::MatrixXd points = Eigen::MatrixXd(M,N) ;
Eigen::MatrixXd tempMatrix = Eigen::MatrixXd(M,M) ;
for (int i=0; i < N ; i++){
tempMatrix += w(i)*points.col(i)*(points.col(i).transpose());
}
期待看到能做些什么!
以下方法应该有效:
Eigen::MatrixXd tempMatrix; // not necessary to pre-allocate
// assigning the product allocates tempMatrix if needed
// noalias() tells Eigen that no factor on the right aliases with tempMatrix
tempMatrix.noalias() = points * w.asDiagonal() * points.adjoint();
或直接:
Eigen::MatrixXd tempMatrix = points * w.asDiagonal() * points.adjoint();
如果M
真的很大,那么只计算一端并复制它(如果需要(可能会快得多:
Eigen::MatrixXd tempMatrix(M,M);
tempMatrix.triangularView<Eigen::Upper>() = points * w.asDiagonal() * points.adjoint();
tempMatrix.triangularView<Eigen::StrictlyLower>() = tempMatrix.adjoint();
请注意,对于非复杂标量,.adjoint()
等效于.transpose()
,但对于前者,如果points
代码也可以工作,而结果则MatrixXcd
相反(如果结果必须是自伴随的,则w
必须是真实的(。
另请注意,以下内容(来自原始代码(并未将所有条目设置为零:
Eigen::MatrixXd tempMatrix = Eigen::MatrixXd(M,M);
如果你想要这个,你需要写:
Eigen::MatrixXd tempMatrix = Eigen::MatrixXd::Zero(M,M);
相关文章:
- 为什么 openmp 的并行不适用于矢量化色彩空间转换?
- GCC 4.8.2 自动矢量化由于 cout 而失败
- 为什么浮点数的矢量化比双精度更有效?
- GCC、CLANG 和 MSVC 的可视化C++自动矢量化要求
- 如何使 msvc 矢量化浮点添加?
- 我可以期望某些 STL 函数实现是可自动矢量化的吗?
- 当在循环中使用时,std::shared_ptr 对该循环的矢量化有任何影响吗?
- 矢量化图像处理
- MSVC 2017 是否支持具有自动矢量化的 AVX 512
- 矢量化对称矩阵
- 如何在块复制期间矢量化范围检查
- 是否可以使用G 或Clang -OpenMP获得矢量化报告
- 错误的矢量化代码会影响可伸缩性吗?
- C 矢量化双回路
- 如何将现有的矢量化函数与Intel编译器自动化的现有标量函数相关
- 用于自动矢量化的展开指针增量循环
- 这是矢量化的良好实践吗
- 对于使用 C 样式指针矢量化的循环,但不使用迭代器
- SSE2 矢量化和虚拟机
- 为什么 GCC 不能矢量化这个函数和循环