11 #ifndef EIGEN_DIAGONALMATRIX_H 12 #define EIGEN_DIAGONALMATRIX_H 16 #ifndef EIGEN_PARSED_BY_DOXYGEN 17 template<
typename Derived>
18 class DiagonalBase :
public EigenBase<Derived>
21 typedef typename internal::traits<Derived>::DiagonalVectorType DiagonalVectorType;
22 typedef typename DiagonalVectorType::Scalar Scalar;
23 typedef typename DiagonalVectorType::RealScalar RealScalar;
24 typedef typename internal::traits<Derived>::StorageKind StorageKind;
25 typedef typename internal::traits<Derived>::StorageIndex StorageIndex;
28 RowsAtCompileTime = DiagonalVectorType::SizeAtCompileTime,
29 ColsAtCompileTime = DiagonalVectorType::SizeAtCompileTime,
30 MaxRowsAtCompileTime = DiagonalVectorType::MaxSizeAtCompileTime,
31 MaxColsAtCompileTime = DiagonalVectorType::MaxSizeAtCompileTime,
32 IsVectorAtCompileTime = 0,
36 typedef Matrix<Scalar, RowsAtCompileTime, ColsAtCompileTime, 0, MaxRowsAtCompileTime, MaxColsAtCompileTime> DenseMatrixType;
37 typedef DenseMatrixType DenseType;
38 typedef DiagonalMatrix<Scalar,DiagonalVectorType::SizeAtCompileTime,DiagonalVectorType::MaxSizeAtCompileTime> PlainObject;
41 inline const Derived& derived()
const {
return *
static_cast<const Derived*
>(
this); }
43 inline Derived& derived() {
return *
static_cast<Derived*
>(
this); }
46 DenseMatrixType toDenseMatrix()
const {
return derived(); }
49 inline const DiagonalVectorType& diagonal()
const {
return derived().diagonal(); }
51 inline DiagonalVectorType& diagonal() {
return derived().diagonal(); }
54 inline Index rows()
const {
return diagonal().size(); }
56 inline Index cols()
const {
return diagonal().size(); }
58 template<
typename MatrixDerived>
60 const Product<Derived,MatrixDerived,LazyProduct>
61 operator*(
const MatrixBase<MatrixDerived> &matrix)
const 63 return Product<Derived, MatrixDerived, LazyProduct>(derived(),matrix.derived());
66 typedef DiagonalWrapper<const CwiseUnaryOp<internal::scalar_inverse_op<Scalar>,
const DiagonalVectorType> > InverseReturnType;
68 inline const InverseReturnType
71 return InverseReturnType(diagonal().cwiseInverse());
75 inline const DiagonalWrapper<const EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(DiagonalVectorType,Scalar,product) >
78 return DiagonalWrapper<const EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(DiagonalVectorType,Scalar,product) >(diagonal() * scalar);
81 friend inline const DiagonalWrapper<const EIGEN_SCALAR_BINARYOP_EXPR_RETURN_TYPE(Scalar,DiagonalVectorType,product) >
82 operator*(
const Scalar& scalar,
const DiagonalBase& other)
84 return DiagonalWrapper<const EIGEN_SCALAR_BINARYOP_EXPR_RETURN_TYPE(Scalar,DiagonalVectorType,product) >(scalar * other.diagonal());
104 template<
typename _Scalar,
int SizeAtCompileTime,
int MaxSizeAtCompileTime>
105 struct traits<DiagonalMatrix<_Scalar,SizeAtCompileTime,MaxSizeAtCompileTime> >
106 : traits<Matrix<_Scalar,SizeAtCompileTime,SizeAtCompileTime,0,MaxSizeAtCompileTime,MaxSizeAtCompileTime> >
108 typedef Matrix<_Scalar,SizeAtCompileTime,1,0,MaxSizeAtCompileTime,1> DiagonalVectorType;
109 typedef DiagonalShape StorageKind;
115 template<
typename _Scalar,
int SizeAtCompileTime,
int MaxSizeAtCompileTime>
117 :
public DiagonalBase<DiagonalMatrix<_Scalar,SizeAtCompileTime,MaxSizeAtCompileTime> >
120 #ifndef EIGEN_PARSED_BY_DOXYGEN 121 typedef typename internal::traits<DiagonalMatrix>::DiagonalVectorType DiagonalVectorType;
123 typedef _Scalar Scalar;
124 typedef typename internal::traits<DiagonalMatrix>::StorageKind StorageKind;
125 typedef typename internal::traits<DiagonalMatrix>::StorageIndex StorageIndex;
130 DiagonalVectorType m_diagonal;
136 inline const DiagonalVectorType&
diagonal()
const {
return m_diagonal; }
139 inline DiagonalVectorType&
diagonal() {
return m_diagonal; }
155 inline DiagonalMatrix(
const Scalar& x,
const Scalar& y,
const Scalar& z) : m_diagonal(x,y,z) {}
158 template<
typename OtherDerived>
160 inline DiagonalMatrix(
const DiagonalBase<OtherDerived>& other) : m_diagonal(other.diagonal()) {}
162 #ifndef EIGEN_PARSED_BY_DOXYGEN 168 template<
typename OtherDerived>
174 template<
typename OtherDerived>
178 m_diagonal = other.diagonal();
182 #ifndef EIGEN_PARSED_BY_DOXYGEN 199 inline void setZero() { m_diagonal.setZero(); }
226 template<
typename _DiagonalVectorType>
227 struct traits<DiagonalWrapper<_DiagonalVectorType> >
229 typedef _DiagonalVectorType DiagonalVectorType;
230 typedef typename DiagonalVectorType::Scalar Scalar;
231 typedef typename DiagonalVectorType::StorageIndex StorageIndex;
232 typedef DiagonalShape StorageKind;
233 typedef typename traits<DiagonalVectorType>::XprKind XprKind;
235 RowsAtCompileTime = DiagonalVectorType::SizeAtCompileTime,
236 ColsAtCompileTime = DiagonalVectorType::SizeAtCompileTime,
237 MaxRowsAtCompileTime = DiagonalVectorType::MaxSizeAtCompileTime,
238 MaxColsAtCompileTime = DiagonalVectorType::MaxSizeAtCompileTime,
244 template<
typename _DiagonalVectorType>
246 :
public DiagonalBase<DiagonalWrapper<_DiagonalVectorType> >, internal::no_assignment_operator
249 #ifndef EIGEN_PARSED_BY_DOXYGEN 250 typedef _DiagonalVectorType DiagonalVectorType;
256 explicit inline DiagonalWrapper(DiagonalVectorType& a_diagonal) : m_diagonal(a_diagonal) {}
260 const DiagonalVectorType&
diagonal()
const {
return m_diagonal; }
263 typename DiagonalVectorType::Nested m_diagonal;
275 template<
typename Derived>
290 template<
typename Derived>
293 if(cols() != rows())
return false;
294 RealScalar maxAbsOnDiagonal =
static_cast<RealScalar
>(-1);
295 for(
Index j = 0; j < cols(); ++j)
297 RealScalar absOnDiagonal = numext::abs(coeff(j,j));
298 if(absOnDiagonal > maxAbsOnDiagonal) maxAbsOnDiagonal = absOnDiagonal;
300 for(
Index j = 0; j < cols(); ++j)
301 for(
Index i = 0; i < j; ++i)
303 if(!internal::isMuchSmallerThan(coeff(i, j), maxAbsOnDiagonal, prec))
return false;
304 if(!internal::isMuchSmallerThan(coeff(j, i), maxAbsOnDiagonal, prec))
return false;
311 template<>
struct storage_kind_to_shape<DiagonalShape> {
typedef DiagonalShape Shape; };
313 struct Diagonal2Dense {};
315 template<>
struct AssignmentKind<DenseShape,DiagonalShape> {
typedef Diagonal2Dense Kind; };
318 template<
typename DstXprType,
typename SrcXprType,
typename Functor>
319 struct Assignment<DstXprType, SrcXprType, Functor, Diagonal2Dense>
321 static void run(DstXprType &dst,
const SrcXprType &src,
const internal::assign_op<typename DstXprType::Scalar,typename SrcXprType::Scalar> &)
323 Index dstRows = src.rows();
324 Index dstCols = src.cols();
325 if((dst.rows()!=dstRows) || (dst.cols()!=dstCols))
326 dst.resize(dstRows, dstCols);
329 dst.diagonal() = src.diagonal();
332 static void run(DstXprType &dst,
const SrcXprType &src,
const internal::add_assign_op<typename DstXprType::Scalar,typename SrcXprType::Scalar> &)
333 { dst.diagonal() += src.diagonal(); }
335 static void run(DstXprType &dst,
const SrcXprType &src,
const internal::sub_assign_op<typename DstXprType::Scalar,typename SrcXprType::Scalar> &)
336 { dst.diagonal() -= src.diagonal(); }
343 #endif // EIGEN_DIAGONALMATRIX_H DiagonalMatrix & operator=(const DiagonalBase< OtherDerived > &other)
Definition: DiagonalMatrix.h:176
DiagonalMatrix(const DiagonalBase< OtherDerived > &other)
Definition: DiagonalMatrix.h:160
void setIdentity()
Definition: DiagonalMatrix.h:205
const unsigned int LvalueBit
Definition: Constants.h:139
DiagonalMatrix(const Scalar &x, const Scalar &y)
Definition: DiagonalMatrix.h:151
Represents a diagonal matrix with its storage.
Definition: DiagonalMatrix.h:116
Namespace containing all symbols from the Eigen library.
Definition: Core:287
void resize(Index size)
Definition: DiagonalMatrix.h:196
Eigen::Index Index
The interface type of indices.
Definition: EigenBase.h:38
DiagonalWrapper(DiagonalVectorType &a_diagonal)
Definition: DiagonalMatrix.h:256
const DiagonalVectorType & diagonal() const
Definition: DiagonalMatrix.h:136
void setZero()
Definition: DiagonalMatrix.h:199
DiagonalMatrix()
Definition: DiagonalMatrix.h:143
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_inverse_op< typename Derived::Scalar >, const Derived > inverse(const Eigen::ArrayBase< Derived > &x)
const Product< MatrixDerived, PermutationDerived, AliasFreeProduct > operator*(const MatrixBase< MatrixDerived > &matrix, const PermutationBase< PermutationDerived > &permutation)
Definition: PermutationMatrix.h:543
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:33
DiagonalMatrix(const Scalar &x, const Scalar &y, const Scalar &z)
Definition: DiagonalMatrix.h:155
bool isDiagonal(const RealScalar &prec=NumTraits< Scalar >::dummy_precision()) const
Definition: DiagonalMatrix.h:291
const DiagonalWrapper< const Derived > asDiagonal() const
Definition: DiagonalMatrix.h:277
DiagonalMatrix(Index dim)
Definition: DiagonalMatrix.h:147
const DiagonalVectorType & diagonal() const
Definition: DiagonalMatrix.h:260
Definition: Eigen_Colamd.h:50
DiagonalVectorType & diagonal()
Definition: DiagonalMatrix.h:139
Expression of a diagonal matrix.
Definition: DiagonalMatrix.h:245
void setIdentity(Index size)
Definition: DiagonalMatrix.h:208
DiagonalMatrix(const MatrixBase< OtherDerived > &other)
Definition: DiagonalMatrix.h:170
Base class for all dense matrices, vectors, and expressions.
Definition: MatrixBase.h:48
void setZero(Index size)
Definition: DiagonalMatrix.h:202
const unsigned int NoPreferredStorageOrderBit
Definition: Constants.h:173