Use Eigen::fix<N> to pass compile-time sizes.

This commit is contained in:
Gael Guennebaud 2017-02-11 15:31:28 +01:00
parent 24409f3acd
commit 83d6a529c3
6 changed files with 46 additions and 26 deletions

View File

@ -13,7 +13,7 @@
namespace Eigen { namespace Eigen {
/** \class Reshapedd /** \class Reshaped
* \ingroup Core_Module * \ingroup Core_Module
* *
* \brief Expression of a fixed-size or dynamic-size reshape * \brief Expression of a fixed-size or dynamic-size reshape
@ -23,27 +23,24 @@ namespace Eigen {
* \tparam Cols the number of columns of the reshape we are taking at compile time (optional) * \tparam Cols the number of columns of the reshape we are taking at compile time (optional)
* \tparam Order * \tparam Order
* *
* This class represents an expression of either a fixed-size or dynamic-size reshape. It is the return * This class represents an expression of either a fixed-size or dynamic-size reshape.
* type of DenseBase::reshaped(Index,Index) and DenseBase::reshape<int,int>() and * It is the return type of DenseBase::reshaped(NRowsType,NColsType) and
* most of the time this is the only way it is used. * most of the time this is the only way it is used.
* *
* However, if you want to directly maniputate reshape expressions, * However, in C++98, if you want to directly maniputate reshaped expressions,
* for instance if you want to write a function returning such an expression, you * for instance if you want to write a function returning such an expression, you
* will need to use this class. * will need to use this class. In C++11, it is advised to use the \em auto
* keyword for such use cases.
* *
* Here is an example illustrating the dynamic case: * Here is an example illustrating the dynamic case:
* \include class_Reshaped.cpp * \include class_Reshaped.cpp
* Output: \verbinclude class_Reshaped.out * Output: \verbinclude class_Reshaped.out
* *
* \note Even though this expression has dynamic size, in the case where \a XprType
* has fixed size, this expression inherits a fixed maximal size which means that evaluating
* it does not cause a dynamic memory allocation.
*
* Here is an example illustrating the fixed-size case: * Here is an example illustrating the fixed-size case:
* \include class_FixedReshaped.cpp * \include class_FixedReshaped.cpp
* Output: \verbinclude class_FixedReshaped.out * Output: \verbinclude class_FixedReshaped.out
* *
* \sa DenseBase::reshaped(Index,Index), DenseBase::reshaped(), class VectorReshaped * \sa DenseBase::reshaped(NRowsType,NColsType)
*/ */
namespace internal { namespace internal {

View File

@ -17,30 +17,53 @@
/// ///
/// \sa class Reshaped, fix, fix<N>(int) /// \sa class Reshaped, fix, fix<N>(int)
/// ///
#ifdef EIGEN_PARSED_BY_DOXYGEN
template<typename NRowsType, typename NColsType, typename OrderType>
EIGEN_DEVICE_FUNC
inline Reshaped<Derived,...>
reshaped(NRowsType nRows, NColsType nCols, OrderType = ColOrder);
/** This is the const version of reshaped(NRowsType,NColsType). */
template<typename NRowsType, typename NColsType, typename OrderType>
EIGEN_DEVICE_FUNC
inline const Reshaped<const Derived,...>
reshaped(NRowsType nRows, NColsType nCols, OrderType = ColOrder) const;
#else
template<typename NRowsType, typename NColsType> template<typename NRowsType, typename NColsType>
EIGEN_DEVICE_FUNC EIGEN_DEVICE_FUNC
#ifndef EIGEN_PARSED_BY_DOXYGEN
inline Reshaped<Derived,internal::get_fixed_value<NRowsType>::value,internal::get_fixed_value<NColsType>::value> inline Reshaped<Derived,internal::get_fixed_value<NRowsType>::value,internal::get_fixed_value<NColsType>::value>
#else
inline Reshaped<Derived,...>
#endif
reshaped(NRowsType nRows, NColsType nCols) reshaped(NRowsType nRows, NColsType nCols)
{ {
return Reshaped<Derived,internal::get_fixed_value<NRowsType>::value,internal::get_fixed_value<NColsType>::value>( return Reshaped<Derived,internal::get_fixed_value<NRowsType>::value,internal::get_fixed_value<NColsType>::value>(
derived(), internal::get_runtime_value(nRows), internal::get_runtime_value(nCols)); derived(), internal::get_runtime_value(nRows), internal::get_runtime_value(nCols));
} }
/** This is the const version of reshaped(NRowsType,NColsType). */ template<typename NRowsType, typename NColsType, typename OrderType>
EIGEN_DEVICE_FUNC
inline Reshaped<Derived,internal::get_fixed_value<NRowsType>::value,internal::get_fixed_value<NColsType>::value,OrderType::value>
reshaped(NRowsType nRows, NColsType nCols, OrderType)
{
return Reshaped<Derived,internal::get_fixed_value<NRowsType>::value,internal::get_fixed_value<NColsType>::value,OrderType::value>(
derived(), internal::get_runtime_value(nRows), internal::get_runtime_value(nCols));
}
template<typename NRowsType, typename NColsType> template<typename NRowsType, typename NColsType>
EIGEN_DEVICE_FUNC EIGEN_DEVICE_FUNC
#ifndef EIGEN_PARSED_BY_DOXYGEN
inline const Reshaped<const Derived,internal::get_fixed_value<NRowsType>::value,internal::get_fixed_value<NColsType>::value> inline const Reshaped<const Derived,internal::get_fixed_value<NRowsType>::value,internal::get_fixed_value<NColsType>::value>
#else
inline const Reshaped<const Derived,...>
#endif
reshaped(NRowsType nRows, NColsType nCols) const reshaped(NRowsType nRows, NColsType nCols) const
{ {
return Reshaped<const Derived,internal::get_fixed_value<NRowsType>::value,internal::get_fixed_value<NColsType>::value>( return Reshaped<const Derived,internal::get_fixed_value<NRowsType>::value,internal::get_fixed_value<NColsType>::value>(
derived(), internal::get_runtime_value(nRows), internal::get_runtime_value(nCols)); derived(), internal::get_runtime_value(nRows), internal::get_runtime_value(nCols));
} }
template<typename NRowsType, typename NColsType, typename OrderType>
EIGEN_DEVICE_FUNC
inline const Reshaped<const Derived,internal::get_fixed_value<NRowsType>::value,internal::get_fixed_value<NColsType>::value,OrderType::value>
reshaped(NRowsType nRows, NColsType nCols, OrderType) const
{
return Reshaped<const Derived,internal::get_fixed_value<NRowsType>::value,internal::get_fixed_value<NColsType>::value,OrderType::value>(
derived(), internal::get_runtime_value(nRows), internal::get_runtime_value(nCols));
}
#endif // EIGEN_PARSED_BY_DOXYGEN

View File

@ -4,10 +4,10 @@ using namespace Eigen;
using namespace std; using namespace std;
template<typename Derived> template<typename Derived>
Eigen::Reshape<Derived, 4, 2> Eigen::Reshaped<Derived, 4, 2>
reshape_helper(MatrixBase<Derived>& m) reshape_helper(MatrixBase<Derived>& m)
{ {
return Eigen::Reshape<Derived, 4, 2>(m.derived()); return Eigen::Reshaped<Derived, 4, 2>(m.derived());
} }
int main(int, char**) int main(int, char**)

View File

@ -4,10 +4,10 @@ using namespace std;
using namespace Eigen; using namespace Eigen;
template<typename Derived> template<typename Derived>
const Reshape<const Derived> const Reshaped<const Derived>
reshape_helper(const MatrixBase<Derived>& m, int rows, int cols) reshape_helper(const MatrixBase<Derived>& m, int rows, int cols)
{ {
return Reshape<const Derived>(m.derived(), rows, cols); return Reshaped<const Derived>(m.derived(), rows, cols);
} }
int main(int, char**) int main(int, char**)
@ -17,7 +17,7 @@ int main(int, char**)
2, 5, 8, 11, 2, 5, 8, 11,
3, 6, 9, 12; 3, 6, 9, 12;
cout << m << endl; cout << m << endl;
auto n = reshape_helper(m, 2, 6); Ref<const MatrixXd> n = reshape_helper(m, 2, 6);
cout << "Matrix m is:" << endl << m << endl; cout << "Matrix m is:" << endl << m << endl;
cout << "Matrix n is:" << endl << n << endl; cout << "Matrix n is:" << endl << n << endl;
} }

View File

@ -1,3 +1,3 @@
Matrix4i m = Matrix4i::Random(); Matrix4i m = Matrix4i::Random();
cout << "Here is the matrix m:" << endl << m << endl; cout << "Here is the matrix m:" << endl << m << endl;
cout << "Here is m.reshape(fix<2>,fix<8>):" << endl << m.reshape(fix<2>,fix<8>) << endl; cout << "Here is m.reshape(fix<2>,fix<8>):" << endl << m.reshaped(fix<2>,fix<8>) << endl;

View File

@ -1,3 +1,3 @@
Matrix4i m = Matrix4i::Random(); Matrix4i m = Matrix4i::Random();
cout << "Here is the matrix m:" << endl << m << endl; cout << "Here is the matrix m:" << endl << m << endl;
cout << "Here is m.reshape(2, 8):" << endl << m.reshape(2, 8) << endl; cout << "Here is m.reshape(2, 8):" << endl << m.reshaped(2, 8) << endl;