симметричные матрицы в собственном

У меня есть нижняя треугольная матрица M (строгая, с 0 по диагонали). Я хочу эффективно превратить это в симметричную матрицу. (например, я хочу сделать M<-M+M'). Я использую Эйген.

Моя проблема, я делаю:

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>]

person user189035    schedule 09.01.2013    source источник


Ответы (2)


в Eigen transposeInPlace() объявляется как void. Таким образом, вы не можете использовать результат этого метода в сумме матриц, потому что результат просто не является матрицей.

Do

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

вместо.

person stefan    schedule 09.01.2013

На самом деле,

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

делает свое дело

person user189035    schedule 13.01.2013