2013-01-09 173 views
0

我有一个下三角矩阵M(严格的,在对角线上有0)。 我想把它变成对称矩阵,效率很高。 (例如,我想要做M<-M+M')。我正在使用Eigen。特征对称矩阵

我的问题,是我做:

U=U+U.transpose(); 

但阅读的文档我有感觉,也许,我 应该采取的一些功能等优势 为.noalias()和/或.transposeInPlace(),但 明显的候选人:

U+=U.transposeInPlace(); 

给出了一个错误。

编辑:

这里是错误消息:

.cpp:210:24: note: candidates are: 
/eigen/Eigen/src/Core/MatrixBase.h:183:14: note: template<class OtherDerived> Derived& Eigen::MatrixBase::operator+=(const Eigen::MatrixBase<OtherDerived>&) [with OtherDerived = OtherDerived, Derived = Eigen::Matrix<float, -0x00000000000000001, -0x00000000000000001>] 
/eigen/Eigen/src/Core/MatrixBase.h:517:46: note: template<class OtherDerived> Derived& Eigen::MatrixBase::operator+=(const Eigen::ArrayBase<OtherDerived>&) [with OtherDerived = OtherDerived, Derived = Eigen::Matrix<float, -0x00000000000000001, -0x00000000000000001>] 
/eigen/Eigen/src/Core/DenseBase.h:266:14: note: template<class OtherDerived> Derived& Eigen::DenseBase::operator+=(const Eigen::EigenBase<OtherDerived>&) [with OtherDerived = OtherDerived, Derived = Eigen::Matrix<float, -0x00000000000000001, -0x00000000000000001>] 

回答

3
在本征

transposeInPlace()被声明为void。因此,您不能在矩阵的总和中使用该方法的结果,因为结果根本不是矩阵。

V = U; 
V.transposeInPlace(); 
U += V; 

代替。

1

其实,

U+=U.transpose().eval(); 
return(U); 

的伎俩