10#ifndef EIGEN_CWISE_NULLARY_OP_H
11#define EIGEN_CWISE_NULLARY_OP_H
14#include "./InternalHeaderCheck.h"
19template <
typename NullaryOp,
typename PlainObjectType>
20struct traits<CwiseNullaryOp<NullaryOp, PlainObjectType> > : traits<PlainObjectType> {
21 enum { Flags = traits<PlainObjectType>::Flags &
RowMajorBit };
62template <
typename NullaryOp,
typename PlainObjectType>
63class CwiseNullaryOp :
public internal::dense_xpr_base<CwiseNullaryOp<NullaryOp, PlainObjectType> >::type,
64 internal::no_assignment_operator {
66 typedef typename internal::dense_xpr_base<CwiseNullaryOp>::type Base;
70 : m_rows(rows), m_cols(cols), m_functor(func) {
71 eigen_assert(rows >= 0 && (RowsAtCompileTime ==
Dynamic || RowsAtCompileTime == rows) && cols >= 0 &&
72 (ColsAtCompileTime ==
Dynamic || ColsAtCompileTime == cols));
75 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR
Index rows()
const {
return m_rows.value(); }
76 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR
Index cols()
const {
return m_cols.value(); }
79 EIGEN_DEVICE_FUNC
const NullaryOp&
functor()
const {
return m_functor; }
82 const internal::variable_if_dynamic<Index, RowsAtCompileTime> m_rows;
83 const internal::variable_if_dynamic<Index, ColsAtCompileTime> m_cols;
84 const NullaryOp m_functor;
100template <
typename Derived>
101template <
typename CustomNullaryOp>
102EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
103#ifndef EIGEN_PARSED_BY_DOXYGEN
104 const CwiseNullaryOp<CustomNullaryOp, typename DenseBase<Derived>::PlainObject>
106 const CwiseNullaryOp<CustomNullaryOp, PlainObject>
130template <
typename Derived>
131template <
typename CustomNullaryOp>
132EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
133#ifndef EIGEN_PARSED_BY_DOXYGEN
139 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
140 if (RowsAtCompileTime == 1)
155template <
typename Derived>
156template <
typename CustomNullaryOp>
157EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
158#ifndef EIGEN_PARSED_BY_DOXYGEN
180template <
typename Derived>
201template <
typename Derived>
216template <
typename Derived>
219 EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived)
221 internal::scalar_constant_op<Scalar>(value));
233template <
typename Derived>
234EIGEN_DEPRECATED EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const typename DenseBase<
235 Derived>::RandomAccessLinSpacedReturnType
237 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
245template <
typename Derived>
246EIGEN_DEPRECATED EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const typename DenseBase<
247 Derived>::RandomAccessLinSpacedReturnType
249 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
250 EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived)
251 return
DenseBase<Derived>::NullaryExpr(Derived::SizeAtCompileTime,
252 internal::linspaced_op<
Scalar>(low, high, Derived::SizeAtCompileTime));
278template <typename Derived>
279EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename
DenseBase<Derived>::RandomAccessLinSpacedReturnType
281 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
289template <
typename Derived>
292 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
293 EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived)
295 internal::linspaced_op<Scalar>(low, high, Derived::SizeAtCompileTime));
298template <
typename Derived>
301 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
305template <
typename Derived>
308 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
313template <
typename Derived>
315 typename internal::nested_eval<Derived, 1>::type self(derived());
317 for (
Index i = 0; i < rows(); ++i)
318 if (!internal::isApprox(self.coeff(i, j), val, prec))
return false;
325template <
typename Derived>
327 return isApproxToConstant(val, prec);
334template <
typename Derived>
344template <
typename Derived>
346 return derived() = Constant(rows(), cols(), val);
359template <
typename Derived>
362 return setConstant(val);
377template <
typename Derived>
381 return setConstant(val);
391template <
typename Derived>
394 return setConstant(rows(), cols, val);
404template <
typename Derived>
407 return setConstant(rows, cols(), val);
426template <
typename Derived>
429 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
430 return derived() = Derived::NullaryExpr(newSize, internal::linspaced_op<Scalar>(low, high, newSize));
446template <
typename Derived>
448 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
449 return setLinSpaced(size(), low, high);
452template <
typename Derived>
454 const Scalar& step) {
455 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
456 return derived() = Derived::NullaryExpr(newSize, internal::equalspaced_op<Scalar>(low, step));
458template <
typename Derived>
459EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::setEqualSpaced(
const Scalar& low,
460 const Scalar& step) {
461 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
462 return setEqualSpaced(size(), low, step);
481template <
typename Derived>
484 return Constant(rows, cols,
Scalar(0));
503template <
typename Derived>
506 return Constant(size,
Scalar(0));
519template <
typename Derived>
521 return Constant(
Scalar(0));
532template <
typename Derived>
534 typename internal::nested_eval<Derived, 1>::type self(derived());
535 for (
Index j = 0; j < cols(); ++j)
536 for (
Index i = 0; i < rows(); ++i)
537 if (!internal::isMuchSmallerThan(self.coeff(i, j),
static_cast<Scalar>(1), prec))
return false;
548template <
typename Derived>
550 return setConstant(
Scalar(0));
562template <
typename Derived>
565 return setConstant(Scalar(0));
578template <
typename Derived>
581 return setConstant(Scalar(0));
591template <
typename Derived>
593 return setZero(rows(), cols);
603template <
typename Derived>
605 return setZero(rows, cols());
624template <
typename Derived>
627 return Constant(rows, cols,
Scalar(1));
646template <
typename Derived>
649 return Constant(newSize,
Scalar(1));
662template <
typename Derived>
664 return Constant(
Scalar(1));
675template <
typename Derived>
677 return isApproxToConstant(
Scalar(1), prec);
687template <
typename Derived>
689 return setConstant(
Scalar(1));
701template <
typename Derived>
704 return setConstant(Scalar(1));
717template <
typename Derived>
720 return setConstant(Scalar(1));
730template <
typename Derived>
732 return setOnes(rows, cols());
742template <
typename Derived>
744 return setOnes(rows(), cols);
763template <
typename Derived>
779template <
typename Derived>
782 EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived)
795template <
typename Derived>
797 typename internal::nested_eval<Derived, 1>::type self(derived());
798 for (
Index j = 0; j < cols(); ++j) {
799 for (
Index i = 0; i < rows(); ++i) {
801 if (!internal::isApprox(self.coeff(i, j),
static_cast<Scalar>(1), prec))
return false;
803 if (!internal::isMuchSmallerThan(self.coeff(i, j),
static_cast<RealScalar
>(1), prec))
return false;
812template <
typename Derived,
bool Big = (Derived::SizeAtCompileTime >= 16)>
813struct setIdentity_impl {
814 EIGEN_DEVICE_FUNC
static EIGEN_STRONG_INLINE Derived& run(Derived& m) {
815 return m = Derived::Identity(m.rows(), m.cols());
819template <
typename Derived>
820struct setIdentity_impl<Derived, true> {
821 EIGEN_DEVICE_FUNC
static EIGEN_STRONG_INLINE Derived& run(Derived& m) {
823 const Index size = numext::mini(m.rows(), m.cols());
824 for (Index i = 0; i < size; ++i) m.coeffRef(i, i) =
typename Derived::Scalar(1);
838template <
typename Derived>
840 return internal::setIdentity_impl<Derived>::run(derived());
853template <
typename Derived>
855 derived().
resize(rows, cols);
856 return setIdentity();
865template <
typename Derived>
868 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
869 return BasisReturnType(SquareMatrixType::Identity(newSize, newSize), i);
880template <
typename Derived>
883 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
884 return BasisReturnType(SquareMatrixType::Identity(), i);
894template <
typename Derived>
896 return Derived::Unit(0);
906template <
typename Derived>
908 return Derived::Unit(1);
918template <
typename Derived>
920 return Derived::Unit(2);
930template <
typename Derived>
932 return Derived::Unit(3);
943template <
typename Derived>
945 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
946 eigen_assert(i < size());
948 derived().coeffRef(i) =
Scalar(1);
961template <
typename Derived>
963 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
964 eigen_assert(i < newSize);
965 derived().resize(newSize);
Generic expression of a matrix where all coefficients are defined by a functor.
Definition CwiseNullaryOp.h:64
const NullaryOp & functor() const
Definition CwiseNullaryOp.h:79
Base class for all dense matrices, vectors, and arrays.
Definition DenseBase.h:44
void resize(Index newSize)
Definition DenseBase.h:228
internal::traits< Derived >::Scalar Scalar
Definition DenseBase.h:62
Base class for all dense matrices, vectors, and expressions.
Definition MatrixBase.h:52
Dense storage base class for matrices and arrays.
Definition PlainObjectBase.h:121
const unsigned int RowMajorBit
Definition Constants.h:70
Namespace containing all symbols from the Eigen library.
Definition Core:137
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition Meta.h:83
const int Dynamic
Definition Constants.h:25