SkewSymmetricMatrix3.h
Go to the documentation of this file.
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:
42 
43  enum {
44  RowsAtCompileTime = SkewSymmetricVectorType::SizeAtCompileTime,
45  ColsAtCompileTime = SkewSymmetricVectorType::SizeAtCompileTime,
46  MaxRowsAtCompileTime = SkewSymmetricVectorType::MaxSizeAtCompileTime,
47  MaxColsAtCompileTime = SkewSymmetricVectorType::MaxSizeAtCompileTime,
50  };
51 
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 
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 
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 {
103  }
104 
106  template <typename MatrixDerived>
110  }
111 
112  template <typename OtherDerived>
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 
126 
129  return (vector() * scalar).asSkewSymmetric();
130  }
131 
133  SkewSymmetricWrapper<const EIGEN_SCALAR_BINARYOP_EXPR_RETURN_TYPE(Scalar, SkewSymmetricVectorType, product)>;
134 
137  const SkewSymmetricBase& other) {
138  return (scalar * other.vector()).asSkewSymmetric();
139  }
140 
141  template <typename OtherDerived>
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>
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>> {
180 };
181 } // namespace internal
182 template <typename Scalar_>
183 class SkewSymmetricMatrix3 : public SkewSymmetricBase<SkewSymmetricMatrix3<Scalar_>> {
184  public:
185 #ifndef EIGEN_PARSED_BY_DOXYGEN
187  typedef const SkewSymmetricMatrix3& Nested;
188  typedef Scalar_ Scalar;
191 #endif
192 
193  protected:
195 
196  public:
198  EIGEN_DEVICE_FUNC inline const SkewSymmetricVectorType& vector() const { return m_vector; }
201 
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>
215 
217  template <typename OtherDerived>
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
238  m_vector = other.vector();
239  return *this;
240  }
241 #endif
242 
245 
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;
272  typedef typename SkewSymmetricVectorType::StorageIndex StorageIndex;
275  enum {
276  RowsAtCompileTime = SkewSymmetricVectorType::SizeAtCompileTime,
277  ColsAtCompileTime = SkewSymmetricVectorType::SizeAtCompileTime,
278  MaxRowsAtCompileTime = SkewSymmetricVectorType::MaxSizeAtCompileTime,
279  MaxColsAtCompileTime = SkewSymmetricVectorType::MaxSizeAtCompileTime,
281  };
282 };
283 } // namespace internal
284 
285 template <typename SkewSymmetricVectorType_>
286 class SkewSymmetricWrapper : public SkewSymmetricBase<SkewSymmetricWrapper<SkewSymmetricVectorType_>>,
288  public:
289 #ifndef EIGEN_PARSED_BY_DOXYGEN
290  typedef SkewSymmetricVectorType_ SkewSymmetricVectorType;
292 #endif
293 
295  EIGEN_DEVICE_FUNC explicit inline SkewSymmetricWrapper(SkewSymmetricVectorType& a_vector) : m_vector(a_vector) {}
296 
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>
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 <>
338 };
339 
341 
342 template <>
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,
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,
368  dst.vector() += src.vector();
369  }
370 
371  EIGEN_DEVICE_FUNC static void run(
372  DstXprType& dst, const SrcXprType& src,
374  dst.vector() -= src.vector();
375  }
376 };
377 
378 } // namespace internal
379 
380 } // end namespace Eigen
381 
382 #endif // EIGEN_SKEWSYMMETRICMATRIX3_H
Array< int, Dynamic, 1 > v
Definition: Array_initializer_list_vector_cxx11.cpp:1
#define EIGEN_CONSTEXPR
Definition: Macros.h:758
#define EIGEN_CWISE_BINARY_RETURN_TYPE(LHS, RHS, OPNAME)
Definition: Macros.h:1184
#define EIGEN_DEVICE_FUNC
Definition: Macros.h:892
#define EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(EXPR, SCALAR, OPNAME)
Definition: Macros.h:1200
int rows
Definition: Tutorial_commainit_02.cpp:1
int cols
Definition: Tutorial_commainit_02.cpp:1
SCALAR Scalar
Definition: bench_gemm.cpp:45
NumTraits< Scalar >::Real RealScalar
Definition: bench_gemm.cpp:46
NumTraits< Scalar >::Real RealScalar
Definition: DenseBase.h:69
Base class for all dense matrices, vectors, and expressions.
Definition: MatrixBase.h:52
bool isSkewSymmetric(const RealScalar &prec=NumTraits< Scalar >::dummy_precision()) const
Definition: SkewSymmetricMatrix3.h:319
EIGEN_DEVICE_FUNC const Product< Derived, OtherDerived > operator*(const MatrixBase< OtherDerived > &other) const
EIGEN_DEVICE_FUNC const SkewSymmetricWrapper< const Derived > asSkewSymmetric() const
Definition: SkewSymmetricMatrix3.h:311
The matrix class, also used for vectors and row-vectors.
Definition: Eigen/Eigen/src/Core/Matrix.h:186
Expression of the product of two arbitrary matrices or vectors.
Definition: Product.h:202
Base class for skew symmetric matrices and expressions.
Definition: SkewSymmetricMatrix3.h:35
SkewSymmetricVectorType::RealScalar RealScalar
Definition: SkewSymmetricMatrix3.h:39
EIGEN_DEVICE_FUNC DenseMatrixType toDenseMatrix() const
Definition: SkewSymmetricMatrix3.h:66
EIGEN_DEVICE_FUNC SkewSymmetricScaleReturnType operator*(const Scalar &scalar) const
Definition: SkewSymmetricMatrix3.h:128
EIGEN_DEVICE_FUNC PlainObject transpose() const
Definition: SkewSymmetricMatrix3.h:72
EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index cols() const
Definition: SkewSymmetricMatrix3.h:96
EIGEN_DEVICE_FUNC SkewSymmetricSumReturnType< OtherDerived > operator+(const SkewSymmetricBase< OtherDerived > &other) const
Definition: SkewSymmetricMatrix3.h:147
EIGEN_DEVICE_FUNC const Derived & derived() const
Definition: SkewSymmetricMatrix3.h:58
EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index rows() const
Definition: SkewSymmetricMatrix3.h:94
EIGEN_DEVICE_FUNC SkewSymmetricDifferenceReturnType< OtherDerived > operator-(const SkewSymmetricBase< OtherDerived > &other) const
Definition: SkewSymmetricMatrix3.h:158
EIGEN_DEVICE_FUNC Derived & derived()
Definition: SkewSymmetricMatrix3.h:60
DenseMatrixType DenseType
Definition: SkewSymmetricMatrix3.h:54
EIGEN_DEVICE_FUNC friend ScaleSkewSymmetricReturnType operator*(const Scalar &scalar, const SkewSymmetricBase &other)
Definition: SkewSymmetricMatrix3.h:136
internal::traits< Derived >::StorageIndex StorageIndex
Definition: SkewSymmetricMatrix3.h:41
internal::traits< Derived >::SkewSymmetricVectorType SkewSymmetricVectorType
Definition: SkewSymmetricMatrix3.h:37
EIGEN_DEVICE_FUNC Product< Derived, MatrixDerived, LazyProduct > operator*(const MatrixBase< MatrixDerived > &matrix) const
Definition: SkewSymmetricMatrix3.h:100
EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Scalar determinant() const
Definition: SkewSymmetricMatrix3.h:69
EIGEN_DEVICE_FUNC DenseMatrixType exponential() const
Definition: SkewSymmetricMatrix3.h:75
EIGEN_DEVICE_FUNC const SkewSymmetricVectorType & vector() const
Definition: SkewSymmetricMatrix3.h:89
SkewSymmetricVectorType::Scalar Scalar
Definition: SkewSymmetricMatrix3.h:38
EIGEN_DEVICE_FUNC SkewSymmetricVectorType & vector()
Definition: SkewSymmetricMatrix3.h:91
@ ColsAtCompileTime
Definition: SkewSymmetricMatrix3.h:45
@ MaxColsAtCompileTime
Definition: SkewSymmetricMatrix3.h:47
@ MaxRowsAtCompileTime
Definition: SkewSymmetricMatrix3.h:46
@ RowsAtCompileTime
Definition: SkewSymmetricMatrix3.h:44
@ IsVectorAtCompileTime
Definition: SkewSymmetricMatrix3.h:48
internal::traits< Derived >::StorageKind StorageKind
Definition: SkewSymmetricMatrix3.h:40
SkewSymmetricMatrix3< Scalar > PlainObject
Definition: SkewSymmetricMatrix3.h:55
EIGEN_DEVICE_FUNC SkewSymmetricProductReturnType< OtherDerived > wedge(const SkewSymmetricBase< OtherDerived > &other) const
Definition: SkewSymmetricMatrix3.h:119
EIGEN_DEVICE_FUNC Product< Derived, MatrixDerived, LazyProduct > operator*(const SkewSymmetricBase< MatrixDerived > &matrix) const
Definition: SkewSymmetricMatrix3.h:107
Matrix< Scalar, RowsAtCompileTime, ColsAtCompileTime, 0, MaxRowsAtCompileTime, MaxColsAtCompileTime > DenseMatrixType
Definition: SkewSymmetricMatrix3.h:53
Represents a 3x3 skew symmetric matrix with its storage.
Definition: SkewSymmetricMatrix3.h:183
internal::traits< SkewSymmetricMatrix3 >::SkewSymmetricVectorType SkewSymmetricVectorType
Definition: SkewSymmetricMatrix3.h:186
SkewSymmetricWrapper< const CwiseNullaryOp< internal::scalar_constant_op< Scalar >, SkewSymmetricVectorType > > InitializeReturnType
Definition: SkewSymmetricMatrix3.h:244
static EIGEN_DEVICE_FUNC InitializeReturnType Zero()
Definition: SkewSymmetricMatrix3.h:247
EIGEN_DEVICE_FUNC SkewSymmetricMatrix3 & operator=(const SkewSymmetricMatrix3 &other)
Definition: SkewSymmetricMatrix3.h:237
EIGEN_DEVICE_FUNC SkewSymmetricMatrix3 & operator=(const SkewSymmetricBase< OtherDerived > &other)
Definition: SkewSymmetricMatrix3.h:228
const SkewSymmetricMatrix3 & Nested
Definition: SkewSymmetricMatrix3.h:187
EIGEN_DEVICE_FUNC SkewSymmetricMatrix3(SkewSymmetricVectorType &&vec)
Constructs a SkewSymmetricMatrix3 from an r-value vector type.
Definition: SkewSymmetricMatrix3.h:210
SkewSymmetricVectorType m_vector
Definition: SkewSymmetricMatrix3.h:194
EIGEN_DEVICE_FUNC SkewSymmetricMatrix3(const SkewSymmetricBase< OtherDerived > &other)
Definition: SkewSymmetricMatrix3.h:218
EIGEN_DEVICE_FUNC SkewSymmetricMatrix3()
Definition: SkewSymmetricMatrix3.h:203
EIGEN_DEVICE_FUNC const SkewSymmetricVectorType & vector() const
Definition: SkewSymmetricMatrix3.h:198
Scalar_ Scalar
Definition: SkewSymmetricMatrix3.h:188
internal::traits< SkewSymmetricMatrix3 >::StorageIndex StorageIndex
Definition: SkewSymmetricMatrix3.h:190
EIGEN_DEVICE_FUNC void setZero()
Definition: SkewSymmetricMatrix3.h:250
internal::traits< SkewSymmetricMatrix3 >::StorageKind StorageKind
Definition: SkewSymmetricMatrix3.h:189
SkewSymmetricMatrix3(const SkewSymmetricMatrix3 &other)
Definition: SkewSymmetricMatrix3.h:223
EIGEN_DEVICE_FUNC SkewSymmetricVectorType & vector()
Definition: SkewSymmetricMatrix3.h:200
EIGEN_DEVICE_FUNC SkewSymmetricMatrix3(const Scalar &x, const Scalar &y, const Scalar &z)
Definition: SkewSymmetricMatrix3.h:206
EIGEN_DEVICE_FUNC SkewSymmetricMatrix3(const MatrixBase< OtherDerived > &other)
Definition: SkewSymmetricMatrix3.h:214
Expression of a skew symmetric matrix.
Definition: SkewSymmetricMatrix3.h:287
SkewSymmetricVectorType::Nested m_vector
Definition: SkewSymmetricMatrix3.h:301
EIGEN_DEVICE_FUNC const SkewSymmetricVectorType & vector() const
Definition: SkewSymmetricMatrix3.h:298
SkewSymmetricVectorType_ SkewSymmetricVectorType
Definition: SkewSymmetricMatrix3.h:290
EIGEN_DEVICE_FUNC SkewSymmetricWrapper(SkewSymmetricVectorType &a_vector)
Definition: SkewSymmetricMatrix3.h:295
SkewSymmetricWrapper Nested
Definition: SkewSymmetricMatrix3.h:291
Definition: XprHelper.h:134
Eigen::Map< Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic, Eigen::ColMajor >, 0, Eigen::OuterStride<> > matrix(T *data, int rows, int cols, int stride)
Definition: common.h:85
const unsigned int NoPreferredStorageOrderBit
Definition: Constants.h:182
const unsigned int LvalueBit
Definition: Constants.h:148
Scalar * y
Definition: level1_cplx_impl.h:128
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T cos(const T &x)
Definition: MathFunctions.h:1559
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T sin(const T &x)
Definition: MathFunctions.h:1581
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE float sqrt(const float &x)
Definition: arch/SSE/MathFunctions.h:69
Namespace containing all symbols from the Eigen library.
Definition: bench_norm.cpp:70
const unsigned int NestByRefBit
Definition: Constants.h:173
Extend namespace for flags.
Definition: fsi_chan_precond_driver.cc:56
void transpose()
Definition: skew_symmetric_matrix3.cpp:135
Definition: Eigen_Colamd.h:49
double Zero
Definition: pseudosolid_node_update_elements.cc:35
list x
Definition: plotDoE.py:28
void product(const MatrixType &m)
Definition: product.h:42
Definition: Constants.h:540
Definition: EigenBase.h:33
Eigen::Index Index
The interface type of indices.
Definition: EigenBase.h:43
Definition: Constants.h:552
SkewSymmetric2Dense Kind
Definition: SkewSymmetricMatrix3.h:344
Definition: AssignEvaluator.h:760
static EIGEN_DEVICE_FUNC void run(DstXprType &dst, const SrcXprType &src, const internal::sub_assign_op< typename DstXprType::Scalar, typename SrcXprType::Scalar > &)
Definition: SkewSymmetricMatrix3.h:371
static EIGEN_DEVICE_FUNC void run(DstXprType &dst, const SrcXprType &src, const internal::add_assign_op< typename DstXprType::Scalar, typename SrcXprType::Scalar > &)
Definition: SkewSymmetricMatrix3.h:365
static EIGEN_DEVICE_FUNC void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op< typename DstXprType::Scalar, typename SrcXprType::Scalar > &)
Definition: SkewSymmetricMatrix3.h:350
Definition: AssignEvaluator.h:773
Definition: SkewSymmetricMatrix3.h:340
Template functor for scalar/packet assignment with addition.
Definition: AssignmentFunctors.h:52
Template functor for scalar/packet assignment.
Definition: AssignmentFunctors.h:25
SkewSymmetricShape Shape
Definition: SkewSymmetricMatrix3.h:337
Definition: CoreEvaluators.h:32
Template functor for scalar/packet assignment with subtraction.
Definition: AssignmentFunctors.h:73
Matrix< Scalar_, 3, 1, 0, 3, 1 > SkewSymmetricVectorType
Definition: SkewSymmetricMatrix3.h:177
SkewSymmetricShape StorageKind
Definition: SkewSymmetricMatrix3.h:178
SkewSymmetricShape StorageKind
Definition: SkewSymmetricMatrix3.h:273
SkewSymmetricVectorType::StorageIndex StorageIndex
Definition: SkewSymmetricMatrix3.h:272
SkewSymmetricVectorType::Scalar Scalar
Definition: SkewSymmetricMatrix3.h:271
traits< SkewSymmetricVectorType >::XprKind XprKind
Definition: SkewSymmetricMatrix3.h:274
Definition: ForwardDeclarations.h:21
Definition: NonLinearOptimization.cpp:97