11 #ifndef EIGEN_SKEWSYMMETRICMATRIX3_H 12 #define EIGEN_SKEWSYMMETRICMATRIX3_H 15 #include "./InternalHeaderCheck.h" 34 template <
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 constexpr Scalar
determinant()
const {
return 0; }
77 const SkewSymmetricVectorType& v =
vector();
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();
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 constexpr
Index rows()
const {
return 3; }
96 EIGEN_DEVICE_FUNC constexpr
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 =
129 return (
vector() * scalar).asSkewSymmetric();
132 using ScaleSkewSymmetricReturnType =
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>
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;
182 template <
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) {}
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(); }
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;
276 RowsAtCompileTime = SkewSymmetricVectorType::SizeAtCompileTime,
277 ColsAtCompileTime = SkewSymmetricVectorType::SizeAtCompileTime,
278 MaxRowsAtCompileTime = SkewSymmetricVectorType::MaxSizeAtCompileTime,
279 MaxColsAtCompileTime = SkewSymmetricVectorType::MaxSizeAtCompileTime,
285 template <
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;
310 template <
typename Derived>
318 template <
typename Derived>
320 if (cols() != rows())
return false;
321 return (this->transpose() + *
this).isZero(prec);
326 template <
typename Derived>
327 template <
typename SkewDerived>
336 struct storage_kind_to_shape<SkewSymmetricShape> {
337 typedef SkewSymmetricShape Shape;
340 struct SkewSymmetric2Dense {};
343 struct AssignmentKind<DenseShape, SkewSymmetricShape> {
344 typedef SkewSymmetric2Dense Kind;
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>& ) {
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();
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