$darkmode
Eigen  5.0.1-dev
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 
17 namespace Eigen {
18 
34 template <typename Derived>
35 class 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 
54  typedef DenseMatrixType DenseType;
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 constexpr 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 constexpr Index rows() const { return 3; }
96  EIGEN_DEVICE_FUNC constexpr Index cols() const { return 3; }
97 
99  template <typename MatrixDerived>
101  const MatrixBase<MatrixDerived>& matrix) const {
103  }
104 
106  template <typename MatrixDerived>
108  const SkewSymmetricBase<MatrixDerived>& matrix) const {
110  }
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>
120  const SkewSymmetricBase<OtherDerived>& other) const {
121  return vector().cross(other.vector()).asSkewSymmetric();
122  }
123 
124  using SkewSymmetricScaleReturnType =
126 
128  EIGEN_DEVICE_FUNC inline SkewSymmetricScaleReturnType operator*(const Scalar& scalar) const {
129  return (vector() * scalar).asSkewSymmetric();
130  }
131 
132  using ScaleSkewSymmetricReturnType =
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>
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>
159  const SkewSymmetricBase<OtherDerived>& other) const {
160  return (vector() - other.vector()).asSkewSymmetric();
161  }
162 };
163 
174 namespace internal {
175 template <typename Scalar_>
176 struct 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
182 template <typename Scalar_>
183 class 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
222 
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
234 
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 
267 namespace internal {
268 template <typename SkewSymmetricVectorType_>
269 struct 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 
285 template <typename SkewSymmetricVectorType_>
286 class 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 
310 template <typename Derived>
312  return SkewSymmetricWrapper<const Derived>(derived());
313 }
314 
318 template <typename Derived>
319 bool MatrixBase<Derived>::isSkewSymmetric(const RealScalar& prec) const {
320  if (cols() != rows()) return false;
321  return (this->transpose() + *this).isZero(prec);
322 }
323 
326 template <typename Derived>
327 template <typename SkewDerived>
329  const SkewSymmetricBase<SkewDerived>& skew) const {
330  return Product<Derived, SkewDerived, LazyProduct>(derived(), skew.derived());
331 }
332 
333 namespace internal {
334 
335 template <>
336 struct storage_kind_to_shape<SkewSymmetricShape> {
337  typedef SkewSymmetricShape Shape;
338 };
339 
340 struct SkewSymmetric2Dense {};
341 
342 template <>
343 struct AssignmentKind<DenseShape, SkewSymmetricShape> {
344  typedef SkewSymmetric2Dense Kind;
345 };
346 
347 // SkewSymmetric matrix to Dense assignment
348 template <typename DstXprType, typename SrcXprType, typename Functor>
349 struct 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
constexpr Derived & derived()
Definition: EigenBase.h:49
Expression of the product of two arbitrary matrices or vectors.
Definition: Product.h:198
Product< Derived, MatrixDerived, LazyProduct > operator*(const SkewSymmetricBase< MatrixDerived > &matrix) const
Definition: SkewSymmetricMatrix3.h:107
const SkewSymmetricVectorType & vector() const
Definition: SkewSymmetricMatrix3.h:89
const SkewSymmetricWrapper< const Derived > asSkewSymmetric() const
Definition: SkewSymmetricMatrix3.h:311
void setZero()
Definition: SkewSymmetricMatrix3.h:250
const unsigned int LvalueBit
Definition: Constants.h:148
SkewSymmetricMatrix3()
Definition: SkewSymmetricMatrix3.h:203
SkewSymmetricMatrix3 & operator=(const SkewSymmetricBase< OtherDerived > &other)
Definition: SkewSymmetricMatrix3.h:228
SkewSymmetricMatrix3(SkewSymmetricVectorType &&vec)
Constructs a SkewSymmetricMatrix3 from an r-value vector type.
Definition: SkewSymmetricMatrix3.h:210
SkewSymmetricWrapper(SkewSymmetricVectorType &a_vector)
Definition: SkewSymmetricMatrix3.h:295
Namespace containing all symbols from the Eigen library.
Definition: B01_Experimental.dox:1
Definition: BFloat16.h:231
constexpr Index cols() const
Definition: SkewSymmetricMatrix3.h:96
Eigen::Index Index
The interface type of indices.
Definition: EigenBase.h:43
PlainObject transpose() const
Definition: SkewSymmetricMatrix3.h:72
SkewSymmetricMatrix3(const MatrixBase< OtherDerived > &other)
Definition: SkewSymmetricMatrix3.h:214
Product< Derived, MatrixDerived, LazyProduct > operator*(const MatrixBase< MatrixDerived > &matrix) const
Definition: SkewSymmetricMatrix3.h:100
Definition: EigenBase.h:33
Represents a 3x3 skew symmetric matrix with its storage.
Definition: SkewSymmetricMatrix3.h:183
const Derived & derived() const
Definition: SkewSymmetricMatrix3.h:58
constexpr Index rows() const
Definition: SkewSymmetricMatrix3.h:94
const Product< Derived, OtherDerived > operator*(const MatrixBase< OtherDerived > &other) const
Definition: GeneralProduct.h:455
Derived & derived()
Definition: SkewSymmetricMatrix3.h:60
constexpr Scalar determinant() const
Definition: SkewSymmetricMatrix3.h:69
Base class for skew symmetric matrices and expressions.
Definition: SkewSymmetricMatrix3.h:35
SkewSymmetricProductReturnType< OtherDerived > wedge(const SkewSymmetricBase< OtherDerived > &other) const
Definition: SkewSymmetricMatrix3.h:119
Expression of a skew symmetric matrix.
Definition: SkewSymmetricMatrix3.h:286
SkewSymmetricVectorType & vector()
Definition: SkewSymmetricMatrix3.h:91
static InitializeReturnType Zero()
Definition: SkewSymmetricMatrix3.h:247
SkewSymmetricSumReturnType< OtherDerived > operator+(const SkewSymmetricBase< OtherDerived > &other) const
Definition: SkewSymmetricMatrix3.h:147
DenseMatrixType exponential() const
Definition: SkewSymmetricMatrix3.h:75
SkewSymmetricVectorType & vector()
Definition: SkewSymmetricMatrix3.h:200
DenseMatrixType toDenseMatrix() const
Definition: SkewSymmetricMatrix3.h:66
bool isSkewSymmetric(const RealScalar &prec=NumTraits< Scalar >::dummy_precision()) const
Definition: SkewSymmetricMatrix3.h:319
const SkewSymmetricVectorType & vector() const
Definition: SkewSymmetricMatrix3.h:298
SkewSymmetricScaleReturnType operator*(const Scalar &scalar) const
Definition: SkewSymmetricMatrix3.h:128
The matrix class, also used for vectors and row-vectors.
Definition: Matrix.h:186
const SkewSymmetricVectorType & vector() const
Definition: SkewSymmetricMatrix3.h:198
Base class for all dense matrices, vectors, and expressions.
Definition: MatrixBase.h:52
SkewSymmetricMatrix3(const SkewSymmetricBase< OtherDerived > &other)
Definition: SkewSymmetricMatrix3.h:218
SkewSymmetricDifferenceReturnType< OtherDerived > operator-(const SkewSymmetricBase< OtherDerived > &other) const
Definition: SkewSymmetricMatrix3.h:158
friend ScaleSkewSymmetricReturnType operator*(const Scalar &scalar, const SkewSymmetricBase &other)
Definition: SkewSymmetricMatrix3.h:136
const unsigned int NoPreferredStorageOrderBit
Definition: Constants.h:182
SkewSymmetricMatrix3(const Scalar &x, const Scalar &y, const Scalar &z)
Definition: SkewSymmetricMatrix3.h:206