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 _ScalarAccessOnDiag = !((int(_StorageOrder) ==
ColMajor && int(ProductOrder) ==
OnTheLeft)
31 _SameTypes = is_same<typename MatrixType::Scalar, typename DiagonalType::Scalar>::value,
34 _Vectorizable = bool(
int(MatrixType::Flags)&
PacketAccessBit) && _SameTypes && (_ScalarAccessOnDiag || (bool(
int(DiagonalType::DiagonalVectorType::Flags)&
PacketAccessBit))),
35 _LinearAccessMask = (RowsAtCompileTime==1 || ColsAtCompileTime==1) ?
LinearAccessBit : 0,
37 Flags = ((HereditaryBits|_LinearAccessMask) & (
unsigned int)(MatrixType::Flags)) | (_Vectorizable ?
PacketAccessBit : 0) |
AlignedBit,
38 CoeffReadCost = NumTraits<Scalar>::MulCost + MatrixType::CoeffReadCost + DiagonalType::DiagonalVectorType::CoeffReadCost
43 template<
typename MatrixType,
typename DiagonalType,
int ProductOrder>
44 class DiagonalProduct : internal::no_assignment_operator,
45 public MatrixBase<DiagonalProduct<MatrixType, DiagonalType, ProductOrder> >
49 typedef MatrixBase<DiagonalProduct> Base;
50 EIGEN_DENSE_PUBLIC_INTERFACE(DiagonalProduct)
52 inline DiagonalProduct(const MatrixType& matrix, const DiagonalType& diagonal)
53 : m_matrix(matrix), m_diagonal(diagonal)
55 eigen_assert(diagonal.diagonal().size() == (ProductOrder ==
OnTheLeft ? matrix.rows() : matrix.cols()));
58 EIGEN_STRONG_INLINE
Index rows()
const {
return m_matrix.rows(); }
59 EIGEN_STRONG_INLINE
Index cols()
const {
return m_matrix.cols(); }
61 EIGEN_STRONG_INLINE
const Scalar coeff(Index row, Index col)
const
63 return m_diagonal.diagonal().coeff(ProductOrder ==
OnTheLeft ? row : col) * m_matrix.coeff(row, col);
66 EIGEN_STRONG_INLINE
const Scalar coeff(Index idx)
const
71 return coeff(
int(StorageOrder)==
ColMajor?idx:0,
int(StorageOrder)==
ColMajor?0:idx);
74 template<
int LoadMode>
75 EIGEN_STRONG_INLINE PacketScalar packet(Index row, Index col)
const
80 const Index indexInDiagonalVector = ProductOrder ==
OnTheLeft ? row : col;
81 return packet_impl<LoadMode>(row,col,indexInDiagonalVector,
typename internal::conditional<
83 ||(
int(StorageOrder) ==
ColMajor && int(ProductOrder) ==
OnTheRight)), internal::true_type, internal::false_type>::type());
86 template<
int LoadMode>
87 EIGEN_STRONG_INLINE PacketScalar packet(Index idx)
const
92 return packet<LoadMode>(int(StorageOrder)==
ColMajor?idx:0,int(StorageOrder)==
ColMajor?0:idx);
96 template<
int LoadMode>
97 EIGEN_STRONG_INLINE PacketScalar packet_impl(Index row, Index col, Index
id, internal::true_type)
const
99 return internal::pmul(m_matrix.template packet<LoadMode>(row, col),
100 internal::pset1<PacketScalar>(m_diagonal.diagonal().coeff(
id)));
103 template<
int LoadMode>
104 EIGEN_STRONG_INLINE PacketScalar packet_impl(Index row, Index col, Index
id, internal::false_type)
const
107 InnerSize = (MatrixType::Flags &
RowMajorBit) ? MatrixType::ColsAtCompileTime : MatrixType::RowsAtCompileTime,
108 DiagonalVectorPacketLoadMode = (LoadMode ==
Aligned && (((InnerSize%16) == 0) || (
int(DiagonalType::DiagonalVectorType::Flags)&
AlignedBit)==AlignedBit) ?
Aligned :
Unaligned)
110 return internal::pmul(m_matrix.template packet<LoadMode>(row, col),
111 m_diagonal.diagonal().template packet<DiagonalVectorPacketLoadMode>(id));
114 typename MatrixType::Nested m_matrix;
115 typename DiagonalType::Nested m_diagonal;
120 template<
typename Derived>
121 template<
typename DiagonalDerived>
122 inline const DiagonalProduct<Derived, DiagonalDerived, OnTheRight>
125 return DiagonalProduct<Derived, DiagonalDerived, OnTheRight>(derived(), a_diagonal.derived());
130 #endif // EIGEN_DIAGONALPRODUCT_H
Definition: Constants.h:277
const unsigned int PacketAccessBit
Definition: Constants.h:81
Definition: DenseBase.h:162
const ScalarMultipleReturnType operator*(const Scalar &scalar) const
Definition: MatrixBase.h:50
Definition: Constants.h:192
Definition: Constants.h:279
const unsigned int LinearAccessBit
Definition: Constants.h:117
Definition: Constants.h:194
internal::traits< Derived >::Index Index
The type of indices.
Definition: DenseBase.h:61
const unsigned int RowMajorBit
Definition: Constants.h:53
const unsigned int AlignedBit
Definition: Constants.h:147
Definition: Constants.h:266
Definition: Constants.h:264