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 {
/** \class Reshapedd
/** \class Reshaped
* \ingroup Core_Module
*
* \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 Order
*
* This class represents an expression of either a fixed-size or dynamic-size reshape. It is the return
* type of DenseBase::reshaped(Index,Index) and DenseBase::reshape<int,int>() and
* This class represents an expression of either a fixed-size or dynamic-size reshape.
* It is the return type of DenseBase::reshaped(NRowsType,NColsType) and
* 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
* 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:
* \include class_Reshaped.cpp
* 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:
* \include class_FixedReshaped.cpp
* Output: \verbinclude class_FixedReshaped.out
*
* \sa DenseBase::reshaped(Index,Index), DenseBase::reshaped(), class VectorReshaped
* \sa DenseBase::reshaped(NRowsType,NColsType)
*/
namespace internal {

View File

@ -17,30 +17,53 @@
///
/// \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>
EIGEN_DEVICE_FUNC
#ifndef EIGEN_PARSED_BY_DOXYGEN
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)
{
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));
}
/** 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>
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>
#else
inline const Reshaped<const Derived,...>
#endif
reshaped(NRowsType nRows, NColsType nCols) const
{
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));
}
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;
template<typename Derived>
Eigen::Reshape<Derived, 4, 2>
Eigen::Reshaped<Derived, 4, 2>
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**)

View File

@ -4,10 +4,10 @@ using namespace std;
using namespace Eigen;
template<typename Derived>
const Reshape<const Derived>
const Reshaped<const Derived>
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**)
@ -17,7 +17,7 @@ int main(int, char**)
2, 5, 8, 11,
3, 6, 9, 12;
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 n is:" << endl << n << endl;
}

View File

@ -1,3 +1,3 @@
Matrix4i m = Matrix4i::Random();
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();
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;