Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
DiagonalProduct.h
00001 // This file is part of Eigen, a lightweight C++ template library 00002 // for linear algebra. 00003 // 00004 // Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr> 00005 // Copyright (C) 2007-2009 Benoit Jacob <jacob.benoit.1@gmail.com> 00006 // 00007 // This Source Code Form is subject to the terms of the Mozilla 00008 // Public License v. 2.0. If a copy of the MPL was not distributed 00009 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 00010 00011 #ifndef EIGEN_DIAGONALPRODUCT_H 00012 #define EIGEN_DIAGONALPRODUCT_H 00013 00014 namespace Eigen { 00015 00016 namespace internal { 00017 template<typename MatrixType, typename DiagonalType, int ProductOrder> 00018 struct traits<DiagonalProduct<MatrixType, DiagonalType, ProductOrder> > 00019 : traits<MatrixType> 00020 { 00021 typedef typename scalar_product_traits<typename MatrixType::Scalar, typename DiagonalType::Scalar>::ReturnType Scalar; 00022 enum { 00023 RowsAtCompileTime = MatrixType::RowsAtCompileTime, 00024 ColsAtCompileTime = MatrixType::ColsAtCompileTime, 00025 MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime, 00026 MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime, 00027 00028 _StorageOrder = MatrixType::Flags & RowMajorBit ? RowMajor : ColMajor, 00029 _ScalarAccessOnDiag = !((int(_StorageOrder) == ColMajor && int(ProductOrder) == OnTheLeft) 00030 ||(int(_StorageOrder) == RowMajor && int(ProductOrder) == OnTheRight)), 00031 _SameTypes = is_same<typename MatrixType::Scalar, typename DiagonalType::Scalar>::value, 00032 // FIXME currently we need same types, but in the future the next rule should be the one 00033 //_Vectorizable = bool(int(MatrixType::Flags)&PacketAccessBit) && ((!_PacketOnDiag) || (_SameTypes && bool(int(DiagonalType::DiagonalVectorType::Flags)&PacketAccessBit))), 00034 _Vectorizable = bool(int(MatrixType::Flags)&PacketAccessBit) && _SameTypes && (_ScalarAccessOnDiag || (bool(int(DiagonalType::DiagonalVectorType::Flags)&PacketAccessBit))), 00035 _LinearAccessMask = (RowsAtCompileTime==1 || ColsAtCompileTime==1) ? LinearAccessBit : 0, 00036 00037 Flags = ((HereditaryBits|_LinearAccessMask|AlignedBit) & (unsigned int)(MatrixType::Flags)) | (_Vectorizable ? PacketAccessBit : 0),//(int(MatrixType::Flags)&int(DiagonalType::DiagonalVectorType::Flags)&AlignedBit), 00038 Cost0 = EIGEN_ADD_COST(NumTraits<Scalar>::MulCost, MatrixType::CoeffReadCost), 00039 CoeffReadCost = EIGEN_ADD_COST(Cost0,DiagonalType::DiagonalVectorType::CoeffReadCost) 00040 }; 00041 }; 00042 } 00043 00044 template<typename MatrixType, typename DiagonalType, int ProductOrder> 00045 class DiagonalProduct : internal::no_assignment_operator, 00046 public MatrixBase<DiagonalProduct<MatrixType, DiagonalType, ProductOrder> > 00047 { 00048 public: 00049 00050 typedef MatrixBase<DiagonalProduct> Base; 00051 EIGEN_DENSE_PUBLIC_INTERFACE(DiagonalProduct) 00052 00053 inline DiagonalProduct(const MatrixType& matrix, const DiagonalType& diagonal) 00054 : m_matrix(matrix), m_diagonal(diagonal) 00055 { 00056 eigen_assert(diagonal.diagonal().size() == (ProductOrder == OnTheLeft ? matrix.rows() : matrix.cols())); 00057 } 00058 00059 EIGEN_STRONG_INLINE Index rows() const { return m_matrix.rows(); } 00060 EIGEN_STRONG_INLINE Index cols() const { return m_matrix.cols(); } 00061 00062 EIGEN_STRONG_INLINE const Scalar coeff(Index row, Index col) const 00063 { 00064 return m_diagonal.diagonal().coeff(ProductOrder == OnTheLeft ? row : col) * m_matrix.coeff(row, col); 00065 } 00066 00067 EIGEN_STRONG_INLINE const Scalar coeff(Index idx) const 00068 { 00069 enum { 00070 StorageOrder = int(MatrixType::Flags) & RowMajorBit ? RowMajor : ColMajor 00071 }; 00072 return coeff(int(StorageOrder)==ColMajor?idx:0,int(StorageOrder)==ColMajor?0:idx); 00073 } 00074 00075 template<int LoadMode> 00076 EIGEN_STRONG_INLINE PacketScalar packet(Index row, Index col) const 00077 { 00078 enum { 00079 StorageOrder = Flags & RowMajorBit ? RowMajor : ColMajor 00080 }; 00081 const Index indexInDiagonalVector = ProductOrder == OnTheLeft ? row : col; 00082 return packet_impl<LoadMode>(row,col,indexInDiagonalVector,typename internal::conditional< 00083 ((int(StorageOrder) == RowMajor && int(ProductOrder) == OnTheLeft) 00084 ||(int(StorageOrder) == ColMajor && int(ProductOrder) == OnTheRight)), internal::true_type, internal::false_type>::type()); 00085 } 00086 00087 template<int LoadMode> 00088 EIGEN_STRONG_INLINE PacketScalar packet(Index idx) const 00089 { 00090 enum { 00091 StorageOrder = int(MatrixType::Flags) & RowMajorBit ? RowMajor : ColMajor 00092 }; 00093 return packet<LoadMode>(int(StorageOrder)==ColMajor?idx:0,int(StorageOrder)==ColMajor?0:idx); 00094 } 00095 00096 protected: 00097 template<int LoadMode> 00098 EIGEN_STRONG_INLINE PacketScalar packet_impl(Index row, Index col, Index id, internal::true_type) const 00099 { 00100 return internal::pmul(m_matrix.template packet<LoadMode>(row, col), 00101 internal::pset1<PacketScalar>(m_diagonal.diagonal().coeff(id))); 00102 } 00103 00104 template<int LoadMode> 00105 EIGEN_STRONG_INLINE PacketScalar packet_impl(Index row, Index col, Index id, internal::false_type) const 00106 { 00107 enum { 00108 InnerSize = (MatrixType::Flags & RowMajorBit) ? MatrixType::ColsAtCompileTime : MatrixType::RowsAtCompileTime, 00109 DiagonalVectorPacketLoadMode = (LoadMode == Aligned && (((InnerSize%16) == 0) || (int(DiagonalType::DiagonalVectorType::Flags)&AlignedBit)==AlignedBit) ? Aligned : Unaligned) 00110 }; 00111 return internal::pmul(m_matrix.template packet<LoadMode>(row, col), 00112 m_diagonal.diagonal().template packet<DiagonalVectorPacketLoadMode>(id)); 00113 } 00114 00115 typename MatrixType::Nested m_matrix; 00116 typename DiagonalType::Nested m_diagonal; 00117 }; 00118 00119 /** \returns the diagonal matrix product of \c *this by the diagonal matrix \a diagonal. 00120 */ 00121 template<typename Derived> 00122 template<typename DiagonalDerived> 00123 inline const DiagonalProduct<Derived, DiagonalDerived, OnTheRight> 00124 MatrixBase<Derived>::operator* (const DiagonalBase<DiagonalDerived> &a_diagonal) const 00125 { 00126 return DiagonalProduct<Derived, DiagonalDerived, OnTheRight>(derived(), a_diagonal.derived()); 00127 } 00128 00129 } // end namespace Eigen 00130 00131 #endif // EIGEN_DIAGONALPRODUCT_H
Generated on Thu Nov 17 2022 22:01:28 by
1.7.2