aboutsummaryrefslogtreecommitdiffhomepage
path: root/Eigen/src/misc/Kernel.h
diff options
context:
space:
mode:
authorGravatar Benoit Jacob <jacob.benoit.1@gmail.com>2009-11-03 02:18:10 -0500
committerGravatar Benoit Jacob <jacob.benoit.1@gmail.com>2009-11-03 02:18:10 -0500
commitda363d997f1721ceaefcd946fb14e793074f88b9 (patch)
tree4ccc83796b09c4583a908526d926616056eab70d /Eigen/src/misc/Kernel.h
parentf975b9bd3eb0a862efef290a63a3d1d20a03c099 (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/Kernel.h')
-rw-r--r--Eigen/src/misc/Kernel.h71
1 files changed, 71 insertions, 0 deletions
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