RE: [eigen] SparseMatrix with non POD-"Scalar" type (e.g. SparseBlockMatrix) yields unnecessary initialisations of Scalar-type?

[ Thread Index | Date Index | More lists.tuxfamily.org/eigen Archives ]


Hello all,

I've tried to get one of the built-in sparse solvers (ConjugateGradient for the
moment) to accept my BlockMatrix "Scalar"-type. This BlockMatrix-Scalar behaves
a bit like a complex number in that its Real-type != to the type itself
(because many epsilons and comparisons etc. use this type).
I've defined some of the needed operators on my "Scalar" type, but some
things don't work.

There's one oddity I don't understand: I've had to define
Eigen::internal::scalar_product_traits for <BlockMatrix, BlockMatrix::Scalar>
(which I found a bit strange as Matrix<double, 5, 5> * double should already
be available).

A problem I'm currently stuck at is why Eigen doesn't seem to pick up my
definitions of real() and abs2():
The calls happen in ConjugateGradient.h:49
  RealScalar absNew = internal::real(residual.dot(p));
=> residual and p are vectors of my Scalar-type, so vectors of 5x5 matrices for
example.
The other culprit is in the next line, i.e. ConjugateGradient.h:50
  RealScalar rhsNorm2 = rhs.squaredNorm();
which is from Dot.h:115
  return internal::real((*this).cwiseAbs2().sum());
but it seems the cwiseAbs2() again only finds the internal implementation.

The actual compilation errors are as follows (from the internal::real & abs2):
eigen-3.2.0/Eigen/src/Core/MathFunctions.h:68:12: No viable conversion from 'const BlockMatrixWrapper<Eigen::Matrix<double, 5, 5, 0, 5, 5> >' to 'RealScalar' (aka 'double')

eigen-3.2.0/Eigen/src/Core/MathFunctions.h:263:12: No viable conversion from 'const typename ProductReturnType<Matrix<double, 5, 5, 0, 5, 5>, Matrix<double, 5, 5, 0, 5, 5> >::Type' (aka 'const CoeffBasedProduct<LhsNested, RhsNested, EvalBeforeAssigningBit | EvalBeforeNestingBit>') to 'RealScalar' (aka 'double')

in spite of me having defined
template<typename B>
inline typename Eigen::NumTraits<typename B::Scalar>::Real abs2(const BlockMatrixWrapper<B>& x)
and
template<typename B>
inline typename Eigen::NumTraits<typename B::Scalar>::Real real(const BlockMatrixWrapper<B>& x)

Attached is my current code (which doesn't compile due to the mentioned problems).


Best regards

Daniel Vollmer

--------------------------
Deutsches Zentrum für Luft- und Raumfahrt e.V. (DLR)
German Aerospace Center
Institute of Aerodynamics and Flow Technology | Lilienthalplatz 7 | 38108 Braunschweig | Germany

Attachment: BlockMatrixWrapper.h
Description: BlockMatrixWrapper.h

Attachment: main.cpp
Description: main.cpp



Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/