Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef EIGEN_SKYLINEMATRIXBASE_H
00011 #define EIGEN_SKYLINEMATRIXBASE_H
00012
00013 #include "SkylineUtil.h"
00014
00015 namespace Eigen {
00016
00026 template<typename Derived> class SkylineMatrixBase : public EigenBase<Derived> {
00027 public:
00028
00029 typedef typename internal::traits<Derived>::Scalar Scalar;
00030 typedef typename internal::traits<Derived>::StorageKind StorageKind;
00031 typedef typename internal::index<StorageKind>::type Index;
00032
00033 enum {
00034 RowsAtCompileTime = internal::traits<Derived>::RowsAtCompileTime,
00040 ColsAtCompileTime = internal::traits<Derived>::ColsAtCompileTime,
00047 SizeAtCompileTime = (internal::size_at_compile_time<internal::traits<Derived>::RowsAtCompileTime,
00048 internal::traits<Derived>::ColsAtCompileTime>::ret),
00053 MaxRowsAtCompileTime = RowsAtCompileTime,
00054 MaxColsAtCompileTime = ColsAtCompileTime,
00055
00056 MaxSizeAtCompileTime = (internal::size_at_compile_time<MaxRowsAtCompileTime,
00057 MaxColsAtCompileTime>::ret),
00058
00059 IsVectorAtCompileTime = RowsAtCompileTime == 1 || ColsAtCompileTime == 1,
00065 Flags = internal::traits<Derived>::Flags,
00070 CoeffReadCost = internal::traits<Derived>::CoeffReadCost,
00075 IsRowMajor = Flags & RowMajorBit ? 1 : 0
00076 };
00077
00078 #ifndef EIGEN_PARSED_BY_DOXYGEN
00079
00085 typedef typename NumTraits<Scalar>::Real RealScalar;
00086
00088 typedef Matrix<Scalar, EIGEN_SIZE_MAX(RowsAtCompileTime, ColsAtCompileTime),
00089 EIGEN_SIZE_MAX(RowsAtCompileTime, ColsAtCompileTime) > SquareMatrixType;
00090
00091 inline const Derived& derived() const {
00092 return *static_cast<const Derived*> (this);
00093 }
00094
00095 inline Derived& derived() {
00096 return *static_cast<Derived*> (this);
00097 }
00098
00099 inline Derived& const_cast_derived() const {
00100 return *static_cast<Derived*> (const_cast<SkylineMatrixBase*> (this));
00101 }
00102 #endif // not EIGEN_PARSED_BY_DOXYGEN
00103
00105 inline Index rows() const {
00106 return derived().rows();
00107 }
00108
00110 inline Index cols() const {
00111 return derived().cols();
00112 }
00113
00116 inline Index size() const {
00117 return rows() * cols();
00118 }
00119
00122 inline Index nonZeros() const {
00123 return derived().nonZeros();
00124 }
00125
00128 Index outerSize() const {
00129 return (int(Flags) & RowMajorBit) ? this->rows() : this->cols();
00130 }
00131
00134 Index innerSize() const {
00135 return (int(Flags) & RowMajorBit) ? this->cols() : this->rows();
00136 }
00137
00138 bool isRValue() const {
00139 return m_isRValue;
00140 }
00141
00142 Derived& markAsRValue() {
00143 m_isRValue = true;
00144 return derived();
00145 }
00146
00147 SkylineMatrixBase() : m_isRValue(false) {
00148
00149 }
00150
00151 inline Derived & operator=(const Derived& other) {
00152 this->operator=<Derived > (other);
00153 return derived();
00154 }
00155
00156 template<typename OtherDerived>
00157 inline void assignGeneric(const OtherDerived& other) {
00158 derived().resize(other.rows(), other.cols());
00159 for (Index row = 0; row < rows(); row++)
00160 for (Index col = 0; col < cols(); col++) {
00161 if (other.coeff(row, col) != Scalar(0))
00162 derived().insert(row, col) = other.coeff(row, col);
00163 }
00164 derived().finalize();
00165 }
00166
00167 template<typename OtherDerived>
00168 inline Derived & operator=(const SkylineMatrixBase<OtherDerived>& other) {
00169
00170 }
00171
00172 template<typename Lhs, typename Rhs>
00173 inline Derived & operator=(const SkylineProduct<Lhs, Rhs, SkylineTimeSkylineProduct>& product);
00174
00175 friend std::ostream & operator <<(std::ostream & s, const SkylineMatrixBase& m) {
00176 s << m.derived();
00177 return s;
00178 }
00179
00180 template<typename OtherDerived>
00181 const typename SkylineProductReturnType<Derived, OtherDerived>::Type
00182 operator*(const MatrixBase<OtherDerived> &other) const;
00183
00185 template<typename DenseDerived>
00186 void evalTo(MatrixBase<DenseDerived>& dst) const {
00187 dst.setZero();
00188 for (Index i = 0; i < rows(); i++)
00189 for (Index j = 0; j < rows(); j++)
00190 dst(i, j) = derived().coeff(i, j);
00191 }
00192
00193 Matrix<Scalar, RowsAtCompileTime, ColsAtCompileTime> toDense() const {
00194 return derived();
00195 }
00196
00202 EIGEN_STRONG_INLINE const typename internal::eval<Derived, IsSkyline>::type eval() const {
00203 return typename internal::eval<Derived>::type(derived());
00204 }
00205
00206 protected:
00207 bool m_isRValue;
00208 };
00209
00210 }
00211
00212 #endif // EIGEN_SkylineMatrixBase_H