diff --git a/Eigen/src/Core/products/SelfadjointRank2Update.h b/Eigen/src/Core/products/SelfadjointRank2Update.h index 583537a8a..d81c568b7 100644 --- a/Eigen/src/Core/products/SelfadjointRank2Update.h +++ b/Eigen/src/Core/products/SelfadjointRank2Update.h @@ -27,7 +27,7 @@ namespace internal { -/* Optimized selfadjoint matrix += alpha * uv' + vu' +/* Optimized selfadjoint matrix += alpha * uv' + conj(alpha)*vu' * It corresponds to the Level2 syr2 BLAS routine */ @@ -84,7 +84,7 @@ SelfAdjointView& SelfAdjointView const ActualVType actualV = VBlasTraits::extract(v.derived()); Scalar actualAlpha = alpha * UBlasTraits::extractScalarFactor(u.derived()) - * VBlasTraits::extractScalarFactor(v.derived()); + * internal::conj(VBlasTraits::extractScalarFactor(v.derived())); enum { IsRowMajor = (internal::traits::Flags&RowMajorBit) ? 1 : 0 }; internal::selfadjoint_rank2_update_selector void product_selfadjoint(const MatrixType& m) m2 = m1.template triangularView(); m2.template selfadjointView().rankUpdate(-v1,s2*v2,s3); - VERIFY_IS_APPROX(m2, (m1 + (-s2*s3) * (v1 * v2.adjoint()+ v2 * v1.adjoint())).template triangularView().toDenseMatrix()); + VERIFY_IS_APPROX(m2, (m1 + (s3*(-v1)*(s2*v2).adjoint()+internal::conj(s3)*(s2*v2)*(-v1).adjoint())).template triangularView().toDenseMatrix()); m2 = m1.template triangularView(); - m2.template selfadjointView().rankUpdate(-r1.adjoint(),r2.adjoint()*s3,s1); - VERIFY_IS_APPROX(m2, (m1 + (-s3*s1) * (r1.adjoint() * r2 + r2.adjoint() * r1)).template triangularView().toDenseMatrix()); + m2.template selfadjointView().rankUpdate(-s2*r1.adjoint(),r2.adjoint()*s3,s1); + VERIFY_IS_APPROX(m2, (m1 + s1*(-s2*r1.adjoint())*(r2.adjoint()*s3).adjoint() + internal::conj(s1)*(r2.adjoint()*s3) * (-s2*r1.adjoint()).adjoint()).template triangularView().toDenseMatrix()); if (rows>1) {