12#ifndef EIGEN_SKEWSYMMETRICMATRIX3_H
13#define EIGEN_SKEWSYMMETRICMATRIX3_H
16#include "./InternalHeaderCheck.h"
35template <
typename Derived>
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;
45 RowsAtCompileTime = SkewSymmetricVectorType::SizeAtCompileTime,
46 ColsAtCompileTime = SkewSymmetricVectorType::SizeAtCompileTime,
47 MaxRowsAtCompileTime = SkewSymmetricVectorType::MaxSizeAtCompileTime,
48 MaxColsAtCompileTime = SkewSymmetricVectorType::MaxSizeAtCompileTime,
49 IsVectorAtCompileTime = 0,
53 using DenseMatrixType =
55 using DenseType = DenseMatrixType;
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); }
70 EIGEN_DEVICE_FUNC
constexpr Scalar
determinant()
const {
return 0; }
73 EIGEN_DEVICE_FUNC PlainObject
transpose()
const {
return (-
vector()).asSkewSymmetric(); }
77 DenseMatrixType retVal = DenseMatrixType::Identity();
78 const SkewSymmetricVectorType& v =
vector();
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();
90 EIGEN_DEVICE_FUNC
inline const SkewSymmetricVectorType&
vector()
const {
return derived().vector(); }
92 EIGEN_DEVICE_FUNC
inline SkewSymmetricVectorType&
vector() {
return derived().vector(); }
95 EIGEN_DEVICE_FUNC
constexpr Index rows()
const {
return 3; }
97 EIGEN_DEVICE_FUNC
constexpr Index cols()
const {
return 3; }
100 template <
typename MatrixDerived>
107 template <
typename MatrixDerived>
114 template <
typename DiagonalDerived>
121 template <
typename DiagonalDerived>
127 template <
typename OtherDerived>
128 using SkewSymmetricProductReturnType =
SkewSymmetricWrapper<
const EIGEN_CWISE_BINARY_RETURN_TYPE(
129 SkewSymmetricVectorType,
typename OtherDerived::SkewSymmetricVectorType, internal::scalar_product_op)>;
133 template <
typename OtherDerived>
134 EIGEN_DEVICE_FUNC SkewSymmetricProductReturnType<OtherDerived>
wedge(
136 return vector().cross(other.
vector()).asSkewSymmetric();
139 using SkewSymmetricScaleReturnType =
SkewSymmetricWrapper<
const EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(
140 SkewSymmetricVectorType, Scalar, internal::scalar_product_op)>;
143 EIGEN_DEVICE_FUNC
inline SkewSymmetricScaleReturnType
operator*(
const Scalar& scalar)
const {
144 return (
vector() * scalar).asSkewSymmetric();
147 using ScaleSkewSymmetricReturnType =
SkewSymmetricWrapper<
const EIGEN_SCALAR_BINARYOP_EXPR_RETURN_TYPE(
148 Scalar, SkewSymmetricVectorType, internal::scalar_product_op)>;
151 EIGEN_DEVICE_FUNC
friend inline ScaleSkewSymmetricReturnType
operator*(
const Scalar& scalar,
153 return (scalar * other.
vector()).asSkewSymmetric();
156 template <
typename OtherDerived>
158 SkewSymmetricVectorType,
typename OtherDerived::SkewSymmetricVectorType, internal::scalar_sum_op)>;
161 template <
typename OtherDerived>
162 EIGEN_DEVICE_FUNC
inline SkewSymmetricSumReturnType<OtherDerived>
operator+(
167 template <
typename OtherDerived>
168 using SkewSymmetricDifferenceReturnType =
SkewSymmetricWrapper<
const EIGEN_CWISE_BINARY_RETURN_TYPE(
169 SkewSymmetricVectorType,
typename OtherDerived::SkewSymmetricVectorType, internal::scalar_difference_op)>;
172 template <
typename OtherDerived>
173 EIGEN_DEVICE_FUNC
inline SkewSymmetricDifferenceReturnType<OtherDerived>
operator-(
182 template <
typename OtherDerived,
typename BinaryOp>
183 using DenseSkewBinaryReturnType =
Matrix<
187 template <
typename OtherDerived>
188 using DenseSkewSumReturnType =
189 DenseSkewBinaryReturnType<OtherDerived,
190 internal::scalar_sum_op<typename internal::traits<OtherDerived>::Scalar,
Scalar>>;
192 template <
typename OtherDerived>
193 using DenseSkewDifferenceReturnType = DenseSkewBinaryReturnType<
194 OtherDerived, internal::scalar_difference_op<typename internal::traits<OtherDerived>::Scalar,
Scalar>>;
201 template <
typename OtherDerived>
202 EIGEN_DEVICE_FUNC
friend EIGEN_STRONG_INLINE DenseSkewSumReturnType<OtherDerived>
operator+(
204 EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(OtherDerived, DenseMatrixType);
211 template <
typename OtherDerived>
212 EIGEN_DEVICE_FUNC
friend EIGEN_STRONG_INLINE DenseSkewSumReturnType<OtherDerived>
operator+(
218 template <
typename OtherDerived>
219 EIGEN_DEVICE_FUNC
friend EIGEN_STRONG_INLINE DenseSkewDifferenceReturnType<OtherDerived>
operator-(
221 EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(OtherDerived, DenseMatrixType);
226 template <
typename OtherDerived>
227 EIGEN_DEVICE_FUNC
friend EIGEN_STRONG_INLINE DenseSkewDifferenceReturnType<OtherDerived>
operator-(
229 EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(OtherDerived, DenseMatrixType);
230 return lhs.toDenseMatrix() - rhs.derived();
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;
252template <
typename Scalar_>
255#ifndef EIGEN_PARSED_BY_DOXYGEN
256 using SkewSymmetricVectorType =
typename internal::traits<SkewSymmetricMatrix3>::SkewSymmetricVectorType;
259 using StorageKind =
typename internal::traits<SkewSymmetricMatrix3>::StorageKind;
260 using StorageIndex =
typename internal::traits<SkewSymmetricMatrix3>::StorageIndex;
264 SkewSymmetricVectorType m_vector;
268 EIGEN_DEVICE_FUNC
inline const SkewSymmetricVectorType&
vector()
const {
return m_vector; }
270 EIGEN_DEVICE_FUNC
inline SkewSymmetricVectorType&
vector() {
return m_vector; }
277 : m_vector(x, y, z) {}
280 EIGEN_DEVICE_FUNC
explicit inline SkewSymmetricMatrix3(SkewSymmetricVectorType&& vec) : m_vector(std::move(vec)) {}
283 template <
typename OtherDerived>
287 template <
typename OtherDerived>
289 : m_vector(other.
vector()) {}
291#ifndef EIGEN_PARSED_BY_DOXYGEN
297 template <
typename OtherDerived>
299 m_vector = other.
vector();
303#ifndef EIGEN_PARSED_BY_DOXYGEN
308 m_vector = other.
vector();
313 using InitializeReturnType =
314 SkewSymmetricWrapper<const CwiseNullaryOp<internal::scalar_constant_op<Scalar>, SkewSymmetricVectorType>>;
317 EIGEN_DEVICE_FUNC
static InitializeReturnType
Zero() {
return SkewSymmetricVectorType::Zero().asSkewSymmetric(); }
320 EIGEN_DEVICE_FUNC
inline void setZero() { m_vector.setZero(); }
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;
346 RowsAtCompileTime = SkewSymmetricVectorType::SizeAtCompileTime,
347 ColsAtCompileTime = SkewSymmetricVectorType::SizeAtCompileTime,
348 MaxRowsAtCompileTime = SkewSymmetricVectorType::MaxSizeAtCompileTime,
349 MaxColsAtCompileTime = SkewSymmetricVectorType::MaxSizeAtCompileTime,
355template <
typename SkewSymmetricVectorType_>
357 internal::no_assignment_operator {
359#ifndef EIGEN_PARSED_BY_DOXYGEN
360 using SkewSymmetricVectorType = SkewSymmetricVectorType_;
365 EIGEN_DEVICE_FUNC
explicit inline SkewSymmetricWrapper(SkewSymmetricVectorType& a_vector) : m_vector(a_vector) {}
368 EIGEN_DEVICE_FUNC
const SkewSymmetricVectorType&
vector()
const {
return m_vector; }
371 typename SkewSymmetricVectorType::Nested m_vector;
380template <
typename Derived>
388template <
typename Derived>
390 if (cols() != rows())
return false;
391 return (this->
transpose() + *
this).isZero(prec);
396template <
typename Derived>
397template <
typename SkewDerived>
406struct storage_kind_to_shape<SkewSymmetricShape> {
407 using Shape = SkewSymmetricShape;
410struct SkewSymmetric2Dense {};
413struct AssignmentKind<DenseShape, SkewSymmetricShape> {
414 using Kind = SkewSymmetric2Dense;
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>& ) {
423 if ((dst.rows() != 3) || (dst.cols() != 3)) {
426 dst.diagonal().setZero();
427 const typename SrcXprType::SkewSymmetricVectorType v = src.vector();
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>& ) {
438 dst.vector() += src.vector();
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>& ) {
444 dst.vector() -= src.vector();
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