From 004488a31df15cb3450e0c05e87414f5fcdb745d Mon Sep 17 00:00:00 2001 From: Jitse Niesen Date: Tue, 4 Jan 2011 10:35:39 +0000 Subject: [PATCH] Fix bug in symmetric rank-2 update for row-major matrices (bug #144). --- Eigen/src/Core/products/SelfadjointRank2Update.h | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Eigen/src/Core/products/SelfadjointRank2Update.h b/Eigen/src/Core/products/SelfadjointRank2Update.h index 7d91f04a5..9f8b8438a 100644 --- a/Eigen/src/Core/products/SelfadjointRank2Update.h +++ b/Eigen/src/Core/products/SelfadjointRank2Update.h @@ -83,10 +83,15 @@ SelfAdjointView& SelfAdjointView typedef typename internal::remove_all::type _ActualVType; const ActualVType actualV = VBlasTraits::extract(v.derived()); - Scalar actualAlpha = alpha * UBlasTraits::extractScalarFactor(u.derived()) - * internal::conj(VBlasTraits::extractScalarFactor(v.derived())); + // If MatrixType is row major, then we use the routine for lower triangular in the upper triangular case and + // vice versa, and take the complex conjugate of all coefficients and vector entries. enum { IsRowMajor = (internal::traits::Flags&RowMajorBit) ? 1 : 0 }; + Scalar actualAlpha = alpha * UBlasTraits::extractScalarFactor(u.derived()) + * internal::conj(VBlasTraits::extractScalarFactor(v.derived())); + if (IsRowMajor) + actualAlpha = internal::conj(actualAlpha); + internal::selfadjoint_rank2_update_selector::type>::type, typename internal::remove_all::type>::type,