1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library 2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra. 3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr> 5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla 7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed 8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_RANDOM_H 11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_RANDOM_H 12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen { 14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal { 16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_random_op { 18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_random_op) 19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Index> 20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const Scalar operator() (Index, Index = 0) const { return random<Scalar>(); } 21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_random_op<Scalar> > 25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = false, IsRepeatable = false }; }; 26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace internal 28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \returns a random matrix expression 30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * The parameters \a rows and \a cols are the number of rows and of columns of 32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * the returned matrix. Must be compatible with this MatrixBase type. 33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * This variant is meant to be used for dynamic-size matrix types. For fixed-size types, 35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * it is redundant to pass \a rows and \a cols as arguments, so Random() should be used 36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * instead. 37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Example: \include MatrixBase_random_int_int.cpp 39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Output: \verbinclude MatrixBase_random_int_int.out 40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * This expression has the "evaluate before nesting" flag so that it will be evaluated into 42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * a temporary matrix whenever it is nested in a larger expression. This prevents unexpected 43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * behavior with expressions involving random matrices. 44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa MatrixBase::setRandom(), MatrixBase::Random(Index), MatrixBase::Random() 46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const CwiseNullaryOp<internal::scalar_random_op<typename internal::traits<Derived>::Scalar>, Derived> 49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathDenseBase<Derived>::Random(Index rows, Index cols) 50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return NullaryExpr(rows, cols, internal::scalar_random_op<Scalar>()); 52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \returns a random vector expression 55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * The parameter \a size is the size of the returned vector. 57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Must be compatible with this MatrixBase type. 58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \only_for_vectors 60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * This variant is meant to be used for dynamic-size vector types. For fixed-size types, 62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * it is redundant to pass \a size as argument, so Random() should be used 63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * instead. 64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Example: \include MatrixBase_random_int.cpp 66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Output: \verbinclude MatrixBase_random_int.out 67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * This expression has the "evaluate before nesting" flag so that it will be evaluated into 69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * a temporary vector whenever it is nested in a larger expression. This prevents unexpected 70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * behavior with expressions involving random matrices. 71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa MatrixBase::setRandom(), MatrixBase::Random(Index,Index), MatrixBase::Random() 73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const CwiseNullaryOp<internal::scalar_random_op<typename internal::traits<Derived>::Scalar>, Derived> 76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathDenseBase<Derived>::Random(Index size) 77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return NullaryExpr(size, internal::scalar_random_op<Scalar>()); 79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \returns a fixed-size random matrix or vector expression 82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * This variant is only for fixed-size MatrixBase types. For dynamic-size types, you 84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * need to use the variants taking size arguments. 85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Example: \include MatrixBase_random.cpp 87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Output: \verbinclude MatrixBase_random.out 88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * This expression has the "evaluate before nesting" flag so that it will be evaluated into 90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * a temporary matrix whenever it is nested in a larger expression. This prevents unexpected 91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * behavior with expressions involving random matrices. 92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa MatrixBase::setRandom(), MatrixBase::Random(Index,Index), MatrixBase::Random(Index) 94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const CwiseNullaryOp<internal::scalar_random_op<typename internal::traits<Derived>::Scalar>, Derived> 97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathDenseBase<Derived>::Random() 98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return NullaryExpr(RowsAtCompileTime, ColsAtCompileTime, internal::scalar_random_op<Scalar>()); 100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** Sets all coefficients in this expression to random values. 103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Example: \include MatrixBase_setRandom.cpp 105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Output: \verbinclude MatrixBase_setRandom.out 106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseNullaryOp, setRandom(Index), setRandom(Index,Index) 108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline Derived& DenseBase<Derived>::setRandom() 111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return *this = Random(rows(), cols()); 113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 1157faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez/** Resizes to the given \a newSize, and sets all coefficients in this expression to random values. 116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \only_for_vectors 118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Example: \include Matrix_setRandom_int.cpp 120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Output: \verbinclude Matrix_setRandom_int.out 121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa MatrixBase::setRandom(), setRandom(Index,Index), class CwiseNullaryOp, MatrixBase::Random() 123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_STRONG_INLINE Derived& 1267faaa9f3f0df9d23790277834d426c3d992ac3baCarlos HernandezPlainObjectBase<Derived>::setRandom(Index newSize) 127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 1287faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez resize(newSize); 129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return setRandom(); 130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** Resizes to the given size, and sets all coefficients in this expression to random values. 133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 1347faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez * \param nbRows the new number of rows 1357faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez * \param nbCols the new number of columns 136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Example: \include Matrix_setRandom_int_int.cpp 138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Output: \verbinclude Matrix_setRandom_int_int.out 139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa MatrixBase::setRandom(), setRandom(Index), class CwiseNullaryOp, MatrixBase::Random() 141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_STRONG_INLINE Derived& 1447faaa9f3f0df9d23790277834d426c3d992ac3baCarlos HernandezPlainObjectBase<Derived>::setRandom(Index nbRows, Index nbCols) 145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 1467faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez resize(nbRows, nbCols); 147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return setRandom(); 148c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen 151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_RANDOM_H 153