我曾经对称(Hermitian)矩阵(该矩阵位于
现在我只添加矩阵的上三角部分。但我想进一步优化此过程并避免添加复杂部分,因为我不需要它。
我目前使用的是:
这将
std::vector
中)求和,这是一种巨大的浪费,因为虚部总是加起来等于零(我指的是边长为n>1000
的大矩阵,所以我认为这很重要。现在我只添加矩阵的上三角部分。但我想进一步优化此过程并避免添加复杂部分,因为我不需要它。
我目前使用的是:
std::real(std::accumulate(myMatrix.begin(), myMatrix.end(), std::complex<Real>(0,0)));
这将
myMatrix
的所有元素加到std::complex<Real>(0,0)
上,得到所需的总和。
但这会加上向量的实部和虚部,这是浪费!如何编写最优化的版本,仅添加此矩阵的实部?
更新:
虽然我接受了有效的答案,但我发现它比对该矩阵的实部和虚部求和慢。 对于边长为128的矩阵,速度慢了5%-10%。 这很惊人。 如有其他更快的建议,非常感谢。
如果需要其他信息,请提出要求。
Real
有多少字节?如果Real
被定义为4字节浮点数,那么64位机器可能会像仅加载其中的前4个字节一样快地加载8个对齐的字节。您可以通过将myMatrix分成由std::vector<float>
表示的实部和虚部,然后仅聚合实部来测试这一点,但是只有在不需要频繁在不同表示之间转换时才有益。 - Maarten Hilferink