NDEVR
API Documentation
matrix_operations.h
Go to the documentation of this file.
1// g2o - General Graph Optimization
2// Copyright (C) 2011 R. Kuemmerle, G. Grisetti, W. Burgard
3// All rights reserved.
4//
5// Redistribution and use in source and binary forms, with or without
6// modification, are permitted provided that the following conditions are
7// met:
8//
9// * Redistributions of source code must retain the above copyright notice,
10// this list of conditions and the following disclaimer.
11// * Redistributions in binary form must reproduce the above copyright
12// notice, this list of conditions and the following disclaimer in the
13// documentation and/or other materials provided with the distribution.
14//
15// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
16// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
17// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
18// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
19// HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
21// TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
23// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
24// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
27#ifndef G2O_CORE_MATRIX_OPERATIONS_H
28#define G2O_CORE_MATRIX_OPERATIONS_H
29
30#include <Eigen/Core>
31
34namespace NDEVR {
35 namespace internal {
36
44 template<typename MatrixType>
45 inline void axpy(const MatrixType& A, const Eigen::Map<const Eigen::VectorX<g_type>>& x, int xoff, Eigen::Map<Eigen::VectorX<g_type>>& y, int yoff)
46 {
47 y.segment<MatrixType::RowsAtCompileTime>(yoff) += A * x.segment<MatrixType::ColsAtCompileTime>(xoff);
48 }
49
50 template<int t>
51 inline void axpy(const Eigen::Matrix<g_type, Eigen::Dynamic, t>& A, const Eigen::Map<const Eigen::VectorX<g_type>>& x, int xoff, Eigen::Map<Eigen::VectorX<g_type>>& y, int yoff)
52 {
53 y.segment(yoff, A.rows()) += A * x.segment<Eigen::Matrix<g_type, Eigen::Dynamic, t>::ColsAtCompileTime>(xoff);
54 }
55
56 template<>
57 inline void axpy(const Eigen::MatrixX<g_type>& A, const Eigen::Map<const Eigen::VectorX<g_type>>& x, int xoff, Eigen::Map<Eigen::VectorX<g_type>>& y, int yoff)
58 {
59 y.segment(yoff, A.rows()) += A * x.segment(xoff, A.cols());
60 }
61
62 template<typename MatrixType>
63 inline void atxpy(const MatrixType& A, const Eigen::Map<const Eigen::VectorX<g_type>>& x, int xoff, Eigen::Map<Eigen::VectorX<g_type>>& y, int yoff)
64 {
65 y.segment<MatrixType::ColsAtCompileTime>(yoff) += A.transpose() * x.segment<MatrixType::RowsAtCompileTime>(xoff);
66 }
67
68 template<int t>
69 inline void atxpy(const Eigen::Matrix<g_type, Eigen::Dynamic, t>& A, const Eigen::Map<const Eigen::VectorX<g_type>>& x, int xoff, Eigen::Map<Eigen::VectorX<g_type>>& y, int yoff)
70 {
71 y.segment<Eigen::Matrix<g_type, Eigen::Dynamic, t>::ColsAtCompileTime>(yoff) += A.transpose() * x.segment(xoff, A.rows());
72 }
73
74 template<>
75 inline void atxpy(const Eigen::MatrixX<g_type>& A, const Eigen::Map<const Eigen::VectorX<g_type>>& x, int xoff, Eigen::Map<Eigen::VectorX<g_type>>& y, int yoff)
76 {
77 y.segment(yoff, A.cols()) += A.transpose() * x.segment(xoff, A.rows());
78 }
79
80 } // end namespace internal
81} // end namespace NDEVR
82
83#endif
void axpy(const MatrixType &A, const Eigen::Map< const Eigen::VectorX< g_type > > &x, int xoff, Eigen::Map< Eigen::VectorX< g_type > > &y, int yoff)
Computes y[yoff..] += A * x[xoff..] for fixed-size blocks.
The primary namespace for the NDEVR SDK.