Eigne Matrix Class Library

Dependents:   Eigen_test Odometry_test AttitudeEstimation_usingTicker MPU9250_Quaternion_Binary_Serial ... more

Eigen Matrix Class Library for mbed.

Finally, you can use Eigen on your mbed!!!

Committer:
ykuroda
Date:
Thu Oct 13 04:07:23 2016 +0000
Revision:
0:13a5d365ba16
First commint, Eigne Matrix Class Library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ykuroda 0:13a5d365ba16 1 // This file is part of Eigen, a lightweight C++ template library
ykuroda 0:13a5d365ba16 2 // for linear algebra.
ykuroda 0:13a5d365ba16 3 //
ykuroda 0:13a5d365ba16 4 // Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>
ykuroda 0:13a5d365ba16 5 //
ykuroda 0:13a5d365ba16 6 // This Source Code Form is subject to the terms of the Mozilla
ykuroda 0:13a5d365ba16 7 // Public License v. 2.0. If a copy of the MPL was not distributed
ykuroda 0:13a5d365ba16 8 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
ykuroda 0:13a5d365ba16 9
ykuroda 0:13a5d365ba16 10 #ifndef EIGEN_SWAP_H
ykuroda 0:13a5d365ba16 11 #define EIGEN_SWAP_H
ykuroda 0:13a5d365ba16 12
ykuroda 0:13a5d365ba16 13 namespace Eigen {
ykuroda 0:13a5d365ba16 14
ykuroda 0:13a5d365ba16 15 /** \class SwapWrapper
ykuroda 0:13a5d365ba16 16 * \ingroup Core_Module
ykuroda 0:13a5d365ba16 17 *
ykuroda 0:13a5d365ba16 18 * \internal
ykuroda 0:13a5d365ba16 19 *
ykuroda 0:13a5d365ba16 20 * \brief Internal helper class for swapping two expressions
ykuroda 0:13a5d365ba16 21 */
ykuroda 0:13a5d365ba16 22 namespace internal {
ykuroda 0:13a5d365ba16 23 template<typename ExpressionType>
ykuroda 0:13a5d365ba16 24 struct traits<SwapWrapper<ExpressionType> > : traits<ExpressionType> {};
ykuroda 0:13a5d365ba16 25 }
ykuroda 0:13a5d365ba16 26
ykuroda 0:13a5d365ba16 27 template<typename ExpressionType> class SwapWrapper
ykuroda 0:13a5d365ba16 28 : public internal::dense_xpr_base<SwapWrapper<ExpressionType> >::type
ykuroda 0:13a5d365ba16 29 {
ykuroda 0:13a5d365ba16 30 public:
ykuroda 0:13a5d365ba16 31
ykuroda 0:13a5d365ba16 32 typedef typename internal::dense_xpr_base<SwapWrapper>::type Base;
ykuroda 0:13a5d365ba16 33 EIGEN_DENSE_PUBLIC_INTERFACE(SwapWrapper)
ykuroda 0:13a5d365ba16 34 typedef typename internal::packet_traits<Scalar>::type Packet;
ykuroda 0:13a5d365ba16 35
ykuroda 0:13a5d365ba16 36 inline SwapWrapper(ExpressionType& xpr) : m_expression(xpr) {}
ykuroda 0:13a5d365ba16 37
ykuroda 0:13a5d365ba16 38 inline Index rows() const { return m_expression.rows(); }
ykuroda 0:13a5d365ba16 39 inline Index cols() const { return m_expression.cols(); }
ykuroda 0:13a5d365ba16 40 inline Index outerStride() const { return m_expression.outerStride(); }
ykuroda 0:13a5d365ba16 41 inline Index innerStride() const { return m_expression.innerStride(); }
ykuroda 0:13a5d365ba16 42
ykuroda 0:13a5d365ba16 43 typedef typename internal::conditional<
ykuroda 0:13a5d365ba16 44 internal::is_lvalue<ExpressionType>::value,
ykuroda 0:13a5d365ba16 45 Scalar,
ykuroda 0:13a5d365ba16 46 const Scalar
ykuroda 0:13a5d365ba16 47 >::type ScalarWithConstIfNotLvalue;
ykuroda 0:13a5d365ba16 48
ykuroda 0:13a5d365ba16 49 inline ScalarWithConstIfNotLvalue* data() { return m_expression.data(); }
ykuroda 0:13a5d365ba16 50 inline const Scalar* data() const { return m_expression.data(); }
ykuroda 0:13a5d365ba16 51
ykuroda 0:13a5d365ba16 52 inline Scalar& coeffRef(Index rowId, Index colId)
ykuroda 0:13a5d365ba16 53 {
ykuroda 0:13a5d365ba16 54 return m_expression.const_cast_derived().coeffRef(rowId, colId);
ykuroda 0:13a5d365ba16 55 }
ykuroda 0:13a5d365ba16 56
ykuroda 0:13a5d365ba16 57 inline Scalar& coeffRef(Index index)
ykuroda 0:13a5d365ba16 58 {
ykuroda 0:13a5d365ba16 59 return m_expression.const_cast_derived().coeffRef(index);
ykuroda 0:13a5d365ba16 60 }
ykuroda 0:13a5d365ba16 61
ykuroda 0:13a5d365ba16 62 inline Scalar& coeffRef(Index rowId, Index colId) const
ykuroda 0:13a5d365ba16 63 {
ykuroda 0:13a5d365ba16 64 return m_expression.coeffRef(rowId, colId);
ykuroda 0:13a5d365ba16 65 }
ykuroda 0:13a5d365ba16 66
ykuroda 0:13a5d365ba16 67 inline Scalar& coeffRef(Index index) const
ykuroda 0:13a5d365ba16 68 {
ykuroda 0:13a5d365ba16 69 return m_expression.coeffRef(index);
ykuroda 0:13a5d365ba16 70 }
ykuroda 0:13a5d365ba16 71
ykuroda 0:13a5d365ba16 72 template<typename OtherDerived>
ykuroda 0:13a5d365ba16 73 void copyCoeff(Index rowId, Index colId, const DenseBase<OtherDerived>& other)
ykuroda 0:13a5d365ba16 74 {
ykuroda 0:13a5d365ba16 75 OtherDerived& _other = other.const_cast_derived();
ykuroda 0:13a5d365ba16 76 eigen_internal_assert(rowId >= 0 && rowId < rows()
ykuroda 0:13a5d365ba16 77 && colId >= 0 && colId < cols());
ykuroda 0:13a5d365ba16 78 Scalar tmp = m_expression.coeff(rowId, colId);
ykuroda 0:13a5d365ba16 79 m_expression.coeffRef(rowId, colId) = _other.coeff(rowId, colId);
ykuroda 0:13a5d365ba16 80 _other.coeffRef(rowId, colId) = tmp;
ykuroda 0:13a5d365ba16 81 }
ykuroda 0:13a5d365ba16 82
ykuroda 0:13a5d365ba16 83 template<typename OtherDerived>
ykuroda 0:13a5d365ba16 84 void copyCoeff(Index index, const DenseBase<OtherDerived>& other)
ykuroda 0:13a5d365ba16 85 {
ykuroda 0:13a5d365ba16 86 OtherDerived& _other = other.const_cast_derived();
ykuroda 0:13a5d365ba16 87 eigen_internal_assert(index >= 0 && index < m_expression.size());
ykuroda 0:13a5d365ba16 88 Scalar tmp = m_expression.coeff(index);
ykuroda 0:13a5d365ba16 89 m_expression.coeffRef(index) = _other.coeff(index);
ykuroda 0:13a5d365ba16 90 _other.coeffRef(index) = tmp;
ykuroda 0:13a5d365ba16 91 }
ykuroda 0:13a5d365ba16 92
ykuroda 0:13a5d365ba16 93 template<typename OtherDerived, int StoreMode, int LoadMode>
ykuroda 0:13a5d365ba16 94 void copyPacket(Index rowId, Index colId, const DenseBase<OtherDerived>& other)
ykuroda 0:13a5d365ba16 95 {
ykuroda 0:13a5d365ba16 96 OtherDerived& _other = other.const_cast_derived();
ykuroda 0:13a5d365ba16 97 eigen_internal_assert(rowId >= 0 && rowId < rows()
ykuroda 0:13a5d365ba16 98 && colId >= 0 && colId < cols());
ykuroda 0:13a5d365ba16 99 Packet tmp = m_expression.template packet<StoreMode>(rowId, colId);
ykuroda 0:13a5d365ba16 100 m_expression.template writePacket<StoreMode>(rowId, colId,
ykuroda 0:13a5d365ba16 101 _other.template packet<LoadMode>(rowId, colId)
ykuroda 0:13a5d365ba16 102 );
ykuroda 0:13a5d365ba16 103 _other.template writePacket<LoadMode>(rowId, colId, tmp);
ykuroda 0:13a5d365ba16 104 }
ykuroda 0:13a5d365ba16 105
ykuroda 0:13a5d365ba16 106 template<typename OtherDerived, int StoreMode, int LoadMode>
ykuroda 0:13a5d365ba16 107 void copyPacket(Index index, const DenseBase<OtherDerived>& other)
ykuroda 0:13a5d365ba16 108 {
ykuroda 0:13a5d365ba16 109 OtherDerived& _other = other.const_cast_derived();
ykuroda 0:13a5d365ba16 110 eigen_internal_assert(index >= 0 && index < m_expression.size());
ykuroda 0:13a5d365ba16 111 Packet tmp = m_expression.template packet<StoreMode>(index);
ykuroda 0:13a5d365ba16 112 m_expression.template writePacket<StoreMode>(index,
ykuroda 0:13a5d365ba16 113 _other.template packet<LoadMode>(index)
ykuroda 0:13a5d365ba16 114 );
ykuroda 0:13a5d365ba16 115 _other.template writePacket<LoadMode>(index, tmp);
ykuroda 0:13a5d365ba16 116 }
ykuroda 0:13a5d365ba16 117
ykuroda 0:13a5d365ba16 118 ExpressionType& expression() const { return m_expression; }
ykuroda 0:13a5d365ba16 119
ykuroda 0:13a5d365ba16 120 protected:
ykuroda 0:13a5d365ba16 121 ExpressionType& m_expression;
ykuroda 0:13a5d365ba16 122 };
ykuroda 0:13a5d365ba16 123
ykuroda 0:13a5d365ba16 124 } // end namespace Eigen
ykuroda 0:13a5d365ba16 125
ykuroda 0:13a5d365ba16 126 #endif // EIGEN_SWAP_H