std :: accumulate()只是复杂std :: vector的真实部分

The*_*ist 4 c++ vector matrix complex-numbers c++11

我曾经采用对称(Hermitian)矩阵的总和(矩阵在一个std::vector),这是一个巨大的浪费,因为虚部总是加零(我说的是边长的巨大矩阵n>1000,所以我认为这有所不同.

所以现在我只添加矩阵的上三角部分.但是我想进一步优化它,避免添加复杂的部分,因为我不需要它.

我目前使用的是:

std::real(std::accumulate(myMatrix.begin(), myMatrix.end(), std::complex<Real>(0,0)));
Run Code Online (Sandbox Code Playgroud)

这增加的所有元素myMatrixstd::complex<Real>(0,0),导致我需要的总和.

但这会添加我的矢量的实部和虚部,这是浪费!如何编写最优化的版本,仅添加此矩阵的实际部分?


更新:

虽然我接受了有效的答案,但我发现它比对矩阵的实部和虚部求和要慢.对于边长为128的矩阵,它慢了5%-10%.这是令人惊讶的.任何其他更快的建议都非常感谢.

请询问您是否需要其他信息.

ild*_*arn 8

Real real_sum = std::accumulate(
    myMatrix.cbegin(), myMatrix.cend(), Real{},
    [](Real const acc, std::complex<Real> const& c) { return acc + std::real(c); }
);
Run Code Online (Sandbox Code Playgroud)

  • @TheQuantumPhysicist可能是复杂添加的版本得到了SIMD (6认同)