diff options
author | 2009-11-03 02:18:10 -0500 | |
---|---|---|
committer | 2009-11-03 02:18:10 -0500 | |
commit | da363d997f1721ceaefcd946fb14e793074f88b9 (patch) | |
tree | 4ccc83796b09c4583a908526d926616056eab70d /Eigen/src/misc | |
parent | f975b9bd3eb0a862efef290a63a3d1d20a03c099 (diff) |
introduce ei_xxx_return_value and ei_xxx_impl for xxx in solve,kernel,impl
put them in a new internal 'misc' directory
Diffstat (limited to 'Eigen/src/misc')
-rw-r--r-- | Eigen/src/misc/CMakeLists.txt | 6 | ||||
-rw-r--r-- | Eigen/src/misc/Image.h | 72 | ||||
-rw-r--r-- | Eigen/src/misc/Kernel.h | 71 | ||||
-rw-r--r-- | Eigen/src/misc/Solve.h | 65 |
4 files changed, 214 insertions, 0 deletions
diff --git a/Eigen/src/misc/CMakeLists.txt b/Eigen/src/misc/CMakeLists.txt new file mode 100644 index 000000000..a58ffb745 --- /dev/null +++ b/Eigen/src/misc/CMakeLists.txt @@ -0,0 +1,6 @@ +FILE(GLOB Eigen_misc_SRCS "*.h") + +INSTALL(FILES + ${Eigen_misc_SRCS} + DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/misc COMPONENT Devel + ) diff --git a/Eigen/src/misc/Image.h b/Eigen/src/misc/Image.h new file mode 100644 index 000000000..a7e2bceec --- /dev/null +++ b/Eigen/src/misc/Image.h @@ -0,0 +1,72 @@ +// This file is part of Eigen, a lightweight C++ template library +// for linear algebra. +// +// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1@gmail.com> +// +// Eigen is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3 of the License, or (at your option) any later version. +// +// Alternatively, you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of +// the License, or (at your option) any later version. +// +// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License and a copy of the GNU General Public License along with +// Eigen. If not, see <http://www.gnu.org/licenses/>. + +#ifndef EIGEN_MISC_IMAGE_H +#define EIGEN_MISC_IMAGE_H + +/** \class ei_image_return_value + * + */ +template<typename DecompositionType> +struct ei_traits<ei_image_return_value<DecompositionType> > +{ + typedef typename DecompositionType::MatrixType MatrixType; + typedef Matrix< + typename MatrixType::Scalar, + MatrixType::RowsAtCompileTime, // the image is a subspace of the destination space, whose + // dimension is the number of rows of the original matrix + Dynamic, // we don't know at compile time the dimension of the image (the rank) + MatrixType::Options, + MatrixType::MaxRowsAtCompileTime, // the image matrix will consist of columns from the original matrix, + MatrixType::MaxColsAtCompileTime // so it has the same number of rows and at most as many columns. + > ReturnMatrixType; +}; + +template<typename _DecompositionType> struct ei_image_return_value + : public ReturnByValue<ei_image_return_value<_DecompositionType> > +{ + typedef _DecompositionType DecompositionType; + typedef typename DecompositionType::MatrixType MatrixType; + + const DecompositionType& m_dec; + int m_rank, m_cols; + const MatrixType& m_originalMatrix; + + ei_image_return_value(const DecompositionType& dec, const MatrixType& originalMatrix) + : m_dec(dec), m_rank(dec.rank()), + m_cols(m_rank == 0 ? 1 : m_rank), + m_originalMatrix(originalMatrix) + {} + + inline int rows() const { return m_dec.rows(); } + inline int cols() const { return m_cols; } + + template<typename Dest> inline void evalTo(Dest& dst) const + { + static_cast<const ei_image_impl<DecompositionType, Dest> *> + (this)->evalTo(dst); + } +}; + +#endif // EIGEN_MISC_IMAGE_H diff --git a/Eigen/src/misc/Kernel.h b/Eigen/src/misc/Kernel.h new file mode 100644 index 000000000..bfd75f54b --- /dev/null +++ b/Eigen/src/misc/Kernel.h @@ -0,0 +1,71 @@ +// This file is part of Eigen, a lightweight C++ template library +// for linear algebra. +// +// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1@gmail.com> +// +// Eigen is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3 of the License, or (at your option) any later version. +// +// Alternatively, you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of +// the License, or (at your option) any later version. +// +// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License and a copy of the GNU General Public License along with +// Eigen. If not, see <http://www.gnu.org/licenses/>. + +#ifndef EIGEN_MISC_KERNEL_H +#define EIGEN_MISC_KERNEL_H + +/** \class ei_kernel_return_value + * + */ +template<typename DecompositionType> +struct ei_traits<ei_kernel_return_value<DecompositionType> > +{ + typedef typename DecompositionType::MatrixType MatrixType; + typedef Matrix< + typename MatrixType::Scalar, + MatrixType::ColsAtCompileTime, // the number of rows in the "kernel matrix" + // is the number of cols of the original matrix + // so that the product "matrix * kernel = zero" makes sense + Dynamic, // we don't know at compile-time the dimension of the kernel + MatrixType::Options, + MatrixType::MaxColsAtCompileTime, // see explanation for 2nd template parameter + MatrixType::MaxColsAtCompileTime // the kernel is a subspace of the domain space, + // whose dimension is the number of columns of the original matrix + > ReturnMatrixType; +}; + +template<typename _DecompositionType> struct ei_kernel_return_value + : public ReturnByValue<ei_kernel_return_value<_DecompositionType> > +{ + typedef _DecompositionType DecompositionType; + const DecompositionType& m_dec; + int m_rank, m_cols; + + ei_kernel_return_value(const DecompositionType& dec) + : m_dec(dec), + m_rank(dec.rank()), + m_cols(m_rank==dec.cols() ? 1 : dec.cols() - m_rank) + {} + + inline int rows() const { return m_dec.cols(); } + inline int cols() const { return m_cols; } + + template<typename Dest> inline void evalTo(Dest& dst) const + { + static_cast<const ei_kernel_impl<DecompositionType, Dest> *> + (this)->evalTo(dst); + } +}; + +#endif // EIGEN_MISC_KERNEL_H diff --git a/Eigen/src/misc/Solve.h b/Eigen/src/misc/Solve.h new file mode 100644 index 000000000..c62e34b13 --- /dev/null +++ b/Eigen/src/misc/Solve.h @@ -0,0 +1,65 @@ +// This file is part of Eigen, a lightweight C++ template library +// for linear algebra. +// +// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1@gmail.com> +// +// Eigen is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3 of the License, or (at your option) any later version. +// +// Alternatively, you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of +// the License, or (at your option) any later version. +// +// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License and a copy of the GNU General Public License along with +// Eigen. If not, see <http://www.gnu.org/licenses/>. + +#ifndef EIGEN_MISC_SOLVE_H +#define EIGEN_MISC_SOLVE_H + +/** \class ei_solve_return_value + * + */ +template<typename DecompositionType, typename Rhs> +struct ei_traits<ei_solve_return_value<DecompositionType, Rhs> > +{ + typedef typename DecompositionType::MatrixType MatrixType; + typedef Matrix<typename Rhs::Scalar, + MatrixType::ColsAtCompileTime, + Rhs::ColsAtCompileTime, + Rhs::PlainMatrixType::Options, + MatrixType::MaxColsAtCompileTime, + Rhs::MaxColsAtCompileTime> ReturnMatrixType; +}; + +template<typename _DecompositionType, typename Rhs> struct ei_solve_return_value + : public ReturnByValue<ei_solve_return_value<_DecompositionType, Rhs> > +{ + typedef typename ei_cleantype<typename Rhs::Nested>::type RhsNestedCleaned; + typedef _DecompositionType DecompositionType; + const DecompositionType& m_dec; + const typename Rhs::Nested m_rhs; + + ei_solve_return_value(const DecompositionType& dec, const Rhs& rhs) + : m_dec(dec), m_rhs(rhs) + {} + + inline int rows() const { return m_dec.cols(); } + inline int cols() const { return m_rhs.cols(); } + + template<typename Dest> inline void evalTo(Dest& dst) const + { + static_cast<const ei_solve_impl<DecompositionType, RhsNestedCleaned, Dest> *> + (this)->evalTo(dst); + } +}; + +#endif // EIGEN_MISC_SOLVE_H |