aboutsummaryrefslogtreecommitdiffhomepage
path: root/blas/PackedSelfadjointProduct.h
diff options
context:
space:
mode:
Diffstat (limited to 'blas/PackedSelfadjointProduct.h')
-rw-r--r--blas/PackedSelfadjointProduct.h19
1 files changed, 7 insertions, 12 deletions
diff --git a/blas/PackedSelfadjointProduct.h b/blas/PackedSelfadjointProduct.h
index 1ba67b9c1..f7c9b9341 100644
--- a/blas/PackedSelfadjointProduct.h
+++ b/blas/PackedSelfadjointProduct.h
@@ -14,12 +14,6 @@ namespace internal {
/* Optimized matrix += alpha * uv'
* The matrix is in packed form.
- *
- * FIXME I always fail tests for complex self-adjoint matrices.
- *
- * ******* FATAL ERROR - PARAMETER NUMBER 6 WAS CHANGED INCORRECTLY *******
- * ******* xHPR FAILED ON CALL NUMBER:
- * 2: xHPR ('U', 1, 0.0, X, 1, AP)
*/
template<typename Scalar, typename Index, int StorageOrder, int UpLo, bool ConjLhs, bool ConjRhs>
struct selfadjoint_packed_rank1_update;
@@ -27,20 +21,20 @@ struct selfadjoint_packed_rank1_update;
template<typename Scalar, typename Index, int UpLo, bool ConjLhs, bool ConjRhs>
struct selfadjoint_packed_rank1_update<Scalar,Index,ColMajor,UpLo,ConjLhs,ConjRhs>
{
- static void run(Index size, Scalar* mat, const Scalar* vec, Scalar alpha)
+ typedef typename NumTraits<Scalar>::Real RealScalar;
+ static void run(Index size, Scalar* mat, const Scalar* vec, RealScalar alpha)
{
typedef Map<const Matrix<Scalar,Dynamic,1> > OtherMap;
typedef typename conj_expr_if<ConjLhs,OtherMap>::type ConjRhsType;
conj_if<ConjRhs> cj;
- Index offset = 0;
for (Index i=0; i<size; ++i)
{
- Map<Matrix<Scalar,Dynamic,1> >(mat+offset, UpLo==Lower ? size-i : (i+1))
+ 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)));
//FIXME This should be handled outside.
- mat[offset+(UpLo==Lower ? 0 : i)] = real(mat[offset+(UpLo==Lower ? 0 : i)]);
- offset += UpLo==Lower ? size-i : (i+1);
+ mat[UpLo==Lower ? 0 : i] = real(mat[UpLo==Lower ? 0 : i]);
+ mat += UpLo==Lower ? size-i : (i+1);
}
}
};
@@ -48,7 +42,8 @@ struct selfadjoint_packed_rank1_update<Scalar,Index,ColMajor,UpLo,ConjLhs,ConjRh
template<typename Scalar, typename Index, int UpLo, bool ConjLhs, bool ConjRhs>
struct selfadjoint_packed_rank1_update<Scalar,Index,RowMajor,UpLo,ConjLhs,ConjRhs>
{
- static void run(Index size, Scalar* mat, const Scalar* vec, Scalar alpha)
+ typedef typename NumTraits<Scalar>::Real RealScalar;
+ static void run(Index size, Scalar* mat, const Scalar* vec, RealScalar alpha)
{
selfadjoint_packed_rank1_update<Scalar,Index,ColMajor,UpLo==Lower?Upper:Lower,ConjRhs,ConjLhs>::run(size,mat,vec,alpha);
}