10#ifndef EIGEN_SELFADJOINTRANK2UPTADE_H
11#define EIGEN_SELFADJOINTRANK2UPTADE_H
21template<
typename Scalar,
typename Index,
typename UType,
typename VType,
int UpLo>
22struct selfadjoint_rank2_update_selector;
24template<
typename Scalar,
typename Index,
typename UType,
typename VType>
25struct selfadjoint_rank2_update_selector<Scalar,
Index,UType,VType,
Lower>
27 static EIGEN_DEVICE_FUNC
28 void run(Scalar* mat,
Index stride,
const UType& u,
const VType& v,
const Scalar& alpha)
30 const Index size = u.size();
31 for (
Index i=0; i<size; ++i)
33 Map<Matrix<Scalar,Dynamic,1> >(mat+stride*i+i, size-i) +=
34 (numext::conj(alpha) * numext::conj(u.coeff(i))) * v.tail(size-i)
35 + (alpha * numext::conj(v.coeff(i))) * u.tail(size-i);
40template<
typename Scalar,
typename Index,
typename UType,
typename VType>
41struct selfadjoint_rank2_update_selector<Scalar,
Index,UType,VType,
Upper>
43 static void run(Scalar* mat,
Index stride,
const UType& u,
const VType& v,
const Scalar& alpha)
45 const Index size = u.size();
46 for (
Index i=0; i<size; ++i)
47 Map<Matrix<Scalar,Dynamic,1> >(mat+stride*i, i+1) +=
48 (numext::conj(alpha) * numext::conj(u.coeff(i))) * v.head(i+1)
49 + (alpha * numext::conj(v.coeff(i))) * u.head(i+1);
53template<
bool Cond,
typename T>
struct conj_expr_if
54 : conditional<!Cond, const T&,
55 CwiseUnaryOp<scalar_conjugate_op<typename traits<T>::Scalar>,T> > {};
59template<
typename MatrixType,
unsigned int UpLo>
60template<
typename DerivedU,
typename DerivedV>
64 typedef internal::blas_traits<DerivedU> UBlasTraits;
65 typedef typename UBlasTraits::DirectLinearAccessType ActualUType;
66 typedef typename internal::remove_all<ActualUType>::type _ActualUType;
67 typename internal::add_const_on_value_type<ActualUType>::type actualU = UBlasTraits::extract(u.derived());
69 typedef internal::blas_traits<DerivedV> VBlasTraits;
70 typedef typename VBlasTraits::DirectLinearAccessType ActualVType;
71 typedef typename internal::remove_all<ActualVType>::type _ActualVType;
72 typename internal::add_const_on_value_type<ActualVType>::type actualV = VBlasTraits::extract(v.derived());
77 enum { IsRowMajor = (internal::traits<MatrixType>::Flags&
RowMajorBit) ? 1 : 0 };
78 Scalar actualAlpha = alpha * UBlasTraits::extractScalarFactor(u.derived())
79 * numext::conj(VBlasTraits::extractScalarFactor(v.derived()));
81 actualAlpha = numext::conj(actualAlpha);
83 typedef typename internal::remove_all<
typename internal::conj_expr_if<int(IsRowMajor) ^ int(UBlasTraits::NeedToConjugate), _ActualUType>::type>::type UType;
84 typedef typename internal::remove_all<
typename internal::conj_expr_if<int(IsRowMajor) ^ int(VBlasTraits::NeedToConjugate), _ActualVType>::type>::type VType;
85 internal::selfadjoint_rank2_update_selector<
Scalar,
Index, UType, VType,
87 ::run(_expression().const_cast_derived().data(),_expression().outerStride(),UType(actualU),VType(actualV),actualAlpha);
Base class for all dense matrices, vectors, and expressions.
Definition MatrixBase.h:50
Expression of a selfadjoint matrix from a triangular part of a dense matrix.
Definition SelfAdjointView.h:51
@ Lower
Definition Constants.h:209
@ Upper
Definition Constants.h:211
const unsigned int RowMajorBit
Definition Constants.h:66
Namespace containing all symbols from the Eigen library.
Definition B01_Experimental.dox:1
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition Meta.h:74