Eigen  3.4.90 (git rev 9589cc4e7fd8e4538bedef80dd36c7738977a8be)
 
All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends Modules Pages
Loading...
Searching...
No Matches
SkewSymmetricMatrix3.h
1// This file is part of Eigen, a lightweight C++ template library
2// for linear algebra.
3//
4// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr>
5// Copyright (C) 2007-2009 Benoit Jacob <jacob.benoit.1@gmail.com>
6//
7// This Source Code Form is subject to the terms of the Mozilla
8// Public License v. 2.0. If a copy of the MPL was not distributed
9// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
10
11#ifndef EIGEN_SKEWSYMMETRICMATRIX3_H
12#define EIGEN_SKEWSYMMETRICMATRIX3_H
13
14// IWYU pragma: private
15#include "./InternalHeaderCheck.h"
16
17namespace Eigen {
18
34template <typename Derived>
35class SkewSymmetricBase : public EigenBase<Derived> {
36 public:
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;
42
43 enum {
44 RowsAtCompileTime = SkewSymmetricVectorType::SizeAtCompileTime,
45 ColsAtCompileTime = SkewSymmetricVectorType::SizeAtCompileTime,
46 MaxRowsAtCompileTime = SkewSymmetricVectorType::MaxSizeAtCompileTime,
47 MaxColsAtCompileTime = SkewSymmetricVectorType::MaxSizeAtCompileTime,
48 IsVectorAtCompileTime = 0,
50 };
51
52 typedef Matrix<Scalar, RowsAtCompileTime, ColsAtCompileTime, 0, MaxRowsAtCompileTime, MaxColsAtCompileTime>
53 DenseMatrixType;
54 typedef DenseMatrixType DenseType;
55 typedef SkewSymmetricMatrix3<Scalar> PlainObject;
56
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); }
61
66 EIGEN_DEVICE_FUNC DenseMatrixType toDenseMatrix() const { return derived(); }
67
69 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Scalar determinant() const { return 0; }
70
72 EIGEN_DEVICE_FUNC PlainObject transpose() const { return (-vector()).asSkewSymmetric(); }
73
75 EIGEN_DEVICE_FUNC DenseMatrixType exponential() const {
76 DenseMatrixType retVal = DenseMatrixType::Identity();
77 const SkewSymmetricVectorType& v = vector();
78 if (v.isZero()) {
79 return retVal;
80 }
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();
85 return retVal;
86 }
87
89 EIGEN_DEVICE_FUNC inline const SkewSymmetricVectorType& vector() const { return derived().vector(); }
91 EIGEN_DEVICE_FUNC inline SkewSymmetricVectorType& vector() { return derived().vector(); }
92
94 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index rows() const { return 3; }
96 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index cols() const { return 3; }
97
99 template <typename MatrixDerived>
101 const MatrixBase<MatrixDerived>& matrix) const {
102 return Product<Derived, MatrixDerived, LazyProduct>(derived(), matrix.derived());
103 }
104
106 template <typename MatrixDerived>
111
112 template <typename OtherDerived>
113 using SkewSymmetricProductReturnType = SkewSymmetricWrapper<const EIGEN_CWISE_BINARY_RETURN_TYPE(
114 SkewSymmetricVectorType, typename OtherDerived::SkewSymmetricVectorType, product)>;
115
118 template <typename OtherDerived>
119 EIGEN_DEVICE_FUNC SkewSymmetricProductReturnType<OtherDerived> wedge(
120 const SkewSymmetricBase<OtherDerived>& other) const {
121 return vector().cross(other.vector()).asSkewSymmetric();
122 }
123
124 using SkewSymmetricScaleReturnType =
125 SkewSymmetricWrapper<const EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(SkewSymmetricVectorType, Scalar, product)>;
126
128 EIGEN_DEVICE_FUNC inline SkewSymmetricScaleReturnType operator*(const Scalar& scalar) const {
129 return (vector() * scalar).asSkewSymmetric();
130 }
131
132 using ScaleSkewSymmetricReturnType =
133 SkewSymmetricWrapper<const EIGEN_SCALAR_BINARYOP_EXPR_RETURN_TYPE(Scalar, SkewSymmetricVectorType, product)>;
134
136 EIGEN_DEVICE_FUNC friend inline ScaleSkewSymmetricReturnType operator*(const Scalar& scalar,
137 const SkewSymmetricBase& other) {
138 return (scalar * other.vector()).asSkewSymmetric();
139 }
140
141 template <typename OtherDerived>
142 using SkewSymmetricSumReturnType = SkewSymmetricWrapper<const EIGEN_CWISE_BINARY_RETURN_TYPE(
143 SkewSymmetricVectorType, typename OtherDerived::SkewSymmetricVectorType, sum)>;
144
146 template <typename OtherDerived>
147 EIGEN_DEVICE_FUNC inline SkewSymmetricSumReturnType<OtherDerived> operator+(
148 const SkewSymmetricBase<OtherDerived>& other) const {
149 return (vector() + other.vector()).asSkewSymmetric();
150 }
151
152 template <typename OtherDerived>
153 using SkewSymmetricDifferenceReturnType = SkewSymmetricWrapper<const EIGEN_CWISE_BINARY_RETURN_TYPE(
154 SkewSymmetricVectorType, typename OtherDerived::SkewSymmetricVectorType, difference)>;
155
157 template <typename OtherDerived>
158 EIGEN_DEVICE_FUNC inline SkewSymmetricDifferenceReturnType<OtherDerived> operator-(
159 const SkewSymmetricBase<OtherDerived>& other) const {
160 return (vector() - other.vector()).asSkewSymmetric();
161 }
162};
163
173
174namespace internal {
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;
179 enum { Flags = LvalueBit | NoPreferredStorageOrderBit | NestByRefBit };
180};
181} // namespace internal
182template <typename Scalar_>
183class SkewSymmetricMatrix3 : public SkewSymmetricBase<SkewSymmetricMatrix3<Scalar_>> {
184 public:
185#ifndef EIGEN_PARSED_BY_DOXYGEN
186 typedef typename internal::traits<SkewSymmetricMatrix3>::SkewSymmetricVectorType SkewSymmetricVectorType;
187 typedef const SkewSymmetricMatrix3& Nested;
188 typedef Scalar_ Scalar;
189 typedef typename internal::traits<SkewSymmetricMatrix3>::StorageKind StorageKind;
190 typedef typename internal::traits<SkewSymmetricMatrix3>::StorageIndex StorageIndex;
191#endif
192
193 protected:
194 SkewSymmetricVectorType m_vector;
195
196 public:
198 EIGEN_DEVICE_FUNC inline const SkewSymmetricVectorType& vector() const { return m_vector; }
200 EIGEN_DEVICE_FUNC inline SkewSymmetricVectorType& vector() { return m_vector; }
201
203 EIGEN_DEVICE_FUNC inline SkewSymmetricMatrix3() {}
204
206 EIGEN_DEVICE_FUNC inline SkewSymmetricMatrix3(const Scalar& x, const Scalar& y, const Scalar& z)
207 : m_vector(x, y, z) {}
208
210 EIGEN_DEVICE_FUNC explicit inline SkewSymmetricMatrix3(SkewSymmetricVectorType&& vec) : m_vector(std::move(vec)) {}
211
213 template <typename OtherDerived>
214 EIGEN_DEVICE_FUNC explicit inline SkewSymmetricMatrix3(const MatrixBase<OtherDerived>& other) : m_vector(other) {}
215
217 template <typename OtherDerived>
218 EIGEN_DEVICE_FUNC inline SkewSymmetricMatrix3(const SkewSymmetricBase<OtherDerived>& other)
219 : m_vector(other.vector()) {}
220
221#ifndef EIGEN_PARSED_BY_DOXYGEN
223 inline SkewSymmetricMatrix3(const SkewSymmetricMatrix3& other) : m_vector(other.vector()) {}
224#endif
225
227 template <typename OtherDerived>
229 m_vector = other.vector();
230 return *this;
231 }
232
233#ifndef EIGEN_PARSED_BY_DOXYGEN
237 EIGEN_DEVICE_FUNC SkewSymmetricMatrix3& operator=(const SkewSymmetricMatrix3& other) {
238 m_vector = other.vector();
239 return *this;
240 }
241#endif
242
243 typedef SkewSymmetricWrapper<const CwiseNullaryOp<internal::scalar_constant_op<Scalar>, SkewSymmetricVectorType>>
244 InitializeReturnType;
245
247 EIGEN_DEVICE_FUNC static InitializeReturnType Zero() { return SkewSymmetricVectorType::Zero().asSkewSymmetric(); }
248
250 EIGEN_DEVICE_FUNC inline void setZero() { m_vector.setZero(); }
251};
252
258 * \tparam SkewSymmetricVectorType_ the type of the vector of coefficients
259 *
260 * This class is an expression of a skew symmetric matrix, but not storing its own vector of coefficients,
261 * instead wrapping an existing vector expression. It is the return type of MatrixBase::asSkewSymmetric()
262 * and most of the time this is the only way that it is used.
263 *
264 * \sa class SkewSymmetricMatrix3, class SkewSymmetricBase, MatrixBase::asSkewSymmetric()
265 */
266
267namespace internal {
268template <typename SkewSymmetricVectorType_>
269struct traits<SkewSymmetricWrapper<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;
275 enum {
276 RowsAtCompileTime = SkewSymmetricVectorType::SizeAtCompileTime,
277 ColsAtCompileTime = SkewSymmetricVectorType::SizeAtCompileTime,
278 MaxRowsAtCompileTime = SkewSymmetricVectorType::MaxSizeAtCompileTime,
279 MaxColsAtCompileTime = SkewSymmetricVectorType::MaxSizeAtCompileTime,
280 Flags = (traits<SkewSymmetricVectorType>::Flags & LvalueBit) | NoPreferredStorageOrderBit
281 };
282};
283} // namespace internal
284
285template <typename SkewSymmetricVectorType_>
286class SkewSymmetricWrapper : public SkewSymmetricBase<SkewSymmetricWrapper<SkewSymmetricVectorType_>>,
287 internal::no_assignment_operator {
288 public:
289#ifndef EIGEN_PARSED_BY_DOXYGEN
290 typedef SkewSymmetricVectorType_ SkewSymmetricVectorType;
291 typedef SkewSymmetricWrapper Nested;
292#endif
293
295 EIGEN_DEVICE_FUNC explicit inline SkewSymmetricWrapper(SkewSymmetricVectorType& a_vector) : m_vector(a_vector) {}
296
298 EIGEN_DEVICE_FUNC const SkewSymmetricVectorType& vector() const { return m_vector; }
299
300 protected:
301 typename SkewSymmetricVectorType::Nested m_vector;
302};
303
310template <typename Derived>
314
318template <typename Derived>
319bool MatrixBase<Derived>::isSkewSymmetric(const RealScalar& prec) const {
320 if (cols() != rows()) return false;
321 return (this->transpose() + *this).isZero(prec);
322}
323
326template <typename Derived>
327template <typename SkewDerived>
329 const SkewSymmetricBase<SkewDerived>& skew) const {
330 return Product<Derived, SkewDerived, LazyProduct>(derived(), skew.derived());
331}
332
333namespace internal {
334
335template <>
336struct storage_kind_to_shape<SkewSymmetricShape> {
337 typedef SkewSymmetricShape Shape;
338};
339
340struct SkewSymmetric2Dense {};
341
342template <>
343struct AssignmentKind<DenseShape, SkewSymmetricShape> {
344 typedef SkewSymmetric2Dense Kind;
345};
346
347// SkewSymmetric matrix to Dense assignment
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>& /*func*/) {
353 if ((dst.rows() != 3) || (dst.cols() != 3)) {
354 dst.resize(3, 3);
355 }
356 dst.diagonal().setZero();
357 const typename SrcXprType::SkewSymmetricVectorType v = src.vector();
358 dst(0, 1) = -v(2);
359 dst(1, 0) = v(2);
360 dst(0, 2) = v(1);
361 dst(2, 0) = -v(1);
362 dst(1, 2) = -v(0);
363 dst(2, 1) = v(0);
364 }
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>& /*func*/) {
368 dst.vector() += src.vector();
369 }
370
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>& /*func*/) {
374 dst.vector() -= src.vector();
375 }
376};
377
378} // namespace internal
379
380} // end namespace Eigen
381
382#endif // EIGEN_SKEWSYMMETRICMATRIX3_H
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