10 #ifndef EIGEN_SELFADJOINTRANK2UPTADE_H
11 #define EIGEN_SELFADJOINTRANK2UPTADE_H
21 template<
typename Scalar,
typename Index,
typename UType,
typename VType,
int UpLo>
22 struct selfadjoint_rank2_update_selector;
24 template<
typename Scalar,
typename Index,
typename UType,
typename VType>
25 struct selfadjoint_rank2_update_selector<Scalar,Index,UType,VType,
Lower>
27 static void run(Scalar* mat, Index stride,
const UType& u,
const VType& v,
const Scalar& alpha)
29 const Index size = u.size();
30 for (Index i=0; i<size; ++i)
32 Map<Matrix<Scalar,Dynamic,1> >(mat+stride*i+i, size-i) +=
33 (numext::conj(alpha) * numext::conj(u.coeff(i))) * v.tail(size-i)
34 + (alpha * numext::conj(v.coeff(i))) * u.tail(size-i);
39 template<
typename Scalar,
typename Index,
typename UType,
typename VType>
40 struct selfadjoint_rank2_update_selector<Scalar,Index,UType,VType,
Upper>
42 static void run(Scalar* mat, Index stride,
const UType& u,
const VType& v,
const Scalar& alpha)
44 const Index size = u.size();
45 for (Index i=0; i<size; ++i)
46 Map<Matrix<Scalar,Dynamic,1> >(mat+stride*i, i+1) +=
47 (numext::conj(alpha) * numext::conj(u.coeff(i))) * v.head(i+1)
48 + (alpha * numext::conj(v.coeff(i))) * u.head(i+1);
52 template<
bool Cond,
typename T>
struct conj_expr_if
53 : conditional<!Cond, const T&,
54 CwiseUnaryOp<scalar_conjugate_op<typename traits<T>::Scalar>,T> > {};
58 template<
typename MatrixType,
unsigned int UpLo>
59 template<
typename DerivedU,
typename DerivedV>
61 ::rankUpdate(
const MatrixBase<DerivedU>& u,
const MatrixBase<DerivedV>& v,
const Scalar& alpha)
63 typedef internal::blas_traits<DerivedU> UBlasTraits;
64 typedef typename UBlasTraits::DirectLinearAccessType ActualUType;
65 typedef typename internal::remove_all<ActualUType>::type _ActualUType;
66 typename internal::add_const_on_value_type<ActualUType>::type actualU = UBlasTraits::extract(u.derived());
68 typedef internal::blas_traits<DerivedV> VBlasTraits;
69 typedef typename VBlasTraits::DirectLinearAccessType ActualVType;
70 typedef typename internal::remove_all<ActualVType>::type _ActualVType;
71 typename internal::add_const_on_value_type<ActualVType>::type actualV = VBlasTraits::extract(v.derived());
76 enum { IsRowMajor = (internal::traits<MatrixType>::Flags&
RowMajorBit) ? 1 : 0 };
77 Scalar actualAlpha = alpha * UBlasTraits::extractScalarFactor(u.derived())
78 * numext::conj(VBlasTraits::extractScalarFactor(v.derived()));
80 actualAlpha = numext::conj(actualAlpha);
82 internal::selfadjoint_rank2_update_selector<Scalar, Index,
83 typename internal::remove_all<typename internal::conj_expr_if<IsRowMajor ^ UBlasTraits::NeedToConjugate,_ActualUType>::type>::type,
84 typename internal::remove_all<typename internal::conj_expr_if<IsRowMajor ^ VBlasTraits::NeedToConjugate,_ActualVType>::type>::type,
86 ::run(_expression().const_cast_derived().data(),_expression().outerStride(),actualU,actualV,actualAlpha);
93 #endif // EIGEN_SELFADJOINTRANK2UPTADE_H
Definition: Constants.h:167
Definition: Constants.h:169
SelfAdjointView & rankUpdate(const MatrixBase< DerivedU > &u, const MatrixBase< DerivedV > &v, const Scalar &alpha=Scalar(1))
const unsigned int RowMajorBit
Definition: Constants.h:53