11#ifndef EIGEN_SKEWSYMMETRICMATRIX3_H
12#define EIGEN_SKEWSYMMETRICMATRIX3_H
15#include "./InternalHeaderCheck.h"
34template <
typename Derived>
37 typedef typename internal::traits<Derived>::SkewSymmetricVectorType SkewSymmetricVectorType;
38 typedef typename SkewSymmetricVectorType::Scalar Scalar;
39 typedef typename SkewSymmetricVectorType::RealScalar RealScalar;
40 typedef typename internal::traits<Derived>::StorageKind StorageKind;
41 typedef typename internal::traits<Derived>::StorageIndex StorageIndex;
44 RowsAtCompileTime = SkewSymmetricVectorType::SizeAtCompileTime,
45 ColsAtCompileTime = SkewSymmetricVectorType::SizeAtCompileTime,
46 MaxRowsAtCompileTime = SkewSymmetricVectorType::MaxSizeAtCompileTime,
47 MaxColsAtCompileTime = SkewSymmetricVectorType::MaxSizeAtCompileTime,
48 IsVectorAtCompileTime = 0,
52 typedef Matrix<Scalar, RowsAtCompileTime, ColsAtCompileTime, 0, MaxRowsAtCompileTime, MaxColsAtCompileTime>
54 typedef DenseMatrixType DenseType;
55 typedef SkewSymmetricMatrix3<Scalar> PlainObject;
58 EIGEN_DEVICE_FUNC
inline const Derived&
derived()
const {
return *
static_cast<const Derived*
>(
this); }
60 EIGEN_DEVICE_FUNC
inline Derived&
derived() {
return *
static_cast<Derived*
>(
this); }
69 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
inline Scalar
determinant()
const {
return 0; }
72 EIGEN_DEVICE_FUNC PlainObject
transpose()
const {
return (-
vector()).asSkewSymmetric(); }
76 DenseMatrixType retVal = DenseMatrixType::Identity();
77 const SkewSymmetricVectorType& v =
vector();
81 const Scalar norm2 = v.squaredNorm();
82 const Scalar norm = numext::sqrt(norm2);
83 retVal += ((((1 - numext::cos(norm)) / norm2) *
derived()) *
derived()) +
84 (numext::sin(norm) / norm) *
derived().toDenseMatrix();
89 EIGEN_DEVICE_FUNC
inline const SkewSymmetricVectorType&
vector()
const {
return derived().vector(); }
91 EIGEN_DEVICE_FUNC
inline SkewSymmetricVectorType&
vector() {
return derived().vector(); }
94 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
inline Index rows()
const {
return 3; }
96 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
inline Index cols()
const {
return 3; }
99 template <
typename MatrixDerived>
106 template <
typename MatrixDerived>
112 template <
typename OtherDerived>
113 using SkewSymmetricProductReturnType =
SkewSymmetricWrapper<
const EIGEN_CWISE_BINARY_RETURN_TYPE(
114 SkewSymmetricVectorType,
typename OtherDerived::SkewSymmetricVectorType, product)>;
118 template <
typename OtherDerived>
119 EIGEN_DEVICE_FUNC SkewSymmetricProductReturnType<OtherDerived>
wedge(
121 return vector().cross(other.vector()).asSkewSymmetric();
119 EIGEN_DEVICE_FUNC SkewSymmetricProductReturnType<OtherDerived>
wedge( {
…}
124 using SkewSymmetricScaleReturnType =
128 EIGEN_DEVICE_FUNC
inline SkewSymmetricScaleReturnType
operator*(
const Scalar& scalar)
const {
129 return (
vector() * scalar).asSkewSymmetric();
128 EIGEN_DEVICE_FUNC
inline SkewSymmetricScaleReturnType
operator*(
const Scalar& scalar)
const {
…}
132 using ScaleSkewSymmetricReturnType =
136 EIGEN_DEVICE_FUNC
friend inline ScaleSkewSymmetricReturnType
operator*(
const Scalar& scalar,
138 return (scalar * other.vector()).asSkewSymmetric();
136 EIGEN_DEVICE_FUNC
friend inline ScaleSkewSymmetricReturnType
operator*(
const Scalar& scalar, {
…}
141 template <
typename OtherDerived>
143 SkewSymmetricVectorType,
typename OtherDerived::SkewSymmetricVectorType, sum)>;
146 template <
typename OtherDerived>
147 EIGEN_DEVICE_FUNC
inline SkewSymmetricSumReturnType<OtherDerived>
operator+(
149 return (
vector() + other.vector()).asSkewSymmetric();
147 EIGEN_DEVICE_FUNC
inline SkewSymmetricSumReturnType<OtherDerived>
operator+( {
…}
152 template <
typename OtherDerived>
153 using SkewSymmetricDifferenceReturnType =
SkewSymmetricWrapper<
const EIGEN_CWISE_BINARY_RETURN_TYPE(
154 SkewSymmetricVectorType,
typename OtherDerived::SkewSymmetricVectorType, difference)>;
157 template <
typename OtherDerived>
158 EIGEN_DEVICE_FUNC
inline SkewSymmetricDifferenceReturnType<OtherDerived>
operator-(
160 return (
vector() - other.vector()).asSkewSymmetric();
158 EIGEN_DEVICE_FUNC
inline SkewSymmetricDifferenceReturnType<OtherDerived>
operator-( {
…}
175template <
typename Scalar_>
176struct traits<SkewSymmetricMatrix3<Scalar_>> : traits<Matrix<Scalar_, 3, 3, 0, 3, 3>> {
177 typedef Matrix<Scalar_, 3, 1, 0, 3, 1> SkewSymmetricVectorType;
178 typedef SkewSymmetricShape StorageKind;
182template <
typename Scalar_>
185#ifndef EIGEN_PARSED_BY_DOXYGEN
186 typedef typename internal::traits<SkewSymmetricMatrix3>::SkewSymmetricVectorType SkewSymmetricVectorType;
188 typedef Scalar_ Scalar;
189 typedef typename internal::traits<SkewSymmetricMatrix3>::StorageKind StorageKind;
190 typedef typename internal::traits<SkewSymmetricMatrix3>::StorageIndex StorageIndex;
194 SkewSymmetricVectorType m_vector;
198 EIGEN_DEVICE_FUNC
inline const SkewSymmetricVectorType&
vector()
const {
return m_vector; }
200 EIGEN_DEVICE_FUNC
inline SkewSymmetricVectorType&
vector() {
return m_vector; }
207 : m_vector(x, y, z) {}
210 EIGEN_DEVICE_FUNC
explicit inline SkewSymmetricMatrix3(SkewSymmetricVectorType&& vec) : m_vector(std::move(vec)) {}
213 template <
typename OtherDerived>
217 template <
typename OtherDerived>
219 : m_vector(other.
vector()) {}
221#ifndef EIGEN_PARSED_BY_DOXYGEN
227 template <
typename OtherDerived>
229 m_vector = other.vector();
233#ifndef EIGEN_PARSED_BY_DOXYGEN
238 m_vector = other.vector();
243 typedef SkewSymmetricWrapper<const CwiseNullaryOp<internal::scalar_constant_op<Scalar>, SkewSymmetricVectorType>>
244 InitializeReturnType;
247 EIGEN_DEVICE_FUNC
static InitializeReturnType
Zero() {
return SkewSymmetricVectorType::Zero().asSkewSymmetric(); }
250 EIGEN_DEVICE_FUNC
inline void setZero() { m_vector.setZero(); }
268template <
typename SkewSymmetricVectorType_>
270 typedef SkewSymmetricVectorType_ SkewSymmetricVectorType;
271 typedef typename SkewSymmetricVectorType::Scalar
Scalar;
272 typedef typename SkewSymmetricVectorType::StorageIndex
StorageIndex;
273 typedef SkewSymmetricShape StorageKind;
274 typedef typename traits<SkewSymmetricVectorType>::XprKind XprKind;
285template <
typename SkewSymmetricVectorType_>
287 internal::no_assignment_operator {
289#ifndef EIGEN_PARSED_BY_DOXYGEN
290 typedef SkewSymmetricVectorType_ SkewSymmetricVectorType;
295 EIGEN_DEVICE_FUNC
explicit inline SkewSymmetricWrapper(SkewSymmetricVectorType& a_vector) : m_vector(a_vector) {}
298 EIGEN_DEVICE_FUNC
const SkewSymmetricVectorType&
vector()
const {
return m_vector; }
301 typename SkewSymmetricVectorType::Nested m_vector;
310template <
typename Derived>
318template <
typename Derived>
320 if (cols() != rows())
return false;
321 return (this->
transpose() + *
this).isZero(prec);
270 typedef SkewSymmetricVectorType_ SkewSymmetricVectorType; {
…}
326template <
typename Derived>
327template <
typename SkewDerived>
336struct storage_kind_to_shape<SkewSymmetricShape> {
337 typedef SkewSymmetricShape Shape;
340struct SkewSymmetric2Dense {};
343struct AssignmentKind<DenseShape, SkewSymmetricShape> {
344 typedef SkewSymmetric2Dense Kind;
348template <
typename DstXprType,
typename SrcXprType,
typename Functor>
349struct Assignment<DstXprType, SrcXprType, Functor, SkewSymmetric2Dense> {
350 EIGEN_DEVICE_FUNC
static void run(
351 DstXprType& dst,
const SrcXprType& src,
352 const internal::assign_op<typename DstXprType::Scalar, typename SrcXprType::Scalar>& ) {
353 if ((dst.rows() != 3) || (dst.cols() != 3)) {
356 dst.diagonal().setZero();
357 const typename SrcXprType::SkewSymmetricVectorType v = src.vector();
365 EIGEN_DEVICE_FUNC
static void run(
366 DstXprType& dst,
const SrcXprType& src,
367 const internal::add_assign_op<typename DstXprType::Scalar, typename SrcXprType::Scalar>& ) {
368 dst.vector() += src.vector();
371 EIGEN_DEVICE_FUNC
static void run(
372 DstXprType& dst,
const SrcXprType& src,
373 const internal::sub_assign_op<typename DstXprType::Scalar, typename SrcXprType::Scalar>& ) {
374 dst.vector() -= src.vector();
internal::traits< Derived >::StorageIndex StorageIndex
The type used to store indices.
Definition DenseBase.h:59
TransposeReturnType transpose()
Definition Transpose.h:162
internal::traits< Derived >::Scalar Scalar
Definition DenseBase.h:62
@ Flags
Definition DenseBase.h:161
@ ColsAtCompileTime
Definition DenseBase.h:102
@ MaxColsAtCompileTime
Definition DenseBase.h:124
@ MaxRowsAtCompileTime
Definition DenseBase.h:113
@ RowsAtCompileTime
Definition DenseBase.h:96
Base class for all dense matrices, vectors, and expressions.
Definition ForwardDeclarations.h:73
const SkewSymmetricWrapper< const Derived > asSkewSymmetric() const
Definition SkewSymmetricMatrix3.h:311
bool isSkewSymmetric(const RealScalar &prec=NumTraits< Scalar >::dummy_precision()) const
Definition SkewSymmetricMatrix3.h:319
const Product< Derived, OtherDerived > operator*(const MatrixBase< OtherDerived > &other) const
Definition GeneralProduct.h:455
Expression of the product of two arbitrary matrices or vectors.
Definition ForwardDeclarations.h:117
Base class for skew symmetric matrices and expressions.
Definition ForwardDeclarations.h:130
const SkewSymmetricVectorType & vector() const
Definition SkewSymmetricMatrix3.h:89
const Derived & derived() const
Definition SkewSymmetricMatrix3.h:58
SkewSymmetricDifferenceReturnType< OtherDerived > operator-(const SkewSymmetricBase< OtherDerived > &other) const
Definition SkewSymmetricMatrix3.h:158
DenseMatrixType toDenseMatrix() const
Definition SkewSymmetricMatrix3.h:66
SkewSymmetricScaleReturnType operator*(const Scalar &scalar) const
Definition SkewSymmetricMatrix3.h:128
Product< Derived, MatrixDerived, LazyProduct > operator*(const SkewSymmetricBase< MatrixDerived > &matrix) const
Definition SkewSymmetricMatrix3.h:107
EIGEN_CONSTEXPR Index cols() const
Definition SkewSymmetricMatrix3.h:96
SkewSymmetricVectorType & vector()
Definition SkewSymmetricMatrix3.h:91
SkewSymmetricSumReturnType< OtherDerived > operator+(const SkewSymmetricBase< OtherDerived > &other) const
Definition SkewSymmetricMatrix3.h:147
Product< Derived, MatrixDerived, LazyProduct > operator*(const MatrixBase< MatrixDerived > &matrix) const
Definition SkewSymmetricMatrix3.h:100
SkewSymmetricProductReturnType< OtherDerived > wedge(const SkewSymmetricBase< OtherDerived > &other) const
Definition SkewSymmetricMatrix3.h:119
EIGEN_CONSTEXPR Index rows() const
Definition SkewSymmetricMatrix3.h:94
DenseMatrixType exponential() const
Definition SkewSymmetricMatrix3.h:75
Derived & derived()
Definition SkewSymmetricMatrix3.h:60
friend ScaleSkewSymmetricReturnType operator*(const Scalar &scalar, const SkewSymmetricBase &other)
Definition SkewSymmetricMatrix3.h:136
EIGEN_CONSTEXPR Scalar determinant() const
Definition SkewSymmetricMatrix3.h:69
PlainObject transpose() const
Definition SkewSymmetricMatrix3.h:72
Represents a 3x3 skew symmetric matrix with its storage.
Definition ForwardDeclarations.h:134
SkewSymmetricMatrix3(SkewSymmetricVectorType &&vec)
Constructs a SkewSymmetricMatrix3 from an r-value vector type.
Definition SkewSymmetricMatrix3.h:210
SkewSymmetricMatrix3 & operator=(const SkewSymmetricBase< OtherDerived > &other)
Definition SkewSymmetricMatrix3.h:228
SkewSymmetricMatrix3()
Definition SkewSymmetricMatrix3.h:203
SkewSymmetricVectorType & vector()
Definition SkewSymmetricMatrix3.h:200
SkewSymmetricMatrix3(const Scalar &x, const Scalar &y, const Scalar &z)
Definition SkewSymmetricMatrix3.h:206
void setZero()
Definition SkewSymmetricMatrix3.h:250
const SkewSymmetricVectorType & vector() const
Definition SkewSymmetricMatrix3.h:198
static InitializeReturnType Zero()
Definition SkewSymmetricMatrix3.h:247
SkewSymmetricMatrix3(const MatrixBase< OtherDerived > &other)
Definition SkewSymmetricMatrix3.h:214
SkewSymmetricMatrix3(const SkewSymmetricBase< OtherDerived > &other)
Definition SkewSymmetricMatrix3.h:218
Expression of a skew symmetric matrix.
Definition ForwardDeclarations.h:132
const SkewSymmetricVectorType & vector() const
Definition SkewSymmetricMatrix3.h:298
SkewSymmetricWrapper(SkewSymmetricVectorType &a_vector)
Definition SkewSymmetricMatrix3.h:295
const unsigned int NoPreferredStorageOrderBit
Definition Constants.h:182
const unsigned int LvalueBit
Definition Constants.h:148
Namespace containing all symbols from the Eigen library.
Definition B01_Experimental.dox:1
Definition ForwardDeclarations.h:57
Eigen::Index Index
The interface type of indices.
Definition EigenBase.h:43