1 // This file is part of Eigen, a lightweight C++ template library
4 // Copyright (C) 2012 Chen-Pang He <jdh8@ms63.hinet.net>
6 // This Source Code Form is subject to the terms of the Mozilla
7 // Public License v. 2.0. If a copy of the MPL was not distributed
8 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
10 #ifndef EIGEN_SELFADJOINT_PACKED_PRODUCT_H
11 #define EIGEN_SELFADJOINT_PACKED_PRODUCT_H
15 /* Optimized matrix += alpha * uv'
16 * The matrix is in packed form.
18 template<typename Scalar
, typename Index
, int StorageOrder
, int UpLo
, bool ConjLhs
, bool ConjRhs
>
19 struct selfadjoint_packed_rank1_update
;
21 template<typename Scalar
, typename Index
, int UpLo
, bool ConjLhs
, bool ConjRhs
>
22 struct selfadjoint_packed_rank1_update
<Scalar
,Index
,ColMajor
,UpLo
,ConjLhs
,ConjRhs
>
24 typedef typename NumTraits
<Scalar
>::Real RealScalar
;
25 static void run(Index size
, Scalar
* mat
, const Scalar
* vec
, RealScalar alpha
)
27 typedef Map
<const Matrix
<Scalar
,Dynamic
,1> > OtherMap
;
28 typedef typename conj_expr_if
<ConjLhs
,OtherMap
>::type ConjRhsType
;
31 for (Index i
=0; i
<size
; ++i
)
33 Map
<Matrix
<Scalar
,Dynamic
,1> >(mat
, UpLo
==Lower
? size
-i
: (i
+1)) += alpha
* cj(vec
[i
]) * ConjRhsType(OtherMap(vec
+(UpLo
==Lower
? i
: 0), UpLo
==Lower
? size
-i
: (i
+1)));
34 //FIXME This should be handled outside.
35 mat
[UpLo
==Lower
? 0 : i
] = numext::real(mat
[UpLo
==Lower
? 0 : i
]);
36 mat
+= UpLo
==Lower
? size
-i
: (i
+1);
41 template<typename Scalar
, typename Index
, int UpLo
, bool ConjLhs
, bool ConjRhs
>
42 struct selfadjoint_packed_rank1_update
<Scalar
,Index
,RowMajor
,UpLo
,ConjLhs
,ConjRhs
>
44 typedef typename NumTraits
<Scalar
>::Real RealScalar
;
45 static void run(Index size
, Scalar
* mat
, const Scalar
* vec
, RealScalar alpha
)
47 selfadjoint_packed_rank1_update
<Scalar
,Index
,ColMajor
,UpLo
==Lower
?Upper
:Lower
,ConjRhs
,ConjLhs
>::run(size
,mat
,vec
,alpha
);
51 } // end namespace internal
53 #endif // EIGEN_SELFADJOINT_PACKED_PRODUCT_H