11 #ifndef EIGEN_DIAGONALPRODUCT_H 12 #define EIGEN_DIAGONALPRODUCT_H 17 template<
typename MatrixType,
typename DiagonalType,
int ProductOrder>
18 struct traits<DiagonalProduct<MatrixType, DiagonalType, ProductOrder> >
21 typedef typename scalar_product_traits<typename MatrixType::Scalar, typename DiagonalType::Scalar>::ReturnType Scalar;
23 RowsAtCompileTime = MatrixType::RowsAtCompileTime,
24 ColsAtCompileTime = MatrixType::ColsAtCompileTime,
25 MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
26 MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime,
29 _PacketOnDiag = !((int(_StorageOrder) ==
RowMajor && int(ProductOrder) ==
OnTheLeft)
31 _SameTypes = is_same<typename MatrixType::Scalar, typename DiagonalType::Scalar>::value,
34 _Vectorizable = bool(
int(MatrixType::Flags)&
PacketAccessBit) && _SameTypes && ((!_PacketOnDiag) || (
bool(
int(DiagonalType::Flags)&
PacketAccessBit))),
36 Flags = (HereditaryBits & (
unsigned int)(MatrixType::Flags)) | (_Vectorizable ?
PacketAccessBit : 0),
37 CoeffReadCost = NumTraits<Scalar>::MulCost + MatrixType::CoeffReadCost + DiagonalType::DiagonalVectorType::CoeffReadCost
42 template<
typename MatrixType,
typename DiagonalType,
int ProductOrder>
43 class DiagonalProduct : internal::no_assignment_operator,
44 public MatrixBase<DiagonalProduct<MatrixType, DiagonalType, ProductOrder> >
48 typedef MatrixBase<DiagonalProduct> Base;
49 EIGEN_DENSE_PUBLIC_INTERFACE(DiagonalProduct)
51 inline DiagonalProduct(
const MatrixType& matrix,
const DiagonalType& diagonal)
52 : m_matrix(matrix), m_diagonal(diagonal)
54 eigen_assert(diagonal.diagonal().size() == (ProductOrder ==
OnTheLeft ? matrix.rows() : matrix.cols()));
57 inline Index rows()
const {
return m_matrix.rows(); }
58 inline Index cols()
const {
return m_matrix.cols(); }
60 const Scalar coeff(Index row, Index col)
const 62 return m_diagonal.diagonal().coeff(ProductOrder ==
OnTheLeft ? row : col) * m_matrix.coeff(row, col);
65 template<
int LoadMode>
66 EIGEN_STRONG_INLINE PacketScalar packet(Index row, Index col)
const 71 const Index indexInDiagonalVector = ProductOrder ==
OnTheLeft ? row : col;
73 return packet_impl<LoadMode>(row,col,indexInDiagonalVector,
typename internal::conditional<
75 ||(
int(StorageOrder) ==
ColMajor &&
int(ProductOrder) ==
OnTheRight)), internal::true_type, internal::false_type>::type());
79 template<
int LoadMode>
80 EIGEN_STRONG_INLINE PacketScalar packet_impl(Index row, Index col, Index
id, internal::true_type)
const 82 return internal::pmul(m_matrix.template packet<LoadMode>(row, col),
83 internal::pset1<PacketScalar>(m_diagonal.diagonal().coeff(
id)));
86 template<
int LoadMode>
87 EIGEN_STRONG_INLINE PacketScalar packet_impl(Index row, Index col, Index
id, internal::false_type)
const 90 InnerSize = (MatrixType::Flags &
RowMajorBit) ? MatrixType::ColsAtCompileTime : MatrixType::RowsAtCompileTime,
93 return internal::pmul(m_matrix.template packet<LoadMode>(row, col),
94 m_diagonal.diagonal().template packet<DiagonalVectorPacketLoadMode>(
id));
97 typename MatrixType::Nested m_matrix;
98 typename DiagonalType::Nested m_diagonal;
103 template<
typename Derived>
104 template<
typename DiagonalDerived>
105 inline const DiagonalProduct<Derived, DiagonalDerived, OnTheRight>
108 return DiagonalProduct<Derived, DiagonalDerived, OnTheRight>(derived(), diagonal.derived());
113 template<
typename DiagonalDerived>
114 template<
typename MatrixDerived>
115 inline const DiagonalProduct<MatrixDerived, DiagonalDerived, OnTheLeft>
118 return DiagonalProduct<MatrixDerived, DiagonalDerived, OnTheLeft>(matrix.derived(), derived());
123 #endif // EIGEN_DIAGONALPRODUCT_H Definition: Constants.h:259
Definition: Constants.h:272
Definition: Constants.h:187
const ScalarMultipleReturnType operator *(const Scalar &scalar) const
Definition: MatrixBase.h:50
const unsigned int PacketAccessBit
Definition: Constants.h:76
Definition: DenseBase.h:152
Definition: Constants.h:270
Definition: Constants.h:257
internal::traits< Derived >::Index Index
The type of indices.
Definition: DenseBase.h:51
Definition: Constants.h:189
const unsigned int RowMajorBit
Definition: Constants.h:48
Base class for all dense matrices, vectors, and expressions.
Definition: MatrixBase.h:48