MOAB
4.9.3pre
|
00001 // This file is part of Eigen, a lightweight C++ template library 00002 // for linear algebra. 00003 // 00004 // Copyright (C) 2008-2010 Gael Guennebaud <[email protected]> 00005 // Copyright (C) 2006-2008 Benoit Jacob <[email protected]> 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_PARTIAL_REDUX_H 00012 #define EIGEN_PARTIAL_REDUX_H 00013 00014 namespace Eigen { 00015 00032 template< typename MatrixType, typename MemberOp, int Direction> 00033 class PartialReduxExpr; 00034 00035 namespace internal { 00036 template<typename MatrixType, typename MemberOp, int Direction> 00037 struct traits<PartialReduxExpr<MatrixType, MemberOp, Direction> > 00038 : traits<MatrixType> 00039 { 00040 typedef typename MemberOp::result_type Scalar; 00041 typedef typename traits<MatrixType>::StorageKind StorageKind; 00042 typedef typename traits<MatrixType>::XprKind XprKind; 00043 typedef typename MatrixType::Scalar InputScalar; 00044 enum { 00045 RowsAtCompileTime = Direction==Vertical ? 1 : MatrixType::RowsAtCompileTime, 00046 ColsAtCompileTime = Direction==Horizontal ? 1 : MatrixType::ColsAtCompileTime, 00047 MaxRowsAtCompileTime = Direction==Vertical ? 1 : MatrixType::MaxRowsAtCompileTime, 00048 MaxColsAtCompileTime = Direction==Horizontal ? 1 : MatrixType::MaxColsAtCompileTime, 00049 Flags = RowsAtCompileTime == 1 ? RowMajorBit : 0, 00050 TraversalSize = Direction==Vertical ? MatrixType::RowsAtCompileTime : MatrixType::ColsAtCompileTime 00051 }; 00052 }; 00053 } 00054 00055 template< typename MatrixType, typename MemberOp, int Direction> 00056 class PartialReduxExpr : public internal::dense_xpr_base< PartialReduxExpr<MatrixType, MemberOp, Direction> >::type, 00057 internal::no_assignment_operator 00058 { 00059 public: 00060 00061 typedef typename internal::dense_xpr_base<PartialReduxExpr>::type Base; 00062 EIGEN_DENSE_PUBLIC_INTERFACE(PartialReduxExpr) 00063 00064 EIGEN_DEVICE_FUNC 00065 explicit PartialReduxExpr(const MatrixType& mat, const MemberOp& func = MemberOp()) 00066 : m_matrix(mat), m_functor(func) {} 00067 00068 EIGEN_DEVICE_FUNC 00069 Index rows() const { return (Direction==Vertical ? 1 : m_matrix.rows()); } 00070 EIGEN_DEVICE_FUNC 00071 Index cols() const { return (Direction==Horizontal ? 1 : m_matrix.cols()); } 00072 00073 EIGEN_DEVICE_FUNC 00074 typename MatrixType::Nested nestedExpression() const { return m_matrix; } 00075 00076 EIGEN_DEVICE_FUNC 00077 const MemberOp& functor() const { return m_functor; } 00078 00079 protected: 00080 typename MatrixType::Nested m_matrix; 00081 const MemberOp m_functor; 00082 }; 00083 00084 #define EIGEN_MEMBER_FUNCTOR(MEMBER,COST) \ 00085 template <typename ResultType> \ 00086 struct member_##MEMBER { \ 00087 EIGEN_EMPTY_STRUCT_CTOR(member_##MEMBER) \ 00088 typedef ResultType result_type; \ 00089 template<typename Scalar, int Size> struct Cost \ 00090 { enum { value = COST }; }; \ 00091 template<typename XprType> \ 00092 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE \ 00093 ResultType operator()(const XprType& mat) const \ 00094 { return mat.MEMBER(); } \ 00095 } 00096 00097 namespace internal { 00098 00099 EIGEN_MEMBER_FUNCTOR(squaredNorm, Size * NumTraits<Scalar>::MulCost + (Size-1)*NumTraits<Scalar>::AddCost); 00100 EIGEN_MEMBER_FUNCTOR(norm, (Size+5) * NumTraits<Scalar>::MulCost + (Size-1)*NumTraits<Scalar>::AddCost); 00101 EIGEN_MEMBER_FUNCTOR(stableNorm, (Size+5) * NumTraits<Scalar>::MulCost + (Size-1)*NumTraits<Scalar>::AddCost); 00102 EIGEN_MEMBER_FUNCTOR(blueNorm, (Size+5) * NumTraits<Scalar>::MulCost + (Size-1)*NumTraits<Scalar>::AddCost); 00103 EIGEN_MEMBER_FUNCTOR(hypotNorm, (Size-1) * functor_traits<scalar_hypot_op<Scalar> >::Cost ); 00104 EIGEN_MEMBER_FUNCTOR(sum, (Size-1)*NumTraits<Scalar>::AddCost); 00105 EIGEN_MEMBER_FUNCTOR(mean, (Size-1)*NumTraits<Scalar>::AddCost + NumTraits<Scalar>::MulCost); 00106 EIGEN_MEMBER_FUNCTOR(minCoeff, (Size-1)*NumTraits<Scalar>::AddCost); 00107 EIGEN_MEMBER_FUNCTOR(maxCoeff, (Size-1)*NumTraits<Scalar>::AddCost); 00108 EIGEN_MEMBER_FUNCTOR(all, (Size-1)*NumTraits<Scalar>::AddCost); 00109 EIGEN_MEMBER_FUNCTOR(any, (Size-1)*NumTraits<Scalar>::AddCost); 00110 EIGEN_MEMBER_FUNCTOR(count, (Size-1)*NumTraits<Scalar>::AddCost); 00111 EIGEN_MEMBER_FUNCTOR(prod, (Size-1)*NumTraits<Scalar>::MulCost); 00112 00113 template <int p, typename ResultType> 00114 struct member_lpnorm { 00115 typedef ResultType result_type; 00116 template<typename Scalar, int Size> struct Cost 00117 { enum { value = (Size+5) * NumTraits<Scalar>::MulCost + (Size-1)*NumTraits<Scalar>::AddCost }; }; 00118 EIGEN_DEVICE_FUNC member_lpnorm() {} 00119 template<typename XprType> 00120 EIGEN_DEVICE_FUNC inline ResultType operator()(const XprType& mat) const 00121 { return mat.template lpNorm<p>(); } 00122 }; 00123 00124 template <typename BinaryOp, typename Scalar> 00125 struct member_redux { 00126 typedef typename result_of< 00127 BinaryOp(const Scalar&,const Scalar&) 00128 >::type result_type; 00129 template<typename _Scalar, int Size> struct Cost 00130 { enum { value = (Size-1) * functor_traits<BinaryOp>::Cost }; }; 00131 EIGEN_DEVICE_FUNC explicit member_redux(const BinaryOp func) : m_functor(func) {} 00132 template<typename Derived> 00133 EIGEN_DEVICE_FUNC inline result_type operator()(const DenseBase<Derived>& mat) const 00134 { return mat.redux(m_functor); } 00135 const BinaryOp m_functor; 00136 }; 00137 } 00138 00156 template<typename ExpressionType, int Direction> class VectorwiseOp 00157 { 00158 public: 00159 00160 typedef typename ExpressionType::Scalar Scalar; 00161 typedef typename ExpressionType::RealScalar RealScalar; 00162 typedef Eigen::Index Index; 00163 typedef typename internal::ref_selector<ExpressionType>::non_const_type ExpressionTypeNested; 00164 typedef typename internal::remove_all<ExpressionTypeNested>::type ExpressionTypeNestedCleaned; 00165 00166 template<template<typename _Scalar> class Functor, 00167 typename Scalar_=Scalar> struct ReturnType 00168 { 00169 typedef PartialReduxExpr<ExpressionType, 00170 Functor<Scalar_>, 00171 Direction 00172 > Type; 00173 }; 00174 00175 template<typename BinaryOp> struct ReduxReturnType 00176 { 00177 typedef PartialReduxExpr<ExpressionType, 00178 internal::member_redux<BinaryOp,Scalar>, 00179 Direction 00180 > Type; 00181 }; 00182 00183 enum { 00184 isVertical = (Direction==Vertical) ? 1 : 0, 00185 isHorizontal = (Direction==Horizontal) ? 1 : 0 00186 }; 00187 00188 protected: 00189 00190 typedef typename internal::conditional<isVertical, 00191 typename ExpressionType::ColXpr, 00192 typename ExpressionType::RowXpr>::type SubVector; 00195 EIGEN_DEVICE_FUNC 00196 SubVector subVector(Index i) 00197 { 00198 return SubVector(m_matrix.derived(),i); 00199 } 00200 00203 EIGEN_DEVICE_FUNC 00204 Index subVectors() const 00205 { return isVertical?m_matrix.cols():m_matrix.rows(); } 00206 00207 template<typename OtherDerived> struct ExtendedType { 00208 typedef Replicate<OtherDerived, 00209 isVertical ? 1 : ExpressionType::RowsAtCompileTime, 00210 isHorizontal ? 1 : ExpressionType::ColsAtCompileTime> Type; 00211 }; 00212 00215 template<typename OtherDerived> 00216 EIGEN_DEVICE_FUNC 00217 typename ExtendedType<OtherDerived>::Type 00218 extendedTo(const DenseBase<OtherDerived>& other) const 00219 { 00220 EIGEN_STATIC_ASSERT(EIGEN_IMPLIES(isVertical, OtherDerived::MaxColsAtCompileTime==1), 00221 YOU_PASSED_A_ROW_VECTOR_BUT_A_COLUMN_VECTOR_WAS_EXPECTED) 00222 EIGEN_STATIC_ASSERT(EIGEN_IMPLIES(isHorizontal, OtherDerived::MaxRowsAtCompileTime==1), 00223 YOU_PASSED_A_COLUMN_VECTOR_BUT_A_ROW_VECTOR_WAS_EXPECTED) 00224 return typename ExtendedType<OtherDerived>::Type 00225 (other.derived(), 00226 isVertical ? 1 : m_matrix.rows(), 00227 isHorizontal ? 1 : m_matrix.cols()); 00228 } 00229 00230 template<typename OtherDerived> struct OppositeExtendedType { 00231 typedef Replicate<OtherDerived, 00232 isHorizontal ? 1 : ExpressionType::RowsAtCompileTime, 00233 isVertical ? 1 : ExpressionType::ColsAtCompileTime> Type; 00234 }; 00235 00238 template<typename OtherDerived> 00239 EIGEN_DEVICE_FUNC 00240 typename OppositeExtendedType<OtherDerived>::Type 00241 extendedToOpposite(const DenseBase<OtherDerived>& other) const 00242 { 00243 EIGEN_STATIC_ASSERT(EIGEN_IMPLIES(isHorizontal, OtherDerived::MaxColsAtCompileTime==1), 00244 YOU_PASSED_A_ROW_VECTOR_BUT_A_COLUMN_VECTOR_WAS_EXPECTED) 00245 EIGEN_STATIC_ASSERT(EIGEN_IMPLIES(isVertical, OtherDerived::MaxRowsAtCompileTime==1), 00246 YOU_PASSED_A_COLUMN_VECTOR_BUT_A_ROW_VECTOR_WAS_EXPECTED) 00247 return typename OppositeExtendedType<OtherDerived>::Type 00248 (other.derived(), 00249 isHorizontal ? 1 : m_matrix.rows(), 00250 isVertical ? 1 : m_matrix.cols()); 00251 } 00252 00253 public: 00254 EIGEN_DEVICE_FUNC 00255 explicit inline VectorwiseOp(ExpressionType& matrix) : m_matrix(matrix) {} 00256 00258 EIGEN_DEVICE_FUNC 00259 inline const ExpressionType& _expression() const { return m_matrix; } 00260 00268 template<typename BinaryOp> 00269 EIGEN_DEVICE_FUNC 00270 const typename ReduxReturnType<BinaryOp>::Type 00271 redux(const BinaryOp& func = BinaryOp()) const 00272 { return typename ReduxReturnType<BinaryOp>::Type(_expression(), internal::member_redux<BinaryOp,Scalar>(func)); } 00273 00274 typedef typename ReturnType<internal::member_minCoeff>::Type MinCoeffReturnType; 00275 typedef typename ReturnType<internal::member_maxCoeff>::Type MaxCoeffReturnType; 00276 typedef typename ReturnType<internal::member_squaredNorm,RealScalar>::Type SquaredNormReturnType; 00277 typedef typename ReturnType<internal::member_norm,RealScalar>::Type NormReturnType; 00278 typedef typename ReturnType<internal::member_blueNorm,RealScalar>::Type BlueNormReturnType; 00279 typedef typename ReturnType<internal::member_stableNorm,RealScalar>::Type StableNormReturnType; 00280 typedef typename ReturnType<internal::member_hypotNorm,RealScalar>::Type HypotNormReturnType; 00281 typedef typename ReturnType<internal::member_sum>::Type SumReturnType; 00282 typedef typename ReturnType<internal::member_mean>::Type MeanReturnType; 00283 typedef typename ReturnType<internal::member_all>::Type AllReturnType; 00284 typedef typename ReturnType<internal::member_any>::Type AnyReturnType; 00285 typedef PartialReduxExpr<ExpressionType, internal::member_count<Index>, Direction> CountReturnType; 00286 typedef typename ReturnType<internal::member_prod>::Type ProdReturnType; 00287 typedef Reverse<ExpressionType, Direction> ReverseReturnType; 00288 00289 template<int p> struct LpNormReturnType { 00290 typedef PartialReduxExpr<ExpressionType, internal::member_lpnorm<p,RealScalar>,Direction> Type; 00291 }; 00292 00302 EIGEN_DEVICE_FUNC 00303 const MinCoeffReturnType minCoeff() const 00304 { return MinCoeffReturnType(_expression()); } 00305 00315 EIGEN_DEVICE_FUNC 00316 const MaxCoeffReturnType maxCoeff() const 00317 { return MaxCoeffReturnType(_expression()); } 00318 00327 EIGEN_DEVICE_FUNC 00328 const SquaredNormReturnType squaredNorm() const 00329 { return SquaredNormReturnType(_expression()); } 00330 00339 EIGEN_DEVICE_FUNC 00340 const NormReturnType norm() const 00341 { return NormReturnType(_expression()); } 00342 00351 template<int p> 00352 EIGEN_DEVICE_FUNC 00353 const typename LpNormReturnType<p>::Type lpNorm() const 00354 { return typename LpNormReturnType<p>::Type(_expression()); } 00355 00356 00363 EIGEN_DEVICE_FUNC 00364 const BlueNormReturnType blueNorm() const 00365 { return BlueNormReturnType(_expression()); } 00366 00367 00374 EIGEN_DEVICE_FUNC 00375 const StableNormReturnType stableNorm() const 00376 { return StableNormReturnType(_expression()); } 00377 00378 00385 EIGEN_DEVICE_FUNC 00386 const HypotNormReturnType hypotNorm() const 00387 { return HypotNormReturnType(_expression()); } 00388 00396 EIGEN_DEVICE_FUNC 00397 const SumReturnType sum() const 00398 { return SumReturnType(_expression()); } 00399 00404 EIGEN_DEVICE_FUNC 00405 const MeanReturnType mean() const 00406 { return MeanReturnType(_expression()); } 00407 00413 EIGEN_DEVICE_FUNC 00414 const AllReturnType all() const 00415 { return AllReturnType(_expression()); } 00416 00422 EIGEN_DEVICE_FUNC 00423 const AnyReturnType any() const 00424 { return AnyReturnType(_expression()); } 00425 00435 EIGEN_DEVICE_FUNC 00436 const CountReturnType count() const 00437 { return CountReturnType(_expression()); } 00438 00446 EIGEN_DEVICE_FUNC 00447 const ProdReturnType prod() const 00448 { return ProdReturnType(_expression()); } 00449 00450 00458 EIGEN_DEVICE_FUNC 00459 const ReverseReturnType reverse() const 00460 { return ReverseReturnType( _expression() ); } 00461 00462 typedef Replicate<ExpressionType,(isVertical?Dynamic:1),(isHorizontal?Dynamic:1)> ReplicateReturnType; 00463 EIGEN_DEVICE_FUNC 00464 const ReplicateReturnType replicate(Index factor) const; 00465 00474 // NOTE implemented here because of sunstudio's compilation errors 00475 // isVertical*Factor+isHorizontal instead of (isVertical?Factor:1) to handle CUDA bug with ternary operator 00476 template<int Factor> const Replicate<ExpressionType,isVertical*Factor+isHorizontal,isHorizontal*Factor+isVertical> 00477 EIGEN_DEVICE_FUNC 00478 replicate(Index factor = Factor) const 00479 { 00480 return Replicate<ExpressionType,(isVertical?Factor:1),(isHorizontal?Factor:1)> 00481 (_expression(),isVertical?factor:1,isHorizontal?factor:1); 00482 } 00483 00485 00487 template<typename OtherDerived> 00488 EIGEN_DEVICE_FUNC 00489 ExpressionType& operator=(const DenseBase<OtherDerived>& other) 00490 { 00491 EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived) 00492 EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived) 00493 //eigen_assert((m_matrix.isNull()) == (other.isNull())); FIXME 00494 return const_cast<ExpressionType&>(m_matrix = extendedTo(other.derived())); 00495 } 00496 00498 template<typename OtherDerived> 00499 EIGEN_DEVICE_FUNC 00500 ExpressionType& operator+=(const DenseBase<OtherDerived>& other) 00501 { 00502 EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived) 00503 EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived) 00504 return const_cast<ExpressionType&>(m_matrix += extendedTo(other.derived())); 00505 } 00506 00508 template<typename OtherDerived> 00509 EIGEN_DEVICE_FUNC 00510 ExpressionType& operator-=(const DenseBase<OtherDerived>& other) 00511 { 00512 EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived) 00513 EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived) 00514 return const_cast<ExpressionType&>(m_matrix -= extendedTo(other.derived())); 00515 } 00516 00518 template<typename OtherDerived> 00519 EIGEN_DEVICE_FUNC 00520 ExpressionType& operator*=(const DenseBase<OtherDerived>& other) 00521 { 00522 EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived) 00523 EIGEN_STATIC_ASSERT_ARRAYXPR(ExpressionType) 00524 EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived) 00525 m_matrix *= extendedTo(other.derived()); 00526 return const_cast<ExpressionType&>(m_matrix); 00527 } 00528 00530 template<typename OtherDerived> 00531 EIGEN_DEVICE_FUNC 00532 ExpressionType& operator/=(const DenseBase<OtherDerived>& other) 00533 { 00534 EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived) 00535 EIGEN_STATIC_ASSERT_ARRAYXPR(ExpressionType) 00536 EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived) 00537 m_matrix /= extendedTo(other.derived()); 00538 return const_cast<ExpressionType&>(m_matrix); 00539 } 00540 00542 template<typename OtherDerived> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC 00543 CwiseBinaryOp<internal::scalar_sum_op<Scalar>, 00544 const ExpressionTypeNestedCleaned, 00545 const typename ExtendedType<OtherDerived>::Type> 00546 operator+(const DenseBase<OtherDerived>& other) const 00547 { 00548 EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived) 00549 EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived) 00550 return m_matrix + extendedTo(other.derived()); 00551 } 00552 00554 template<typename OtherDerived> 00555 EIGEN_DEVICE_FUNC 00556 CwiseBinaryOp<internal::scalar_difference_op<Scalar>, 00557 const ExpressionTypeNestedCleaned, 00558 const typename ExtendedType<OtherDerived>::Type> 00559 operator-(const DenseBase<OtherDerived>& other) const 00560 { 00561 EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived) 00562 EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived) 00563 return m_matrix - extendedTo(other.derived()); 00564 } 00565 00568 template<typename OtherDerived> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC 00569 CwiseBinaryOp<internal::scalar_product_op<Scalar>, 00570 const ExpressionTypeNestedCleaned, 00571 const typename ExtendedType<OtherDerived>::Type> 00572 EIGEN_DEVICE_FUNC 00573 operator*(const DenseBase<OtherDerived>& other) const 00574 { 00575 EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived) 00576 EIGEN_STATIC_ASSERT_ARRAYXPR(ExpressionType) 00577 EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived) 00578 return m_matrix * extendedTo(other.derived()); 00579 } 00580 00583 template<typename OtherDerived> 00584 EIGEN_DEVICE_FUNC 00585 CwiseBinaryOp<internal::scalar_quotient_op<Scalar>, 00586 const ExpressionTypeNestedCleaned, 00587 const typename ExtendedType<OtherDerived>::Type> 00588 operator/(const DenseBase<OtherDerived>& other) const 00589 { 00590 EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived) 00591 EIGEN_STATIC_ASSERT_ARRAYXPR(ExpressionType) 00592 EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived) 00593 return m_matrix / extendedTo(other.derived()); 00594 } 00595 00600 EIGEN_DEVICE_FUNC 00601 CwiseBinaryOp<internal::scalar_quotient_op<Scalar>, 00602 const ExpressionTypeNestedCleaned, 00603 const typename OppositeExtendedType<typename ReturnType<internal::member_norm,RealScalar>::Type>::Type> 00604 normalized() const { return m_matrix.cwiseQuotient(extendedToOpposite(this->norm())); } 00605 00606 00610 EIGEN_DEVICE_FUNC void normalize() { 00611 m_matrix = this->normalized(); 00612 } 00613 00614 EIGEN_DEVICE_FUNC inline void reverseInPlace(); 00615 00617 00618 typedef Homogeneous<ExpressionType,Direction> HomogeneousReturnType; 00619 HomogeneousReturnType homogeneous() const; 00620 00621 typedef typename ExpressionType::PlainObject CrossReturnType; 00622 template<typename OtherDerived> 00623 EIGEN_DEVICE_FUNC 00624 const CrossReturnType cross(const MatrixBase<OtherDerived>& other) const; 00625 00626 enum { 00627 HNormalized_Size = Direction==Vertical ? internal::traits<ExpressionType>::RowsAtCompileTime 00628 : internal::traits<ExpressionType>::ColsAtCompileTime, 00629 HNormalized_SizeMinusOne = HNormalized_Size==Dynamic ? Dynamic : HNormalized_Size-1 00630 }; 00631 typedef Block<const ExpressionType, 00632 Direction==Vertical ? int(HNormalized_SizeMinusOne) 00633 : int(internal::traits<ExpressionType>::RowsAtCompileTime), 00634 Direction==Horizontal ? int(HNormalized_SizeMinusOne) 00635 : int(internal::traits<ExpressionType>::ColsAtCompileTime)> 00636 HNormalized_Block; 00637 typedef Block<const ExpressionType, 00638 Direction==Vertical ? 1 : int(internal::traits<ExpressionType>::RowsAtCompileTime), 00639 Direction==Horizontal ? 1 : int(internal::traits<ExpressionType>::ColsAtCompileTime)> 00640 HNormalized_Factors; 00641 typedef CwiseBinaryOp<internal::scalar_quotient_op<typename internal::traits<ExpressionType>::Scalar>, 00642 const HNormalized_Block, 00643 const Replicate<HNormalized_Factors, 00644 Direction==Vertical ? HNormalized_SizeMinusOne : 1, 00645 Direction==Horizontal ? HNormalized_SizeMinusOne : 1> > 00646 HNormalizedReturnType; 00647 00648 const HNormalizedReturnType hnormalized() const; 00649 00650 protected: 00651 ExpressionTypeNested m_matrix; 00652 }; 00653 00654 //const colwise moved to DenseBase.h due to CUDA compiler bug 00655 00656 00661 template<typename Derived> 00662 inline typename DenseBase<Derived>::ColwiseReturnType 00663 DenseBase<Derived>::colwise() 00664 { 00665 return ColwiseReturnType(derived()); 00666 } 00667 00668 //const rowwise moved to DenseBase.h due to CUDA compiler bug 00669 00670 00675 template<typename Derived> 00676 inline typename DenseBase<Derived>::RowwiseReturnType 00677 DenseBase<Derived>::rowwise() 00678 { 00679 return RowwiseReturnType(derived()); 00680 } 00681 00682 } // end namespace Eigen 00683 00684 #endif // EIGEN_PARTIAL_REDUX_H