diff options
author | Jitse Niesen <jitse@maths.leeds.ac.uk> | 2011-01-04 10:35:39 +0000 |
---|---|---|
committer | Jitse Niesen <jitse@maths.leeds.ac.uk> | 2011-01-04 10:35:39 +0000 |
commit | 004488a31df15cb3450e0c05e87414f5fcdb745d (patch) | |
tree | 361c0fe1f1461697cf35afb69427f03e0013b12c /Eigen/src/Core/products/SelfadjointRank2Update.h | |
parent | fb023b871f06c22c02fd81abbce73f320e0985e2 (diff) |
Fix bug in symmetric rank-2 update for row-major matrices (bug #144).
Diffstat (limited to 'Eigen/src/Core/products/SelfadjointRank2Update.h')
-rw-r--r-- | Eigen/src/Core/products/SelfadjointRank2Update.h | 7 |
1 files changed, 6 insertions, 1 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<MatrixType,UpLo>& SelfAdjointView<MatrixType,UpLo> typedef typename internal::remove_all<ActualVType>::type _ActualVType; const ActualVType actualV = VBlasTraits::extract(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<MatrixType>::Flags&RowMajorBit) ? 1 : 0 }; Scalar actualAlpha = alpha * UBlasTraits::extractScalarFactor(u.derived()) * internal::conj(VBlasTraits::extractScalarFactor(v.derived())); + if (IsRowMajor) + actualAlpha = internal::conj(actualAlpha); - enum { IsRowMajor = (internal::traits<MatrixType>::Flags&RowMajorBit) ? 1 : 0 }; internal::selfadjoint_rank2_update_selector<Scalar, Index, typename internal::remove_all<typename internal::conj_expr_if<IsRowMajor ^ UBlasTraits::NeedToConjugate,_ActualUType>::type>::type, typename internal::remove_all<typename internal::conj_expr_if<IsRowMajor ^ VBlasTraits::NeedToConjugate,_ActualVType>::type>::type, |