c++ - std::accumulate() 只是复数 std::vector 的实部

标签 c++ c++11 matrix vector complex-numbers

我过去常常取对称(厄米特)矩阵的总和(矩阵在 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/

相关文章:

c++ - Anjuta 如何改变提示框的颜色?

c++ - 使用编译时已知的类型避免模板冗长和动态多态性

c++ - asio::thread_pool 在调用构造函数之前就失败了

java - 将矩阵的 HashMap 写入文件 Java

c++ - 确定 PyObject* 是否为 PyLongDoubleScalarObject (numpy)

c++ - 如何解决错误:SCIP C++中无效的SCIP阶段<10>

c++ - 命名空间中的堆栈跟踪和函数

c++ - 如何将int转换为字符串

r - R 中的非规范化矩阵

枚举的 C++ 矩阵