Branch data Line data Source code
1 : : // This file is part of Eigen, a lightweight C++ template library
2 : : // for linear algebra.
3 : : //
4 : : // Copyright (C) 2007-2010 Benoit Jacob <jacob.benoit.1@gmail.com>
5 : : // Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr>
6 : : //
7 : : // This Source Code Form is subject to the terms of the Mozilla
8 : : // Public License v. 2.0. If a copy of the MPL was not distributed
9 : : // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
10 : :
11 : : #ifndef EIGEN_DENSEBASE_H
12 : : #define EIGEN_DENSEBASE_H
13 : :
14 : : namespace Eigen {
15 : :
16 : : namespace internal {
17 : :
18 : : // The index type defined by EIGEN_DEFAULT_DENSE_INDEX_TYPE must be a signed type.
19 : : // This dummy function simply aims at checking that at compile time.
20 : : static inline void check_DenseIndex_is_signed() {
21 : : EIGEN_STATIC_ASSERT(NumTraits<DenseIndex>::IsSigned,THE_INDEX_TYPE_MUST_BE_A_SIGNED_TYPE)
22 : : }
23 : :
24 : : } // end namespace internal
25 : :
26 : : /** \class DenseBase
27 : : * \ingroup Core_Module
28 : : *
29 : : * \brief Base class for all dense matrices, vectors, and arrays
30 : : *
31 : : * This class is the base that is inherited by all dense objects (matrix, vector, arrays,
32 : : * and related expression types). The common Eigen API for dense objects is contained in this class.
33 : : *
34 : : * \tparam Derived is the derived type, e.g., a matrix type or an expression.
35 : : *
36 : : * This class can be extended with the help of the plugin mechanism described on the page
37 : : * \ref TopicCustomizing_Plugins by defining the preprocessor symbol \c EIGEN_DENSEBASE_PLUGIN.
38 : : *
39 : : * \sa \blank \ref TopicClassHierarchy
40 : : */
41 : : template<typename Derived> class DenseBase
42 : : #ifndef EIGEN_PARSED_BY_DOXYGEN
43 : : : public DenseCoeffsBase<Derived, internal::accessors_level<Derived>::value>
44 : : #else
45 : : : public DenseCoeffsBase<Derived,DirectWriteAccessors>
46 : : #endif // not EIGEN_PARSED_BY_DOXYGEN
47 : : {
48 : : public:
49 : :
50 : : /** Inner iterator type to iterate over the coefficients of a row or column.
51 : : * \sa class InnerIterator
52 : : */
53 : : typedef Eigen::InnerIterator<Derived> InnerIterator;
54 : :
55 : : typedef typename internal::traits<Derived>::StorageKind StorageKind;
56 : :
57 : : /**
58 : : * \brief The type used to store indices
59 : : * \details This typedef is relevant for types that store multiple indices such as
60 : : * PermutationMatrix or Transpositions, otherwise it defaults to Eigen::Index
61 : : * \sa \blank \ref TopicPreprocessorDirectives, Eigen::Index, SparseMatrixBase.
62 : : */
63 : : typedef typename internal::traits<Derived>::StorageIndex StorageIndex;
64 : :
65 : : /** The numeric type of the expression' coefficients, e.g. float, double, int or std::complex<float>, etc. */
66 : : typedef typename internal::traits<Derived>::Scalar Scalar;
67 : :
68 : : /** The numeric type of the expression' coefficients, e.g. float, double, int or std::complex<float>, etc.
69 : : *
70 : : * It is an alias for the Scalar type */
71 : : typedef Scalar value_type;
72 : :
73 : : typedef typename NumTraits<Scalar>::Real RealScalar;
74 : : typedef DenseCoeffsBase<Derived, internal::accessors_level<Derived>::value> Base;
75 : :
76 : : using Base::derived;
77 : : using Base::const_cast_derived;
78 : : using Base::rows;
79 : : using Base::cols;
80 : : using Base::size;
81 : : using Base::rowIndexByOuterInner;
82 : : using Base::colIndexByOuterInner;
83 : : using Base::coeff;
84 : : using Base::coeffByOuterInner;
85 : : using Base::operator();
86 : : using Base::operator[];
87 : : using Base::x;
88 : : using Base::y;
89 : : using Base::z;
90 : : using Base::w;
91 : : using Base::stride;
92 : : using Base::innerStride;
93 : : using Base::outerStride;
94 : : using Base::rowStride;
95 : : using Base::colStride;
96 : : typedef typename Base::CoeffReturnType CoeffReturnType;
97 : :
98 : : enum {
99 : :
100 : : RowsAtCompileTime = internal::traits<Derived>::RowsAtCompileTime,
101 : : /**< The number of rows at compile-time. This is just a copy of the value provided
102 : : * by the \a Derived type. If a value is not known at compile-time,
103 : : * it is set to the \a Dynamic constant.
104 : : * \sa MatrixBase::rows(), MatrixBase::cols(), ColsAtCompileTime, SizeAtCompileTime */
105 : :
106 : : ColsAtCompileTime = internal::traits<Derived>::ColsAtCompileTime,
107 : : /**< The number of columns at compile-time. This is just a copy of the value provided
108 : : * by the \a Derived type. If a value is not known at compile-time,
109 : : * it is set to the \a Dynamic constant.
110 : : * \sa MatrixBase::rows(), MatrixBase::cols(), RowsAtCompileTime, SizeAtCompileTime */
111 : :
112 : :
113 : : SizeAtCompileTime = (internal::size_at_compile_time<internal::traits<Derived>::RowsAtCompileTime,
114 : : internal::traits<Derived>::ColsAtCompileTime>::ret),
115 : : /**< This is equal to the number of coefficients, i.e. the number of
116 : : * rows times the number of columns, or to \a Dynamic if this is not
117 : : * known at compile-time. \sa RowsAtCompileTime, ColsAtCompileTime */
118 : :
119 : : MaxRowsAtCompileTime = internal::traits<Derived>::MaxRowsAtCompileTime,
120 : : /**< This value is equal to the maximum possible number of rows that this expression
121 : : * might have. If this expression might have an arbitrarily high number of rows,
122 : : * this value is set to \a Dynamic.
123 : : *
124 : : * This value is useful to know when evaluating an expression, in order to determine
125 : : * whether it is possible to avoid doing a dynamic memory allocation.
126 : : *
127 : : * \sa RowsAtCompileTime, MaxColsAtCompileTime, MaxSizeAtCompileTime
128 : : */
129 : :
130 : : MaxColsAtCompileTime = internal::traits<Derived>::MaxColsAtCompileTime,
131 : : /**< This value is equal to the maximum possible number of columns that this expression
132 : : * might have. If this expression might have an arbitrarily high number of columns,
133 : : * this value is set to \a Dynamic.
134 : : *
135 : : * This value is useful to know when evaluating an expression, in order to determine
136 : : * whether it is possible to avoid doing a dynamic memory allocation.
137 : : *
138 : : * \sa ColsAtCompileTime, MaxRowsAtCompileTime, MaxSizeAtCompileTime
139 : : */
140 : :
141 : : MaxSizeAtCompileTime = (internal::size_at_compile_time<internal::traits<Derived>::MaxRowsAtCompileTime,
142 : : internal::traits<Derived>::MaxColsAtCompileTime>::ret),
143 : : /**< This value is equal to the maximum possible number of coefficients that this expression
144 : : * might have. If this expression might have an arbitrarily high number of coefficients,
145 : : * this value is set to \a Dynamic.
146 : : *
147 : : * This value is useful to know when evaluating an expression, in order to determine
148 : : * whether it is possible to avoid doing a dynamic memory allocation.
149 : : *
150 : : * \sa SizeAtCompileTime, MaxRowsAtCompileTime, MaxColsAtCompileTime
151 : : */
152 : :
153 : : IsVectorAtCompileTime = internal::traits<Derived>::RowsAtCompileTime == 1
154 : : || internal::traits<Derived>::ColsAtCompileTime == 1,
155 : : /**< This is set to true if either the number of rows or the number of
156 : : * columns is known at compile-time to be equal to 1. Indeed, in that case,
157 : : * we are dealing with a column-vector (if there is only one column) or with
158 : : * a row-vector (if there is only one row). */
159 : :
160 : : NumDimensions = int(MaxSizeAtCompileTime) == 1 ? 0 : bool(IsVectorAtCompileTime) ? 1 : 2,
161 : : /**< This value is equal to Tensor::NumDimensions, i.e. 0 for scalars, 1 for vectors,
162 : : * and 2 for matrices.
163 : : */
164 : :
165 : : Flags = internal::traits<Derived>::Flags,
166 : : /**< This stores expression \ref flags flags which may or may not be inherited by new expressions
167 : : * constructed from this one. See the \ref flags "list of flags".
168 : : */
169 : :
170 : : IsRowMajor = int(Flags) & RowMajorBit, /**< True if this expression has row-major storage order. */
171 : :
172 : : InnerSizeAtCompileTime = int(IsVectorAtCompileTime) ? int(SizeAtCompileTime)
173 : : : int(IsRowMajor) ? int(ColsAtCompileTime) : int(RowsAtCompileTime),
174 : :
175 : : InnerStrideAtCompileTime = internal::inner_stride_at_compile_time<Derived>::ret,
176 : : OuterStrideAtCompileTime = internal::outer_stride_at_compile_time<Derived>::ret
177 : : };
178 : :
179 : : typedef typename internal::find_best_packet<Scalar,SizeAtCompileTime>::type PacketScalar;
180 : :
181 : : enum { IsPlainObjectBase = 0 };
182 : :
183 : : /** The plain matrix type corresponding to this expression.
184 : : * \sa PlainObject */
185 : : typedef Matrix<typename internal::traits<Derived>::Scalar,
186 : : internal::traits<Derived>::RowsAtCompileTime,
187 : : internal::traits<Derived>::ColsAtCompileTime,
188 : : AutoAlign | (internal::traits<Derived>::Flags&RowMajorBit ? RowMajor : ColMajor),
189 : : internal::traits<Derived>::MaxRowsAtCompileTime,
190 : : internal::traits<Derived>::MaxColsAtCompileTime
191 : : > PlainMatrix;
192 : :
193 : : /** The plain array type corresponding to this expression.
194 : : * \sa PlainObject */
195 : : typedef Array<typename internal::traits<Derived>::Scalar,
196 : : internal::traits<Derived>::RowsAtCompileTime,
197 : : internal::traits<Derived>::ColsAtCompileTime,
198 : : AutoAlign | (internal::traits<Derived>::Flags&RowMajorBit ? RowMajor : ColMajor),
199 : : internal::traits<Derived>::MaxRowsAtCompileTime,
200 : : internal::traits<Derived>::MaxColsAtCompileTime
201 : : > PlainArray;
202 : :
203 : : /** \brief The plain matrix or array type corresponding to this expression.
204 : : *
205 : : * This is not necessarily exactly the return type of eval(). In the case of plain matrices,
206 : : * the return type of eval() is a const reference to a matrix, not a matrix! It is however guaranteed
207 : : * that the return type of eval() is either PlainObject or const PlainObject&.
208 : : */
209 : : typedef typename internal::conditional<internal::is_same<typename internal::traits<Derived>::XprKind,MatrixXpr >::value,
210 : : PlainMatrix, PlainArray>::type PlainObject;
211 : :
212 : : /** \returns the number of nonzero coefficients which is in practice the number
213 : : * of stored coefficients. */
214 : : EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
215 : : inline Index nonZeros() const { return size(); }
216 : :
217 : : /** \returns the outer size.
218 : : *
219 : : * \note For a vector, this returns just 1. For a matrix (non-vector), this is the major dimension
220 : : * with respect to the \ref TopicStorageOrders "storage order", i.e., the number of columns for a
221 : : * column-major matrix, and the number of rows for a row-major matrix. */
222 : : EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
223 : 914 : Index outerSize() const
224 : : {
225 : 914 : return IsVectorAtCompileTime ? 1
226 : 914 : : int(IsRowMajor) ? this->rows() : this->cols();
227 : : }
228 : :
229 : : /** \returns the inner size.
230 : : *
231 : : * \note For a vector, this is just the size. For a matrix (non-vector), this is the minor dimension
232 : : * with respect to the \ref TopicStorageOrders "storage order", i.e., the number of rows for a
233 : : * column-major matrix, and the number of columns for a row-major matrix. */
234 : : EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
235 : 21971 : Index innerSize() const
236 : : {
237 : 21971 : return IsVectorAtCompileTime ? this->size()
238 : 21971 : : int(IsRowMajor) ? this->cols() : this->rows();
239 : : }
240 : :
241 : : /** Only plain matrices/arrays, not expressions, may be resized; therefore the only useful resize methods are
242 : : * Matrix::resize() and Array::resize(). The present method only asserts that the new size equals the old size, and does
243 : : * nothing else.
244 : : */
245 : : EIGEN_DEVICE_FUNC
246 : : void resize(Index newSize)
247 : : {
248 : : EIGEN_ONLY_USED_FOR_DEBUG(newSize);
249 : : eigen_assert(newSize == this->size()
250 : : && "DenseBase::resize() does not actually allow to resize.");
251 : : }
252 : : /** Only plain matrices/arrays, not expressions, may be resized; therefore the only useful resize methods are
253 : : * Matrix::resize() and Array::resize(). The present method only asserts that the new size equals the old size, and does
254 : : * nothing else.
255 : : */
256 : : EIGEN_DEVICE_FUNC
257 : 0 : void resize(Index rows, Index cols)
258 : : {
259 : : EIGEN_ONLY_USED_FOR_DEBUG(rows);
260 : : EIGEN_ONLY_USED_FOR_DEBUG(cols);
261 : 0 : eigen_assert(rows == this->rows() && cols == this->cols()
262 : : && "DenseBase::resize() does not actually allow to resize.");
263 : 0 : }
264 : :
265 : : #ifndef EIGEN_PARSED_BY_DOXYGEN
266 : : /** \internal Represents a matrix with all coefficients equal to one another*/
267 : : typedef CwiseNullaryOp<internal::scalar_constant_op<Scalar>,PlainObject> ConstantReturnType;
268 : : /** \internal \deprecated Represents a vector with linearly spaced coefficients that allows sequential access only. */
269 : : EIGEN_DEPRECATED typedef CwiseNullaryOp<internal::linspaced_op<Scalar>,PlainObject> SequentialLinSpacedReturnType;
270 : : /** \internal Represents a vector with linearly spaced coefficients that allows random access. */
271 : : typedef CwiseNullaryOp<internal::linspaced_op<Scalar>,PlainObject> RandomAccessLinSpacedReturnType;
272 : : /** \internal the return type of MatrixBase::eigenvalues() */
273 : : typedef Matrix<typename NumTraits<typename internal::traits<Derived>::Scalar>::Real, internal::traits<Derived>::ColsAtCompileTime, 1> EigenvaluesReturnType;
274 : :
275 : : #endif // not EIGEN_PARSED_BY_DOXYGEN
276 : :
277 : : /** Copies \a other into *this. \returns a reference to *this. */
278 : : template<typename OtherDerived>
279 : : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
280 : : Derived& operator=(const DenseBase<OtherDerived>& other);
281 : :
282 : : /** Special case of the template operator=, in order to prevent the compiler
283 : : * from generating a default operator= (issue hit with g++ 4.1)
284 : : */
285 : : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
286 : : Derived& operator=(const DenseBase& other);
287 : :
288 : : template<typename OtherDerived>
289 : : EIGEN_DEVICE_FUNC
290 : : Derived& operator=(const EigenBase<OtherDerived> &other);
291 : :
292 : : template<typename OtherDerived>
293 : : EIGEN_DEVICE_FUNC
294 : : Derived& operator+=(const EigenBase<OtherDerived> &other);
295 : :
296 : : template<typename OtherDerived>
297 : : EIGEN_DEVICE_FUNC
298 : : Derived& operator-=(const EigenBase<OtherDerived> &other);
299 : :
300 : : template<typename OtherDerived>
301 : : EIGEN_DEVICE_FUNC
302 : : Derived& operator=(const ReturnByValue<OtherDerived>& func);
303 : :
304 : : /** \internal
305 : : * Copies \a other into *this without evaluating other. \returns a reference to *this. */
306 : : template<typename OtherDerived>
307 : : /** \deprecated */
308 : : EIGEN_DEPRECATED EIGEN_DEVICE_FUNC
309 : : Derived& lazyAssign(const DenseBase<OtherDerived>& other);
310 : :
311 : : EIGEN_DEVICE_FUNC
312 : : CommaInitializer<Derived> operator<< (const Scalar& s);
313 : :
314 : : template<unsigned int Added,unsigned int Removed>
315 : : /** \deprecated it now returns \c *this */
316 : : EIGEN_DEPRECATED
317 : : const Derived& flagged() const
318 : : { return derived(); }
319 : :
320 : : template<typename OtherDerived>
321 : : EIGEN_DEVICE_FUNC
322 : : CommaInitializer<Derived> operator<< (const DenseBase<OtherDerived>& other);
323 : :
324 : : typedef Transpose<Derived> TransposeReturnType;
325 : : EIGEN_DEVICE_FUNC
326 : : TransposeReturnType transpose();
327 : : typedef typename internal::add_const<Transpose<const Derived> >::type ConstTransposeReturnType;
328 : : EIGEN_DEVICE_FUNC
329 : : ConstTransposeReturnType transpose() const;
330 : : EIGEN_DEVICE_FUNC
331 : : void transposeInPlace();
332 : :
333 : : EIGEN_DEVICE_FUNC static const ConstantReturnType
334 : : Constant(Index rows, Index cols, const Scalar& value);
335 : : EIGEN_DEVICE_FUNC static const ConstantReturnType
336 : : Constant(Index size, const Scalar& value);
337 : : EIGEN_DEVICE_FUNC static const ConstantReturnType
338 : : Constant(const Scalar& value);
339 : :
340 : : EIGEN_DEPRECATED EIGEN_DEVICE_FUNC static const RandomAccessLinSpacedReturnType
341 : : LinSpaced(Sequential_t, Index size, const Scalar& low, const Scalar& high);
342 : : EIGEN_DEPRECATED EIGEN_DEVICE_FUNC static const RandomAccessLinSpacedReturnType
343 : : LinSpaced(Sequential_t, const Scalar& low, const Scalar& high);
344 : :
345 : : EIGEN_DEVICE_FUNC static const RandomAccessLinSpacedReturnType
346 : : LinSpaced(Index size, const Scalar& low, const Scalar& high);
347 : : EIGEN_DEVICE_FUNC static const RandomAccessLinSpacedReturnType
348 : : LinSpaced(const Scalar& low, const Scalar& high);
349 : :
350 : : template<typename CustomNullaryOp> EIGEN_DEVICE_FUNC
351 : : static const CwiseNullaryOp<CustomNullaryOp, PlainObject>
352 : : NullaryExpr(Index rows, Index cols, const CustomNullaryOp& func);
353 : : template<typename CustomNullaryOp> EIGEN_DEVICE_FUNC
354 : : static const CwiseNullaryOp<CustomNullaryOp, PlainObject>
355 : : NullaryExpr(Index size, const CustomNullaryOp& func);
356 : : template<typename CustomNullaryOp> EIGEN_DEVICE_FUNC
357 : : static const CwiseNullaryOp<CustomNullaryOp, PlainObject>
358 : : NullaryExpr(const CustomNullaryOp& func);
359 : :
360 : : EIGEN_DEVICE_FUNC static const ConstantReturnType Zero(Index rows, Index cols);
361 : : EIGEN_DEVICE_FUNC static const ConstantReturnType Zero(Index size);
362 : : EIGEN_DEVICE_FUNC static const ConstantReturnType Zero();
363 : : EIGEN_DEVICE_FUNC static const ConstantReturnType Ones(Index rows, Index cols);
364 : : EIGEN_DEVICE_FUNC static const ConstantReturnType Ones(Index size);
365 : : EIGEN_DEVICE_FUNC static const ConstantReturnType Ones();
366 : :
367 : : EIGEN_DEVICE_FUNC void fill(const Scalar& value);
368 : : EIGEN_DEVICE_FUNC Derived& setConstant(const Scalar& value);
369 : : EIGEN_DEVICE_FUNC Derived& setLinSpaced(Index size, const Scalar& low, const Scalar& high);
370 : : EIGEN_DEVICE_FUNC Derived& setLinSpaced(const Scalar& low, const Scalar& high);
371 : : EIGEN_DEVICE_FUNC Derived& setZero();
372 : : EIGEN_DEVICE_FUNC Derived& setOnes();
373 : : EIGEN_DEVICE_FUNC Derived& setRandom();
374 : :
375 : : template<typename OtherDerived> EIGEN_DEVICE_FUNC
376 : : bool isApprox(const DenseBase<OtherDerived>& other,
377 : : const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
378 : : EIGEN_DEVICE_FUNC
379 : : bool isMuchSmallerThan(const RealScalar& other,
380 : : const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
381 : : template<typename OtherDerived> EIGEN_DEVICE_FUNC
382 : : bool isMuchSmallerThan(const DenseBase<OtherDerived>& other,
383 : : const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
384 : :
385 : : EIGEN_DEVICE_FUNC bool isApproxToConstant(const Scalar& value, const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
386 : : EIGEN_DEVICE_FUNC bool isConstant(const Scalar& value, const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
387 : : EIGEN_DEVICE_FUNC bool isZero(const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
388 : : EIGEN_DEVICE_FUNC bool isOnes(const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
389 : :
390 : : inline bool hasNaN() const;
391 : : inline bool allFinite() const;
392 : :
393 : : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
394 : : Derived& operator*=(const Scalar& other);
395 : : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
396 : : Derived& operator/=(const Scalar& other);
397 : :
398 : : typedef typename internal::add_const_on_value_type<typename internal::eval<Derived>::type>::type EvalReturnType;
399 : : /** \returns the matrix or vector obtained by evaluating this expression.
400 : : *
401 : : * Notice that in the case of a plain matrix or vector (not an expression) this function just returns
402 : : * a const reference, in order to avoid a useless copy.
403 : : *
404 : : * \warning Be careful with eval() and the auto C++ keyword, as detailed in this \link TopicPitfalls_auto_keyword page \endlink.
405 : : */
406 : : EIGEN_DEVICE_FUNC
407 : : EIGEN_STRONG_INLINE EvalReturnType eval() const
408 : : {
409 : : // Even though MSVC does not honor strong inlining when the return type
410 : : // is a dynamic matrix, we desperately need strong inlining for fixed
411 : : // size types on MSVC.
412 : : return typename internal::eval<Derived>::type(derived());
413 : : }
414 : :
415 : : /** swaps *this with the expression \a other.
416 : : *
417 : : */
418 : : template<typename OtherDerived>
419 : : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
420 : : void swap(const DenseBase<OtherDerived>& other)
421 : : {
422 : : EIGEN_STATIC_ASSERT(!OtherDerived::IsPlainObjectBase,THIS_EXPRESSION_IS_NOT_A_LVALUE__IT_IS_READ_ONLY);
423 : : eigen_assert(rows()==other.rows() && cols()==other.cols());
424 : : call_assignment(derived(), other.const_cast_derived(), internal::swap_assign_op<Scalar>());
425 : : }
426 : :
427 : : /** swaps *this with the matrix or array \a other.
428 : : *
429 : : */
430 : : template<typename OtherDerived>
431 : : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
432 : : void swap(PlainObjectBase<OtherDerived>& other)
433 : : {
434 : : eigen_assert(rows()==other.rows() && cols()==other.cols());
435 : : call_assignment(derived(), other.derived(), internal::swap_assign_op<Scalar>());
436 : : }
437 : :
438 : : EIGEN_DEVICE_FUNC inline const NestByValue<Derived> nestByValue() const;
439 : : EIGEN_DEVICE_FUNC inline const ForceAlignedAccess<Derived> forceAlignedAccess() const;
440 : : EIGEN_DEVICE_FUNC inline ForceAlignedAccess<Derived> forceAlignedAccess();
441 : : template<bool Enable> EIGEN_DEVICE_FUNC
442 : : inline const typename internal::conditional<Enable,ForceAlignedAccess<Derived>,Derived&>::type forceAlignedAccessIf() const;
443 : : template<bool Enable> EIGEN_DEVICE_FUNC
444 : : inline typename internal::conditional<Enable,ForceAlignedAccess<Derived>,Derived&>::type forceAlignedAccessIf();
445 : :
446 : : EIGEN_DEVICE_FUNC Scalar sum() const;
447 : : EIGEN_DEVICE_FUNC Scalar mean() const;
448 : : EIGEN_DEVICE_FUNC Scalar trace() const;
449 : :
450 : : EIGEN_DEVICE_FUNC Scalar prod() const;
451 : :
452 : : template<int NaNPropagation>
453 : : EIGEN_DEVICE_FUNC typename internal::traits<Derived>::Scalar minCoeff() const;
454 : : template<int NaNPropagation>
455 : : EIGEN_DEVICE_FUNC typename internal::traits<Derived>::Scalar maxCoeff() const;
456 : :
457 : :
458 : : // By default, the fastest version with undefined NaN propagation semantics is
459 : : // used.
460 : : // TODO(rmlarsen): Replace with default template argument when we move to
461 : : // c++11 or beyond.
462 : : EIGEN_DEVICE_FUNC inline typename internal::traits<Derived>::Scalar minCoeff() const {
463 : : return minCoeff<PropagateFast>();
464 : : }
465 : : EIGEN_DEVICE_FUNC inline typename internal::traits<Derived>::Scalar maxCoeff() const {
466 : : return maxCoeff<PropagateFast>();
467 : : }
468 : :
469 : : template<int NaNPropagation, typename IndexType>
470 : : EIGEN_DEVICE_FUNC
471 : : typename internal::traits<Derived>::Scalar minCoeff(IndexType* row, IndexType* col) const;
472 : : template<int NaNPropagation, typename IndexType>
473 : : EIGEN_DEVICE_FUNC
474 : : typename internal::traits<Derived>::Scalar maxCoeff(IndexType* row, IndexType* col) const;
475 : : template<int NaNPropagation, typename IndexType>
476 : : EIGEN_DEVICE_FUNC
477 : : typename internal::traits<Derived>::Scalar minCoeff(IndexType* index) const;
478 : : template<int NaNPropagation, typename IndexType>
479 : : EIGEN_DEVICE_FUNC
480 : : typename internal::traits<Derived>::Scalar maxCoeff(IndexType* index) const;
481 : :
482 : : // TODO(rmlarsen): Replace these methods with a default template argument.
483 : : template<typename IndexType>
484 : : EIGEN_DEVICE_FUNC inline
485 : : typename internal::traits<Derived>::Scalar minCoeff(IndexType* row, IndexType* col) const {
486 : : return minCoeff<PropagateFast>(row, col);
487 : : }
488 : : template<typename IndexType>
489 : : EIGEN_DEVICE_FUNC inline
490 : : typename internal::traits<Derived>::Scalar maxCoeff(IndexType* row, IndexType* col) const {
491 : : return maxCoeff<PropagateFast>(row, col);
492 : : }
493 : : template<typename IndexType>
494 : : EIGEN_DEVICE_FUNC inline
495 : : typename internal::traits<Derived>::Scalar minCoeff(IndexType* index) const {
496 : : return minCoeff<PropagateFast>(index);
497 : : }
498 : : template<typename IndexType>
499 : : EIGEN_DEVICE_FUNC inline
500 : : typename internal::traits<Derived>::Scalar maxCoeff(IndexType* index) const {
501 : : return maxCoeff<PropagateFast>(index);
502 : : }
503 : :
504 : : template<typename BinaryOp>
505 : : EIGEN_DEVICE_FUNC
506 : : Scalar redux(const BinaryOp& func) const;
507 : :
508 : : template<typename Visitor>
509 : : EIGEN_DEVICE_FUNC
510 : : void visit(Visitor& func) const;
511 : :
512 : : /** \returns a WithFormat proxy object allowing to print a matrix the with given
513 : : * format \a fmt.
514 : : *
515 : : * See class IOFormat for some examples.
516 : : *
517 : : * \sa class IOFormat, class WithFormat
518 : : */
519 : : inline const WithFormat<Derived> format(const IOFormat& fmt) const
520 : : {
521 : : return WithFormat<Derived>(derived(), fmt);
522 : : }
523 : :
524 : : /** \returns the unique coefficient of a 1x1 expression */
525 : : EIGEN_DEVICE_FUNC
526 : : CoeffReturnType value() const
527 : : {
528 : : EIGEN_STATIC_ASSERT_SIZE_1x1(Derived)
529 : : eigen_assert(this->rows() == 1 && this->cols() == 1);
530 : : return derived().coeff(0,0);
531 : : }
532 : :
533 : : EIGEN_DEVICE_FUNC bool all() const;
534 : : EIGEN_DEVICE_FUNC bool any() const;
535 : : EIGEN_DEVICE_FUNC Index count() const;
536 : :
537 : : typedef VectorwiseOp<Derived, Horizontal> RowwiseReturnType;
538 : : typedef const VectorwiseOp<const Derived, Horizontal> ConstRowwiseReturnType;
539 : : typedef VectorwiseOp<Derived, Vertical> ColwiseReturnType;
540 : : typedef const VectorwiseOp<const Derived, Vertical> ConstColwiseReturnType;
541 : :
542 : : /** \returns a VectorwiseOp wrapper of *this for broadcasting and partial reductions
543 : : *
544 : : * Example: \include MatrixBase_rowwise.cpp
545 : : * Output: \verbinclude MatrixBase_rowwise.out
546 : : *
547 : : * \sa colwise(), class VectorwiseOp, \ref TutorialReductionsVisitorsBroadcasting
548 : : */
549 : : //Code moved here due to a CUDA compiler bug
550 : : EIGEN_DEVICE_FUNC inline ConstRowwiseReturnType rowwise() const {
551 : : return ConstRowwiseReturnType(derived());
552 : : }
553 : : EIGEN_DEVICE_FUNC RowwiseReturnType rowwise();
554 : :
555 : : /** \returns a VectorwiseOp wrapper of *this broadcasting and partial reductions
556 : : *
557 : : * Example: \include MatrixBase_colwise.cpp
558 : : * Output: \verbinclude MatrixBase_colwise.out
559 : : *
560 : : * \sa rowwise(), class VectorwiseOp, \ref TutorialReductionsVisitorsBroadcasting
561 : : */
562 : : EIGEN_DEVICE_FUNC inline ConstColwiseReturnType colwise() const {
563 : : return ConstColwiseReturnType(derived());
564 : : }
565 : : EIGEN_DEVICE_FUNC ColwiseReturnType colwise();
566 : :
567 : : typedef CwiseNullaryOp<internal::scalar_random_op<Scalar>,PlainObject> RandomReturnType;
568 : : static const RandomReturnType Random(Index rows, Index cols);
569 : : static const RandomReturnType Random(Index size);
570 : : static const RandomReturnType Random();
571 : :
572 : : template<typename ThenDerived,typename ElseDerived>
573 : : inline EIGEN_DEVICE_FUNC const Select<Derived,ThenDerived,ElseDerived>
574 : : select(const DenseBase<ThenDerived>& thenMatrix,
575 : : const DenseBase<ElseDerived>& elseMatrix) const;
576 : :
577 : : template<typename ThenDerived>
578 : : inline EIGEN_DEVICE_FUNC const Select<Derived,ThenDerived, typename ThenDerived::ConstantReturnType>
579 : : select(const DenseBase<ThenDerived>& thenMatrix, const typename ThenDerived::Scalar& elseScalar) const;
580 : :
581 : : template<typename ElseDerived>
582 : : inline EIGEN_DEVICE_FUNC const Select<Derived, typename ElseDerived::ConstantReturnType, ElseDerived >
583 : : select(const typename ElseDerived::Scalar& thenScalar, const DenseBase<ElseDerived>& elseMatrix) const;
584 : :
585 : : template<int p> RealScalar lpNorm() const;
586 : :
587 : : template<int RowFactor, int ColFactor>
588 : : EIGEN_DEVICE_FUNC
589 : : const Replicate<Derived,RowFactor,ColFactor> replicate() const;
590 : : /**
591 : : * \return an expression of the replication of \c *this
592 : : *
593 : : * Example: \include MatrixBase_replicate_int_int.cpp
594 : : * Output: \verbinclude MatrixBase_replicate_int_int.out
595 : : *
596 : : * \sa VectorwiseOp::replicate(), DenseBase::replicate<int,int>(), class Replicate
597 : : */
598 : : //Code moved here due to a CUDA compiler bug
599 : : EIGEN_DEVICE_FUNC
600 : : const Replicate<Derived, Dynamic, Dynamic> replicate(Index rowFactor, Index colFactor) const
601 : : {
602 : : return Replicate<Derived, Dynamic, Dynamic>(derived(), rowFactor, colFactor);
603 : : }
604 : :
605 : : typedef Reverse<Derived, BothDirections> ReverseReturnType;
606 : : typedef const Reverse<const Derived, BothDirections> ConstReverseReturnType;
607 : : EIGEN_DEVICE_FUNC ReverseReturnType reverse();
608 : : /** This is the const version of reverse(). */
609 : : //Code moved here due to a CUDA compiler bug
610 : : EIGEN_DEVICE_FUNC ConstReverseReturnType reverse() const
611 : : {
612 : : return ConstReverseReturnType(derived());
613 : : }
614 : : EIGEN_DEVICE_FUNC void reverseInPlace();
615 : :
616 : : #ifdef EIGEN_PARSED_BY_DOXYGEN
617 : : /** STL-like <a href="https://en.cppreference.com/w/cpp/named_req/RandomAccessIterator">RandomAccessIterator</a>
618 : : * iterator type as returned by the begin() and end() methods.
619 : : */
620 : : typedef random_access_iterator_type iterator;
621 : : /** This is the const version of iterator (aka read-only) */
622 : : typedef random_access_iterator_type const_iterator;
623 : : #else
624 : : typedef typename internal::conditional< (Flags&DirectAccessBit)==DirectAccessBit,
625 : : internal::pointer_based_stl_iterator<Derived>,
626 : : internal::generic_randaccess_stl_iterator<Derived>
627 : : >::type iterator_type;
628 : :
629 : : typedef typename internal::conditional< (Flags&DirectAccessBit)==DirectAccessBit,
630 : : internal::pointer_based_stl_iterator<const Derived>,
631 : : internal::generic_randaccess_stl_iterator<const Derived>
632 : : >::type const_iterator_type;
633 : :
634 : : // Stl-style iterators are supported only for vectors.
635 : :
636 : : typedef typename internal::conditional< IsVectorAtCompileTime,
637 : : iterator_type,
638 : : void
639 : : >::type iterator;
640 : :
641 : : typedef typename internal::conditional< IsVectorAtCompileTime,
642 : : const_iterator_type,
643 : : void
644 : : >::type const_iterator;
645 : : #endif
646 : :
647 : : inline iterator begin();
648 : : inline const_iterator begin() const;
649 : : inline const_iterator cbegin() const;
650 : : inline iterator end();
651 : : inline const_iterator end() const;
652 : : inline const_iterator cend() const;
653 : :
654 : : #define EIGEN_CURRENT_STORAGE_BASE_CLASS Eigen::DenseBase
655 : : #define EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
656 : : #define EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(COND)
657 : : #define EIGEN_DOC_UNARY_ADDONS(X,Y)
658 : : # include "../plugins/CommonCwiseUnaryOps.h"
659 : : # include "../plugins/BlockMethods.h"
660 : : # include "../plugins/IndexedViewMethods.h"
661 : : # include "../plugins/ReshapedMethods.h"
662 : : # ifdef EIGEN_DENSEBASE_PLUGIN
663 : : # include EIGEN_DENSEBASE_PLUGIN
664 : : # endif
665 : : #undef EIGEN_CURRENT_STORAGE_BASE_CLASS
666 : : #undef EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
667 : : #undef EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF
668 : : #undef EIGEN_DOC_UNARY_ADDONS
669 : :
670 : : // disable the use of evalTo for dense objects with a nice compilation error
671 : : template<typename Dest>
672 : : EIGEN_DEVICE_FUNC
673 : : inline void evalTo(Dest& ) const
674 : : {
675 : : EIGEN_STATIC_ASSERT((internal::is_same<Dest,void>::value),THE_EVAL_EVALTO_FUNCTION_SHOULD_NEVER_BE_CALLED_FOR_DENSE_OBJECTS);
676 : : }
677 : :
678 : : protected:
679 : : EIGEN_DEFAULT_COPY_CONSTRUCTOR(DenseBase)
680 : : /** Default constructor. Do nothing. */
681 : 352363 : EIGEN_DEVICE_FUNC DenseBase()
682 : : {
683 : : /* Just checks for self-consistency of the flags.
684 : : * Only do it when debugging Eigen, as this borders on paranoia and could slow compilation down
685 : : */
686 : : #ifdef EIGEN_INTERNAL_DEBUGGING
687 : : EIGEN_STATIC_ASSERT((EIGEN_IMPLIES(MaxRowsAtCompileTime==1 && MaxColsAtCompileTime!=1, int(IsRowMajor))
688 : : && EIGEN_IMPLIES(MaxColsAtCompileTime==1 && MaxRowsAtCompileTime!=1, int(!IsRowMajor))),
689 : : INVALID_STORAGE_ORDER_FOR_THIS_VECTOR_EXPRESSION)
690 : : #endif
691 : 352363 : }
692 : :
693 : : private:
694 : : EIGEN_DEVICE_FUNC explicit DenseBase(int);
695 : : EIGEN_DEVICE_FUNC DenseBase(int,int);
696 : : template<typename OtherDerived> EIGEN_DEVICE_FUNC explicit DenseBase(const DenseBase<OtherDerived>&);
697 : : };
698 : :
699 : : } // end namespace Eigen
700 : :
701 : : #endif // EIGEN_DENSEBASE_H
|