10 #ifndef EIGEN_CWISE_NULLARY_OP_H
11 #define EIGEN_CWISE_NULLARY_OP_H
34 template<
typename NullaryOp,
typename PlainObjectType>
35 struct traits<CwiseNullaryOp<NullaryOp, PlainObjectType> > : traits<PlainObjectType>
38 Flags = (traits<PlainObjectType>::Flags
43 CoeffReadCost = functor_traits<NullaryOp>::Cost
48 template<
typename NullaryOp,
typename PlainObjectType>
50 public internal::dense_xpr_base< CwiseNullaryOp<NullaryOp, PlainObjectType> >::type
54 typedef typename internal::dense_xpr_base<CwiseNullaryOp>::type Base;
57 CwiseNullaryOp(Index rows, Index cols,
const NullaryOp& func = NullaryOp())
58 : m_rows(rows), m_cols(cols), m_functor(func)
60 eigen_assert(rows >= 0
61 && (RowsAtCompileTime ==
Dynamic || RowsAtCompileTime == rows)
63 && (ColsAtCompileTime ==
Dynamic || ColsAtCompileTime == cols));
66 EIGEN_STRONG_INLINE Index rows()
const {
return m_rows.value(); }
67 EIGEN_STRONG_INLINE Index cols()
const {
return m_cols.value(); }
69 EIGEN_STRONG_INLINE
const Scalar coeff(Index rows, Index cols)
const
71 return m_functor(rows, cols);
74 template<
int LoadMode>
75 EIGEN_STRONG_INLINE PacketScalar packet(Index row, Index col)
const
77 return m_functor.packetOp(row, col);
80 EIGEN_STRONG_INLINE
const Scalar coeff(Index index)
const
82 return m_functor(index);
85 template<
int LoadMode>
86 EIGEN_STRONG_INLINE PacketScalar packet(Index index)
const
88 return m_functor.packetOp(index);
92 const NullaryOp&
functor()
const {
return m_functor; }
95 const internal::variable_if_dynamic<Index, RowsAtCompileTime> m_rows;
96 const internal::variable_if_dynamic<Index, ColsAtCompileTime> m_cols;
97 const NullaryOp m_functor;
114 template<
typename Derived>
115 template<
typename CustomNullaryOp>
116 EIGEN_STRONG_INLINE
const CwiseNullaryOp<CustomNullaryOp, Derived>
137 template<
typename Derived>
138 template<
typename CustomNullaryOp>
142 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
156 template<
typename Derived>
157 template<
typename CustomNullaryOp>
177 template<
typename Derived>
199 template<
typename Derived>
215 template<
typename Derived>
219 EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived)
240 template<
typename Derived>
244 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
252 template<
typename Derived>
256 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
257 EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived)
274 template<
typename Derived>
278 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
286 template<
typename Derived>
290 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
291 EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived)
296 template<
typename Derived>
298 (
const Scalar& value, RealScalar prec)
const
300 for(
Index j = 0; j < cols(); ++j)
301 for(
Index i = 0; i < rows(); ++i)
302 if(!internal::isApprox(this->coeff(i, j), value, prec))
310 template<
typename Derived>
312 (
const Scalar& value, RealScalar prec)
const
314 return isApproxToConstant(value, prec);
321 template<
typename Derived>
331 template<
typename Derived>
334 return derived() = Constant(rows(), cols(), value);
346 template<
typename Derived>
347 EIGEN_STRONG_INLINE Derived&
351 return setConstant(value);
365 template<
typename Derived>
366 EIGEN_STRONG_INLINE Derived&
370 return setConstant(value);
386 template<
typename Derived>
389 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
390 return derived() = Derived::NullaryExpr(size, internal::linspaced_op<Scalar,false>(low,high,size));
403 template<
typename Derived>
406 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
407 return setLinSpaced(size(), low, high);
426 template<
typename Derived>
430 return Constant(rows, cols, Scalar(0));
449 template<
typename Derived>
453 return Constant(size, Scalar(0));
466 template<
typename Derived>
470 return Constant(Scalar(0));
481 template<
typename Derived>
484 for(
Index j = 0; j < cols(); ++j)
485 for(
Index i = 0; i < rows(); ++i)
486 if(!internal::isMuchSmallerThan(this->coeff(i, j), static_cast<Scalar>(1), prec))
498 template<
typename Derived>
501 return setConstant(Scalar(0));
513 template<
typename Derived>
514 EIGEN_STRONG_INLINE Derived&
518 return setConstant(Scalar(0));
531 template<
typename Derived>
532 EIGEN_STRONG_INLINE Derived&
536 return setConstant(Scalar(0));
555 template<
typename Derived>
559 return Constant(rows, cols, Scalar(1));
578 template<
typename Derived>
582 return Constant(size, Scalar(1));
595 template<
typename Derived>
599 return Constant(Scalar(1));
610 template<
typename Derived>
612 (RealScalar prec)
const
614 return isApproxToConstant(Scalar(1), prec);
624 template<
typename Derived>
627 return setConstant(Scalar(1));
639 template<
typename Derived>
640 EIGEN_STRONG_INLINE Derived&
644 return setConstant(Scalar(1));
657 template<
typename Derived>
658 EIGEN_STRONG_INLINE Derived&
662 return setConstant(Scalar(1));
681 template<
typename Derived>
698 template<
typename Derived>
702 EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived)
715 template<
typename Derived>
717 (RealScalar prec)
const
719 for(
Index j = 0; j < cols(); ++j)
721 for(
Index i = 0; i < rows(); ++i)
725 if(!internal::isApprox(this->coeff(i, j), static_cast<Scalar>(1), prec))
730 if(!internal::isMuchSmallerThan(this->coeff(i, j), static_cast<RealScalar>(1), prec))
740 template<
typename Derived,
bool Big = (Derived::SizeAtCompileTime>=16)>
741 struct setIdentity_impl
743 static EIGEN_STRONG_INLINE Derived& run(Derived& m)
745 return m = Derived::Identity(m.rows(), m.cols());
749 template<
typename Derived>
750 struct setIdentity_impl<Derived, true>
752 typedef typename Derived::Index Index;
753 static EIGEN_STRONG_INLINE Derived& run(Derived& m)
756 const Index size = (std::min)(m.rows(), m.cols());
757 for(Index i = 0; i < size; ++i) m.coeffRef(i,i) =
typename Derived::Scalar(1);
771 template<
typename Derived>
774 return internal::setIdentity_impl<Derived>::run(derived());
787 template<
typename Derived>
790 derived().resize(rows, cols);
791 return setIdentity();
800 template<
typename Derived>
803 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
804 return BasisReturnType(SquareMatrixType::Identity(size,size), i);
815 template<
typename Derived>
818 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
819 return BasisReturnType(SquareMatrixType::Identity(),i);
828 template<
typename Derived>
830 {
return Derived::Unit(0); }
838 template<
typename Derived>
840 {
return Derived::Unit(1); }
848 template<
typename Derived>
850 {
return Derived::Unit(2); }
858 template<
typename Derived>
860 {
return Derived::Unit(3); }
864 #endif // EIGEN_CWISE_NULLARY_OP_H