11#ifndef EIGEN_SKEWSYMMETRICMATRIX3_H
12#define EIGEN_SKEWSYMMETRICMATRIX3_H
15#include "./InternalHeaderCheck.h"
34template <
typename Derived>
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;
44 RowsAtCompileTime = SkewSymmetricVectorType::SizeAtCompileTime,
45 ColsAtCompileTime = SkewSymmetricVectorType::SizeAtCompileTime,
46 MaxRowsAtCompileTime = SkewSymmetricVectorType::MaxSizeAtCompileTime,
47 MaxColsAtCompileTime = SkewSymmetricVectorType::MaxSizeAtCompileTime,
48 IsVectorAtCompileTime = 0,
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); }
69 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
inline Scalar
determinant()
const {
return 0; }
77 const SkewSymmetricVectorType& v =
vector();
82 const Scalar norm = numext::sqrt(norm2);
83 retVal += ((((1 - numext::cos(norm)) / norm2) *
derived()) *
derived()) +
84 (numext::sin(norm) / norm) *
derived().toDenseMatrix();
89 EIGEN_DEVICE_FUNC
inline const SkewSymmetricVectorType&
vector()
const {
return derived().vector(); }
91 EIGEN_DEVICE_FUNC
inline SkewSymmetricVectorType&
vector() {
return derived().vector(); }
94 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
inline Index rows()
const {
return 3; }
96 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
inline Index cols()
const {
return 3; }
99 template <
typename MatrixDerived>
106 template <
typename MatrixDerived>
112 template <
typename OtherDerived>
113 using SkewSymmetricProductReturnType =
SkewSymmetricWrapper<
const EIGEN_CWISE_BINARY_RETURN_TYPE(
114 SkewSymmetricVectorType,
typename OtherDerived::SkewSymmetricVectorType, product)>;
118 template <
typename OtherDerived>
121 return vector().cross(other.
vector()).asSkewSymmetric();
124 using SkewSymmetricScaleReturnType =
125 SkewSymmetricWrapper<
const EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(SkewSymmetricVectorType, Scalar, product)>;
129 return (
vector() * scalar).asSkewSymmetric();
132 using ScaleSkewSymmetricReturnType =
133 SkewSymmetricWrapper<
const EIGEN_SCALAR_BINARYOP_EXPR_RETURN_TYPE(Scalar, SkewSymmetricVectorType, product)>;
138 return (scalar * other.
vector()).asSkewSymmetric();
141 template <
typename OtherDerived>
143 SkewSymmetricVectorType,
typename OtherDerived::SkewSymmetricVectorType, sum)>;
146 template <
typename OtherDerived>
152 template <
typename OtherDerived>
153 using SkewSymmetricDifferenceReturnType =
SkewSymmetricWrapper<
const EIGEN_CWISE_BINARY_RETURN_TYPE(
154 SkewSymmetricVectorType,
typename OtherDerived::SkewSymmetricVectorType, difference)>;
157 template <
typename OtherDerived>
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;
182template <
typename Scalar_>
185#ifndef EIGEN_PARSED_BY_DOXYGEN
186 typedef typename internal::traits<SkewSymmetricMatrix3>::SkewSymmetricVectorType SkewSymmetricVectorType;
188 typedef Scalar_ Scalar;
189 typedef typename internal::traits<SkewSymmetricMatrix3>::StorageKind StorageKind;
190 typedef typename internal::traits<SkewSymmetricMatrix3>::StorageIndex StorageIndex;
194 SkewSymmetricVectorType m_vector;
198 EIGEN_DEVICE_FUNC
inline const SkewSymmetricVectorType&
vector()
const {
return m_vector; }
200 EIGEN_DEVICE_FUNC
inline SkewSymmetricVectorType&
vector() {
return m_vector; }
207 : m_vector(x, y, z) {}
210 EIGEN_DEVICE_FUNC
explicit inline SkewSymmetricMatrix3(SkewSymmetricVectorType&& vec) : m_vector(std::move(vec)) {}
213 template <
typename OtherDerived>
217 template <
typename OtherDerived>
219 : m_vector(other.
vector()) {}
221#ifndef EIGEN_PARSED_BY_DOXYGEN
227 template <
typename OtherDerived>
229 m_vector = other.
vector();
233#ifndef EIGEN_PARSED_BY_DOXYGEN
238 m_vector = other.
vector();
243 typedef SkewSymmetricWrapper<const CwiseNullaryOp<internal::scalar_constant_op<Scalar>, SkewSymmetricVectorType>>
244 InitializeReturnType;
250 EIGEN_DEVICE_FUNC
inline void setZero() { m_vector.setZero(); }
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;
276 RowsAtCompileTime = SkewSymmetricVectorType::SizeAtCompileTime,
277 ColsAtCompileTime = SkewSymmetricVectorType::SizeAtCompileTime,
278 MaxRowsAtCompileTime = SkewSymmetricVectorType::MaxSizeAtCompileTime,
279 MaxColsAtCompileTime = SkewSymmetricVectorType::MaxSizeAtCompileTime,
285template <
typename SkewSymmetricVectorType_>
287 internal::no_assignment_operator {
289#ifndef EIGEN_PARSED_BY_DOXYGEN
290 typedef SkewSymmetricVectorType_ SkewSymmetricVectorType;
295 EIGEN_DEVICE_FUNC
explicit inline SkewSymmetricWrapper(SkewSymmetricVectorType& a_vector) : m_vector(a_vector) {}
298 EIGEN_DEVICE_FUNC
const SkewSymmetricVectorType&
vector()
const {
return m_vector; }
301 typename SkewSymmetricVectorType::Nested m_vector;
310template <
typename Derived>
318template <
typename Derived>
320 if (cols() != rows())
return false;
321 return (this->transpose() + *
this).
isZero(prec);
326template <
typename Derived>
327template <
typename SkewDerived>
336struct storage_kind_to_shape<SkewSymmetricShape> {
337 typedef SkewSymmetricShape Shape;
340struct SkewSymmetric2Dense {};
343struct AssignmentKind<DenseShape, SkewSymmetricShape> {
344 typedef SkewSymmetric2Dense Kind;
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>& ) {
353 if ((dst.rows() != 3) || (dst.cols() != 3)) {
356 dst.diagonal().setZero();
357 const typename SrcXprType::SkewSymmetricVectorType v = src.vector();
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>& ) {
368 dst.vector() += src.vector();
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>& ) {
374 dst.vector() -= src.vector();
internal::traits< Homogeneous< MatrixType, Direction_ > >::StorageIndex StorageIndex
Definition DenseBase.h:59
internal::traits< Homogeneous< MatrixType, Direction_ > >::Scalar Scalar
Definition DenseBase.h:62
bool isZero(const RealScalar &prec=NumTraits< Scalar >::dummy_precision()) const
Definition CwiseNullaryOp.h:533
Derived & derived()
Definition EigenBase.h:49
Base class for all dense matrices, vectors, and expressions.
Definition MatrixBase.h:52
static const IdentityReturnType Identity()
Definition CwiseNullaryOp.h:781
RealScalar squaredNorm() const
Definition Dot.h:87
The matrix class, also used for vectors and row-vectors.
Definition 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
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 SkewSymmetricMatrix3.h:183
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 SkewSymmetricMatrix3.h:287
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 Core:137
Definition EigenBase.h:33
Eigen::Index Index
The interface type of indices.
Definition EigenBase.h:43