我过去常常取对称(厄米特)矩阵的总和(矩阵在 std::vector
中),这是一个巨大的浪费,因为虚部总是加为零(我说的是巨大的矩阵n>1000
的边长,所以我认为它有所不同。
所以现在我只添加矩阵的上三角部分。但我想进一步优化它并避免添加复杂的部分,因为我不需要它。
我目前使用的是:
std::real(std::accumulate(myMatrix.begin(), myMatrix.end(), std::complex<Real>(0,0)));
这将添加 myMatrix
的所有元素至 std::complex<Real>(0,0)
,得到我需要的总和。
但这会添加我的 vector 的实部和虚部,这是一种浪费!如何编写仅添加该矩阵实部的最优化版本?
更新:
虽然我接受了有效的答案,但我发现它比对矩阵的实部和虚部求和要慢。对于边长为 128 的矩阵,它会慢 5%-10%。这很令人惊讶。非常感谢任何其他更快的建议。
请询问您是否需要其他信息。
最佳答案
Real real_sum = std::accumulate(
myMatrix.cbegin(), myMatrix.cend(), Real{},
[](Real const acc, std::complex<Real> const& c) { return acc + std::real(c); }
);
关于c++ - std::accumulate() 只是复数 std::vector 的实部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38488244/