Eigen  5.0.1
 
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// SPDX-License-Identifier: MPL-2.0
11
12#ifndef EIGEN_SKEWSYMMETRICMATRIX3_H
13#define EIGEN_SKEWSYMMETRICMATRIX3_H
14
15// IWYU pragma: private
16#include "./InternalHeaderCheck.h"
17
18namespace Eigen {
19
35template <typename Derived>
36class SkewSymmetricBase : public EigenBase<Derived> {
37 public:
38 using SkewSymmetricVectorType = typename internal::traits<Derived>::SkewSymmetricVectorType;
39 using Scalar = typename SkewSymmetricVectorType::Scalar;
40 using RealScalar = typename SkewSymmetricVectorType::RealScalar;
41 using StorageKind = typename internal::traits<Derived>::StorageKind;
42 using StorageIndex = typename internal::traits<Derived>::StorageIndex;
43
44 enum {
45 RowsAtCompileTime = SkewSymmetricVectorType::SizeAtCompileTime,
46 ColsAtCompileTime = SkewSymmetricVectorType::SizeAtCompileTime,
47 MaxRowsAtCompileTime = SkewSymmetricVectorType::MaxSizeAtCompileTime,
48 MaxColsAtCompileTime = SkewSymmetricVectorType::MaxSizeAtCompileTime,
49 IsVectorAtCompileTime = 0,
51 };
52
53 using DenseMatrixType =
55 using DenseType = DenseMatrixType;
56 using PlainObject = SkewSymmetricMatrix3<Scalar>;
57
59 EIGEN_DEVICE_FUNC inline const Derived& derived() const { return *static_cast<const Derived*>(this); }
61 EIGEN_DEVICE_FUNC inline Derived& derived() { return *static_cast<Derived*>(this); }
62
67 EIGEN_DEVICE_FUNC DenseMatrixType toDenseMatrix() const { return derived(); }
68
70 EIGEN_DEVICE_FUNC constexpr Scalar determinant() const { return 0; }
71
73 EIGEN_DEVICE_FUNC PlainObject transpose() const { return (-vector()).asSkewSymmetric(); }
74
76 EIGEN_DEVICE_FUNC DenseMatrixType exponential() const {
77 DenseMatrixType retVal = DenseMatrixType::Identity();
78 const SkewSymmetricVectorType& v = vector();
79 if (v.isZero()) {
80 return retVal;
81 }
82 const Scalar norm2 = v.squaredNorm();
83 const Scalar norm = numext::sqrt(norm2);
84 retVal += ((((1 - numext::cos(norm)) / norm2) * derived()) * derived()) +
85 (numext::sin(norm) / norm) * derived().toDenseMatrix();
86 return retVal;
87 }
88
90 EIGEN_DEVICE_FUNC inline const SkewSymmetricVectorType& vector() const { return derived().vector(); }
92 EIGEN_DEVICE_FUNC inline SkewSymmetricVectorType& vector() { return derived().vector(); }
93
95 EIGEN_DEVICE_FUNC constexpr Index rows() const { return 3; }
97 EIGEN_DEVICE_FUNC constexpr Index cols() const { return 3; }
98
100 template <typename MatrixDerived>
102 const MatrixBase<MatrixDerived>& matrix) const {
103 return Product<Derived, MatrixDerived, LazyProduct>(derived(), matrix.derived());
104 }
105
107 template <typename MatrixDerived>
112
114 template <typename DiagonalDerived>
119
121 template <typename DiagonalDerived>
126
127 template <typename OtherDerived>
128 using SkewSymmetricProductReturnType = SkewSymmetricWrapper<const EIGEN_CWISE_BINARY_RETURN_TYPE(
129 SkewSymmetricVectorType, typename OtherDerived::SkewSymmetricVectorType, internal::scalar_product_op)>;
130
133 template <typename OtherDerived>
134 EIGEN_DEVICE_FUNC SkewSymmetricProductReturnType<OtherDerived> wedge(
135 const SkewSymmetricBase<OtherDerived>& other) const {
136 return vector().cross(other.vector()).asSkewSymmetric();
137 }
138
139 using SkewSymmetricScaleReturnType = SkewSymmetricWrapper<const EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(
140 SkewSymmetricVectorType, Scalar, internal::scalar_product_op)>;
141
143 EIGEN_DEVICE_FUNC inline SkewSymmetricScaleReturnType operator*(const Scalar& scalar) const {
144 return (vector() * scalar).asSkewSymmetric();
145 }
146
147 using ScaleSkewSymmetricReturnType = SkewSymmetricWrapper<const EIGEN_SCALAR_BINARYOP_EXPR_RETURN_TYPE(
148 Scalar, SkewSymmetricVectorType, internal::scalar_product_op)>;
149
151 EIGEN_DEVICE_FUNC friend inline ScaleSkewSymmetricReturnType operator*(const Scalar& scalar,
152 const SkewSymmetricBase& other) {
153 return (scalar * other.vector()).asSkewSymmetric();
154 }
155
156 template <typename OtherDerived>
157 using SkewSymmetricSumReturnType = SkewSymmetricWrapper<const EIGEN_CWISE_BINARY_RETURN_TYPE(
158 SkewSymmetricVectorType, typename OtherDerived::SkewSymmetricVectorType, internal::scalar_sum_op)>;
159
161 template <typename OtherDerived>
162 EIGEN_DEVICE_FUNC inline SkewSymmetricSumReturnType<OtherDerived> operator+(
163 const SkewSymmetricBase<OtherDerived>& other) const {
164 return (vector() + other.vector()).asSkewSymmetric();
165 }
166
167 template <typename OtherDerived>
168 using SkewSymmetricDifferenceReturnType = SkewSymmetricWrapper<const EIGEN_CWISE_BINARY_RETURN_TYPE(
169 SkewSymmetricVectorType, typename OtherDerived::SkewSymmetricVectorType, internal::scalar_difference_op)>;
170
172 template <typename OtherDerived>
173 EIGEN_DEVICE_FUNC inline SkewSymmetricDifferenceReturnType<OtherDerived> operator-(
174 const SkewSymmetricBase<OtherDerived>& other) const {
175 return (vector() - other.vector()).asSkewSymmetric();
176 }
177
178 // Return type of dense +/- skew. Scalar follows ScalarBinaryOpTraits, so
179 // mixed-scalar cases go through the same promotion machinery as the rest of
180 // Eigen (and are rejected at compile time unless a user-provided
181 // specialization makes them valid). Shape is always 3x3.
182 template <typename OtherDerived, typename BinaryOp>
183 using DenseSkewBinaryReturnType = Matrix<
185 3>;
186
187 template <typename OtherDerived>
188 using DenseSkewSumReturnType =
189 DenseSkewBinaryReturnType<OtherDerived,
190 internal::scalar_sum_op<typename internal::traits<OtherDerived>::Scalar, Scalar>>;
191
192 template <typename OtherDerived>
193 using DenseSkewDifferenceReturnType = DenseSkewBinaryReturnType<
194 OtherDerived, internal::scalar_difference_op<typename internal::traits<OtherDerived>::Scalar, Scalar>>;
195
201 template <typename OtherDerived>
202 EIGEN_DEVICE_FUNC friend EIGEN_STRONG_INLINE DenseSkewSumReturnType<OtherDerived> operator+(
203 const MatrixBase<OtherDerived>& lhs, const SkewSymmetricBase& rhs) {
204 EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(OtherDerived, DenseMatrixType);
205 return lhs.derived() + rhs.toDenseMatrix();
206 }
207
211 template <typename OtherDerived>
212 EIGEN_DEVICE_FUNC friend EIGEN_STRONG_INLINE DenseSkewSumReturnType<OtherDerived> operator+(
213 const SkewSymmetricBase& lhs, const MatrixBase<OtherDerived>& rhs) {
214 return rhs + lhs;
215 }
216
218 template <typename OtherDerived>
219 EIGEN_DEVICE_FUNC friend EIGEN_STRONG_INLINE DenseSkewDifferenceReturnType<OtherDerived> operator-(
220 const MatrixBase<OtherDerived>& lhs, const SkewSymmetricBase& rhs) {
221 EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(OtherDerived, DenseMatrixType);
222 return lhs.derived() - rhs.toDenseMatrix();
223 }
224
226 template <typename OtherDerived>
227 EIGEN_DEVICE_FUNC friend EIGEN_STRONG_INLINE DenseSkewDifferenceReturnType<OtherDerived> operator-(
228 const SkewSymmetricBase& lhs, const MatrixBase<OtherDerived>& rhs) {
229 EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(OtherDerived, DenseMatrixType);
230 return lhs.toDenseMatrix() - rhs.derived();
231 }
232};
233
243
244namespace internal {
245template <typename Scalar_>
246struct traits<SkewSymmetricMatrix3<Scalar_>> : traits<Matrix<Scalar_, 3, 3, 0, 3, 3>> {
247 using SkewSymmetricVectorType = Matrix<Scalar_, 3, 1, 0, 3, 1>;
248 using StorageKind = SkewSymmetricShape;
249 enum { Flags = LvalueBit | NoPreferredStorageOrderBit | NestByRefBit };
250};
251} // namespace internal
252template <typename Scalar_>
253class SkewSymmetricMatrix3 : public SkewSymmetricBase<SkewSymmetricMatrix3<Scalar_>> {
254 public:
255#ifndef EIGEN_PARSED_BY_DOXYGEN
256 using SkewSymmetricVectorType = typename internal::traits<SkewSymmetricMatrix3>::SkewSymmetricVectorType;
257 using Nested = const SkewSymmetricMatrix3&;
258 using Scalar = Scalar_;
259 using StorageKind = typename internal::traits<SkewSymmetricMatrix3>::StorageKind;
260 using StorageIndex = typename internal::traits<SkewSymmetricMatrix3>::StorageIndex;
261#endif
262
263 protected:
264 SkewSymmetricVectorType m_vector;
265
266 public:
268 EIGEN_DEVICE_FUNC inline const SkewSymmetricVectorType& vector() const { return m_vector; }
270 EIGEN_DEVICE_FUNC inline SkewSymmetricVectorType& vector() { return m_vector; }
271
273 EIGEN_DEVICE_FUNC inline SkewSymmetricMatrix3() {}
274
276 EIGEN_DEVICE_FUNC inline SkewSymmetricMatrix3(const Scalar& x, const Scalar& y, const Scalar& z)
277 : m_vector(x, y, z) {}
278
280 EIGEN_DEVICE_FUNC explicit inline SkewSymmetricMatrix3(SkewSymmetricVectorType&& vec) : m_vector(std::move(vec)) {}
281
283 template <typename OtherDerived>
284 EIGEN_DEVICE_FUNC explicit inline SkewSymmetricMatrix3(const MatrixBase<OtherDerived>& other) : m_vector(other) {}
285
287 template <typename OtherDerived>
288 EIGEN_DEVICE_FUNC inline SkewSymmetricMatrix3(const SkewSymmetricBase<OtherDerived>& other)
289 : m_vector(other.vector()) {}
290
291#ifndef EIGEN_PARSED_BY_DOXYGEN
293 inline SkewSymmetricMatrix3(const SkewSymmetricMatrix3& other) : m_vector(other.vector()) {}
294#endif
295
297 template <typename OtherDerived>
299 m_vector = other.vector();
300 return *this;
301 }
302
303#ifndef EIGEN_PARSED_BY_DOXYGEN
307 EIGEN_DEVICE_FUNC SkewSymmetricMatrix3& operator=(const SkewSymmetricMatrix3& other) {
308 m_vector = other.vector();
309 return *this;
310 }
311#endif
312
313 using InitializeReturnType =
314 SkewSymmetricWrapper<const CwiseNullaryOp<internal::scalar_constant_op<Scalar>, SkewSymmetricVectorType>>;
315
317 EIGEN_DEVICE_FUNC static InitializeReturnType Zero() { return SkewSymmetricVectorType::Zero().asSkewSymmetric(); }
318
320 EIGEN_DEVICE_FUNC inline void setZero() { m_vector.setZero(); }
321};
322
336
337namespace internal {
338template <typename SkewSymmetricVectorType_>
339struct traits<SkewSymmetricWrapper<SkewSymmetricVectorType_>> {
340 using SkewSymmetricVectorType = SkewSymmetricVectorType_;
341 using Scalar = typename SkewSymmetricVectorType::Scalar;
342 using StorageIndex = typename SkewSymmetricVectorType::StorageIndex;
343 using StorageKind = SkewSymmetricShape;
344 using XprKind = typename traits<SkewSymmetricVectorType>::XprKind;
345 enum {
346 RowsAtCompileTime = SkewSymmetricVectorType::SizeAtCompileTime,
347 ColsAtCompileTime = SkewSymmetricVectorType::SizeAtCompileTime,
348 MaxRowsAtCompileTime = SkewSymmetricVectorType::MaxSizeAtCompileTime,
349 MaxColsAtCompileTime = SkewSymmetricVectorType::MaxSizeAtCompileTime,
350 Flags = (traits<SkewSymmetricVectorType>::Flags & LvalueBit) | NoPreferredStorageOrderBit
351 };
352};
353} // namespace internal
354
355template <typename SkewSymmetricVectorType_>
356class SkewSymmetricWrapper : public SkewSymmetricBase<SkewSymmetricWrapper<SkewSymmetricVectorType_>>,
357 internal::no_assignment_operator {
358 public:
359#ifndef EIGEN_PARSED_BY_DOXYGEN
360 using SkewSymmetricVectorType = SkewSymmetricVectorType_;
361 using Nested = SkewSymmetricWrapper;
362#endif
363
365 EIGEN_DEVICE_FUNC explicit inline SkewSymmetricWrapper(SkewSymmetricVectorType& a_vector) : m_vector(a_vector) {}
366
368 EIGEN_DEVICE_FUNC const SkewSymmetricVectorType& vector() const { return m_vector; }
369
370 protected:
371 typename SkewSymmetricVectorType::Nested m_vector;
372};
373
380template <typename Derived>
382 return SkewSymmetricWrapper<const Derived>(derived());
383}
384
388template <typename Derived>
389bool MatrixBase<Derived>::isSkewSymmetric(const RealScalar& prec) const {
390 if (cols() != rows()) return false;
391 return (this->transpose() + *this).isZero(prec);
392}
393
396template <typename Derived>
397template <typename SkewDerived>
402
403namespace internal {
404
405template <>
406struct storage_kind_to_shape<SkewSymmetricShape> {
407 using Shape = SkewSymmetricShape;
408};
409
410struct SkewSymmetric2Dense {};
411
412template <>
413struct AssignmentKind<DenseShape, SkewSymmetricShape> {
414 using Kind = SkewSymmetric2Dense;
415};
416
417// SkewSymmetric matrix to Dense assignment
418template <typename DstXprType, typename SrcXprType, typename Functor>
419struct Assignment<DstXprType, SrcXprType, Functor, SkewSymmetric2Dense> {
420 EIGEN_DEVICE_FUNC static void run(
421 DstXprType& dst, const SrcXprType& src,
422 const internal::assign_op<typename DstXprType::Scalar, typename SrcXprType::Scalar>& /*func*/) {
423 if ((dst.rows() != 3) || (dst.cols() != 3)) {
424 dst.resize(3, 3);
425 }
426 dst.diagonal().setZero();
427 const typename SrcXprType::SkewSymmetricVectorType v = src.vector();
428 dst(0, 1) = -v(2);
429 dst(1, 0) = v(2);
430 dst(0, 2) = v(1);
431 dst(2, 0) = -v(1);
432 dst(1, 2) = -v(0);
433 dst(2, 1) = v(0);
434 }
435 EIGEN_DEVICE_FUNC static void run(
436 DstXprType& dst, const SrcXprType& src,
437 const internal::add_assign_op<typename DstXprType::Scalar, typename SrcXprType::Scalar>& /*func*/) {
438 dst.vector() += src.vector();
439 }
440
441 EIGEN_DEVICE_FUNC static void run(
442 DstXprType& dst, const SrcXprType& src,
443 const internal::sub_assign_op<typename DstXprType::Scalar, typename SrcXprType::Scalar>& /*func*/) {
444 dst.vector() -= src.vector();
445 }
446};
447
448} // namespace internal
449
450} // end namespace Eigen
451
452#endif // EIGEN_SKEWSYMMETRICMATRIX3_H
TransposeReturnType transpose()
Definition Transpose.h:165
typename internal::traits< Derived >::StorageIndex StorageIndex
The type used to store indices.
Definition DenseBase.h:60
typename internal::traits< Derived >::Scalar Scalar
Definition DenseBase.h:63
Base class for diagonal matrices and expressions.
Definition DiagonalMatrix.h:34
const Derived & derived() const
Definition DiagonalMatrix.h:60
Base class for all dense matrices, vectors, and expressions.
Definition MatrixBase.h:53
constexpr const SkewSymmetricWrapper< const Derived > asSkewSymmetric() const
Definition SkewSymmetricMatrix3.h:381
bool isSkewSymmetric(const RealScalar &prec=NumTraits< Scalar >::dummy_precision()) const
Definition SkewSymmetricMatrix3.h:389
const Product< Derived, OtherDerived > operator*(const MatrixBase< OtherDerived > &other) const
Definition GeneralProduct.h:561
The matrix class, also used for vectors and row-vectors.
Definition Matrix.h:188
Expression of the product of two arbitrary matrices or vectors.
Definition Product.h:203
Base class for skew symmetric matrices and expressions.
Definition SkewSymmetricMatrix3.h:36
const SkewSymmetricVectorType & vector() const
Definition SkewSymmetricMatrix3.h:90
const Derived & derived() const
Definition SkewSymmetricMatrix3.h:59
SkewSymmetricDifferenceReturnType< OtherDerived > operator-(const SkewSymmetricBase< OtherDerived > &other) const
Definition SkewSymmetricMatrix3.h:173
DenseMatrixType toDenseMatrix() const
Definition SkewSymmetricMatrix3.h:67
constexpr Index rows() const
Definition SkewSymmetricMatrix3.h:95
constexpr Index cols() const
Definition SkewSymmetricMatrix3.h:97
SkewSymmetricScaleReturnType operator*(const Scalar &scalar) const
Definition SkewSymmetricMatrix3.h:143
Product< Derived, MatrixDerived, LazyProduct > operator*(const SkewSymmetricBase< MatrixDerived > &matrix) const
Definition SkewSymmetricMatrix3.h:108
Product< Derived, DiagonalDerived, LazyProduct > operator*(const DiagonalBase< DiagonalDerived > &diagonal) const
Definition SkewSymmetricMatrix3.h:115
friend DenseSkewSumReturnType< OtherDerived > operator+(const MatrixBase< OtherDerived > &lhs, const SkewSymmetricBase &rhs)
Definition SkewSymmetricMatrix3.h:202
friend Product< DiagonalDerived, Derived, LazyProduct > operator*(const DiagonalBase< DiagonalDerived > &diagonal, const SkewSymmetricBase &skew)
Definition SkewSymmetricMatrix3.h:122
friend DenseSkewDifferenceReturnType< OtherDerived > operator-(const MatrixBase< OtherDerived > &lhs, const SkewSymmetricBase &rhs)
Definition SkewSymmetricMatrix3.h:219
friend DenseSkewSumReturnType< OtherDerived > operator+(const SkewSymmetricBase &lhs, const MatrixBase< OtherDerived > &rhs)
Definition SkewSymmetricMatrix3.h:212
SkewSymmetricVectorType & vector()
Definition SkewSymmetricMatrix3.h:92
SkewSymmetricSumReturnType< OtherDerived > operator+(const SkewSymmetricBase< OtherDerived > &other) const
Definition SkewSymmetricMatrix3.h:162
friend DenseSkewDifferenceReturnType< OtherDerived > operator-(const SkewSymmetricBase &lhs, const MatrixBase< OtherDerived > &rhs)
Definition SkewSymmetricMatrix3.h:227
Product< Derived, MatrixDerived, LazyProduct > operator*(const MatrixBase< MatrixDerived > &matrix) const
Definition SkewSymmetricMatrix3.h:101
SkewSymmetricProductReturnType< OtherDerived > wedge(const SkewSymmetricBase< OtherDerived > &other) const
Definition SkewSymmetricMatrix3.h:134
constexpr Scalar determinant() const
Definition SkewSymmetricMatrix3.h:70
DenseMatrixType exponential() const
Definition SkewSymmetricMatrix3.h:76
Derived & derived()
Definition SkewSymmetricMatrix3.h:61
friend ScaleSkewSymmetricReturnType operator*(const Scalar &scalar, const SkewSymmetricBase &other)
Definition SkewSymmetricMatrix3.h:151
PlainObject transpose() const
Definition SkewSymmetricMatrix3.h:73
Represents a 3x3 skew symmetric matrix with its storage.
Definition SkewSymmetricMatrix3.h:253
SkewSymmetricMatrix3(SkewSymmetricVectorType &&vec)
Constructs a SkewSymmetricMatrix3 from an r-value vector type.
Definition SkewSymmetricMatrix3.h:280
SkewSymmetricMatrix3 & operator=(const SkewSymmetricBase< OtherDerived > &other)
Definition SkewSymmetricMatrix3.h:298
SkewSymmetricMatrix3()
Definition SkewSymmetricMatrix3.h:273
SkewSymmetricMatrix3(const Scalar &x, const Scalar &y, const Scalar &z)
Definition SkewSymmetricMatrix3.h:276
void setZero()
Definition SkewSymmetricMatrix3.h:320
const SkewSymmetricVectorType & vector() const
Definition SkewSymmetricMatrix3.h:268
static InitializeReturnType Zero()
Definition SkewSymmetricMatrix3.h:317
SkewSymmetricMatrix3(const MatrixBase< OtherDerived > &other)
Definition SkewSymmetricMatrix3.h:284
SkewSymmetricMatrix3(const SkewSymmetricBase< OtherDerived > &other)
Definition SkewSymmetricMatrix3.h:288
Expression of a skew symmetric matrix.
Definition SkewSymmetricMatrix3.h:357
const SkewSymmetricVectorType & vector() const
Definition SkewSymmetricMatrix3.h:368
SkewSymmetricWrapper(SkewSymmetricVectorType &a_vector)
Definition SkewSymmetricMatrix3.h:365
constexpr unsigned int NoPreferredStorageOrderBit
Definition Constants.h:183
constexpr unsigned int LvalueBit
Definition Constants.h:149
Definition EigenBase.h:34
Eigen::Index Index
The interface type of indices.
Definition EigenBase.h:44
Determines whether the given binary operation of two numeric types is allowed and what the scalar ret...
Definition XprHelper.h:1062