Matrix 对于Eigen++中的对称'A',是否有一种计算'x^T A x'的优化方法?

Matrix 对于Eigen++中的对称'A',是否有一种计算'x^T A x'的优化方法?,matrix,vector,linear-algebra,numerical-methods,eigen3,Matrix,Vector,Linear Algebra,Numerical Methods,Eigen3,给定对称矩阵a和向量x,我通常需要计算x^T*a*x。我可以用x.transpose*A*x来实现Eigen++3.x,但这并没有利用x两边相同,A对称的信息。有没有更有效的计算方法?您多久计算一次?如果经常使用不同的x,那么计算a的Cholesky或LDLT分解可能会有一些速度,并使用三角形矩阵与向量的乘积只需要乘法的一半 或者更简单,如果你分解A=L+D+L.T,其中L是严格的下三角,D是对角的,那么 x.T*A*x = x.T*D*x + 2*x.T*(L*x) 其中,第一项是d[k]*

给定对称矩阵a和向量x,我通常需要计算x^T*a*x。我可以用x.transpose*A*x来实现Eigen++3.x,但这并没有利用x两边相同,A对称的信息。有没有更有效的计算方法?

您多久计算一次?如果经常使用不同的x,那么计算a的Cholesky或LDLT分解可能会有一些速度,并使用三角形矩阵与向量的乘积只需要乘法的一半

或者更简单,如果你分解A=L+D+L.T,其中L是严格的下三角,D是对角的,那么

x.T*A*x = x.T*D*x + 2*x.T*(L*x)
其中,第一项是d[k]*x[k]**2的和。第二项,如果仔细使用三角形结构,则使用原始表达式一半的运算


如果三角矩阵向量积必须在特征程序之外实现,这可能会破坏通用矩阵向量积中BLAS类块操作的效率/优化。最后,算术运算数量的减少可能不会带来任何改善。

您多久计算一次?如果经常使用不同的x,那么计算a的Cholesky或LDLT分解可能会有一些速度,并使用三角形矩阵与向量的乘积只需要乘法的一半

或者更简单,如果你分解A=L+D+L.T,其中L是严格的下三角,D是对角的,那么

x.T*A*x = x.T*D*x + 2*x.T*(L*x)
其中,第一项是d[k]*x[k]**2的和。第二项,如果仔细使用三角形结构,则使用原始表达式一半的运算


如果三角矩阵向量积必须在特征程序之外实现,这可能会破坏通用矩阵向量积中BLAS类块操作的效率/优化。最后,算术运算数量的减少可能不会带来任何改进。

对于小矩阵,自己编写For循环似乎比依赖于Eigen代码更快。对于大型矩阵,我使用.selfAdjointView获得了很好的结果:


对于小矩阵,自己编写For循环似乎比依赖于Eigen代码更快。对于大型矩阵,我使用.selfAdjointView获得了很好的结果:


我的用例是A和x一起改变。这有用吗?我想让Eigen知道这个矩阵是对称的方法是:我的用例是A和x一起变化。这有用吗?我认为让Eigen知道这个矩阵是对称的方法是使用: