11#ifndef CUBBYFLOW_MATRIX_EXPRESSION_IMPL_HPP
12#define CUBBYFLOW_MATRIX_EXPRESSION_IMPL_HPP
20template <
typename T,
size_t Rows,
size_t Cols,
typename D>
23 return static_cast<const D&
>(*this).
GetRows();
26template <
typename T,
size_t Rows,
size_t Cols,
typename D>
29 return static_cast<const D&
>(*this).
GetCols();
32template <
typename T,
size_t Rows,
size_t Cols,
typename D>
35 return GetDerived()(i, j);
38template <
typename T,
size_t Rows,
size_t Cols,
typename D>
44template <
typename T,
size_t Rows,
size_t Cols,
typename D>
45template <
size_t R,
size_t C,
typename E>
56 for (
size_t i = 0; i <
GetRows(); ++i)
58 for (
size_t j = 0; j <
GetCols(); ++j)
70template <
typename T,
size_t Rows,
size_t Cols,
typename D>
76template <
typename T,
size_t Rows,
size_t Cols,
typename D>
81 for (
size_t i = 0; i <
GetRows(); ++i)
83 for (
size_t j = 0; j <
GetCols(); ++j)
92template <
typename T,
size_t Rows,
size_t Cols,
typename D>
98template <
typename T,
size_t Rows,
size_t Cols,
typename D>
103 for (
size_t j = 1; j <
GetCols(); ++j)
108 for (
size_t i = 1; i <
GetRows(); ++i)
110 for (
size_t j = 0; j <
GetCols(); ++j)
119template <
typename T,
size_t Rows,
size_t Cols,
typename D>
124 for (
size_t j = 1; j <
GetCols(); ++j)
126 s = std::max(
s,
Eval(0, j));
140template <
typename T,
size_t Rows,
size_t Cols,
typename D>
150 for (
size_t i = 1; i <
GetRows(); ++i)
152 for (
size_t j = 0; j <
GetCols(); ++j)
161template <
typename T,
size_t Rows,
size_t Cols,
typename D>
166 for (
size_t j = 1; j <
GetCols(); ++j)
171 for (
size_t i = 1; i <
GetRows(); ++i)
173 for (
size_t j = 0; j <
GetCols(); ++j)
182template <
typename T,
size_t Rows,
size_t Cols,
typename D>
197template <
typename T,
size_t Rows,
size_t Cols,
typename D>
205template <
typename T,
size_t Rows,
size_t Cols,
typename D>
213 for (
size_t i = 1; i <
GetRows(); ++i)
217 if (std::fabs(
curr) > std::fabs(
best))
227template <
typename T,
size_t Rows,
size_t Cols,
typename D>
235 for (
size_t i = 1; i <
GetRows(); ++i)
239 if (std::fabs(
curr) < std::fabs(
best))
249template <
typename T,
size_t Rows,
size_t Cols,
typename D>
255template <
typename T,
size_t Rows,
size_t Cols,
typename D>
260 for (
size_t i = 0; i <
GetRows(); ++i)
262 for (
size_t j = 0; j <
GetCols(); ++j)
271template <
typename T,
size_t Rows,
size_t Cols,
typename D>
277template <
typename T,
size_t Rows,
size_t Cols,
typename D>
285template <
typename T,
size_t Rows,
size_t Cols,
typename D>
293template <
typename T,
size_t Rows,
size_t Cols,
typename D>
294template <
size_t R,
size_t C,
typename E>
303template <
typename T,
size_t Rows,
size_t Cols,
typename D>
304template <
size_t R,
size_t C,
typename E>
313template <
typename T,
size_t Rows,
size_t Cols,
typename D>
321template <
typename T,
size_t Rows,
size_t Cols,
typename D>
328template <
typename T,
size_t Rows,
size_t Cols,
typename D>
335template <
typename T,
size_t Rows,
size_t Cols,
typename D>
342template <
typename T,
size_t Rows,
size_t Cols,
typename D>
349template <
typename T,
size_t Rows,
size_t Cols,
typename D>
356template <
typename T,
size_t Rows,
size_t Cols,
typename D>
363template <
typename T,
size_t Rows,
size_t Cols,
typename D>
370template <
typename T,
size_t Rows,
size_t Cols,
typename D>
378template <
typename T,
size_t Rows,
size_t Cols,
typename D>
386template <
typename T,
size_t Rows,
size_t Cols,
typename D>
387template <
size_t R,
size_t C,
typename E,
typename U>
388std::enable_if_t<(IsMatrixSizeDynamic<Rows, Cols>() ||
Cols == 1) &&
398 for (
size_t i = 1; i < GetRows(); ++i)
406template <
typename T,
size_t Rows,
size_t Cols,
typename D>
407template <
size_t R,
size_t C,
typename E,
typename U>
408std::enable_if_t<(IsMatrixSizeDynamic<Rows, Cols>() ||
422template <
typename T,
size_t Rows,
size_t Cols,
typename D>
423template <
size_t R,
size_t C,
typename E,
typename U>
424std::enable_if_t<(IsMatrixSizeDynamic<Rows, Cols>() ||
441template <
typename T,
size_t Rows,
size_t Cols,
typename D>
442template <
size_t R,
size_t C,
typename E,
typename U>
443std::enable_if_t<(IsMatrixSizeDynamic<Rows, Cols>() ||
446 ((
R == 2 ||
R == 3) &&
C == 1)),
451 assert((GetRows() == 2 || GetRows() == 3) && GetCols() == 1 &&
452 normal.GetRows() == GetRows() && normal.GetCols() == 1);
455 return (*
this) - 2 * Dot(normal) * normal;
458template <
typename T,
size_t Rows,
size_t Cols,
typename D>
459template <
size_t R,
size_t C,
typename E,
typename U>
460std::enable_if_t<(IsMatrixSizeDynamic<Rows, Cols>() ||
463 ((
R == 2 ||
R == 3) &&
C == 1)),
468 assert((GetRows() == 2 || GetRows() == 3) && GetCols() == 1 &&
469 normal.GetRows() == GetRows() && normal.GetCols() == 1);
472 return (*
this) - this->Dot(normal) * normal;
475template <
typename T,
size_t Rows,
size_t Cols,
typename D>
477std::enable_if_t<(IsMatrixSizeDynamic<Rows, Cols>() ||
487template <
typename T,
size_t Rows,
size_t Cols,
typename D>
489std::enable_if_t<(IsMatrixSizeDynamic<Rows, Cols>() ||
496 using V = Matrix<T, 3, 1>;
499 ((std::fabs(
Eval(1, 0)) > 0 || std::fabs(
Eval(2, 0)) > 0) ? V(1, 0, 0)
503 V b = this->
Cross(a);
505 return std::make_tuple(
a, b);
508template <
typename T,
size_t Rows,
size_t Cols,
typename D>
511 return static_cast<D&
>(*this);
514template <
typename T,
size_t Rows,
size_t Cols,
typename D>
517 return static_cast<const D&
>(*this);
520template <
typename T,
size_t Rows,
size_t Cols,
typename D>
527template <
typename T,
size_t Rows,
size_t Cols,
typename D>
534template <
typename T,
size_t Rows,
size_t Cols,
typename D>
546template <
typename T,
size_t Rows,
size_t Cols,
typename D>
576template <
typename T,
size_t Rows,
size_t Cols,
typename D>
587 for (
size_t i = 0; i <
m.
GetRows(); ++i)
595 if (std::fabs(
a(
k, i)) >
maxEl)
615 T c = -
a(
k, i) /
a(i, i);
617 for (
size_t j = i; j <
m.
GetRows(); ++j)
625 a(
k, j) +=
c *
a(i, j);
631 for (
size_t i = 0; i <
m.
GetRows(); ++i)
639template <
typename T,
size_t Rows,
size_t Cols,
typename D>
646template <
typename T,
size_t Rows,
size_t Cols,
typename D>
658template <
typename T,
size_t Rows,
size_t Cols,
typename D>
684template <
typename T,
size_t Rows,
size_t Cols,
typename D>
804template <
typename T,
size_t Rows,
size_t Cols,
typename Derived>
821 for (
size_t i = 0; i <
n; ++i)
827 for (
size_t k = i + 1;
k <
n; ++
k)
829 if (std::fabs(
a(
k, i)) >
maxEl)
839 for (
size_t k = i;
k <
n; ++
k)
844 for (
size_t k = 0;
k <
n; ++
k)
851 for (
size_t k = 0;
k <
n; ++
k)
858 T c = -
a(
k, i) /
a(i, i);
860 for (
size_t j = 0; j <
n; ++j)
870 a(
k, j) +=
c *
a(i, j);
876 for (
size_t k = 0;
k <
n; ++
k)
880 for (
size_t j = 0; j <
n; ++j)
889template <
typename T,
size_t Rows,
size_t Cols>
895template <
typename T,
size_t Rows,
size_t Cols>
901template <
typename T,
size_t Rows,
size_t Cols>
907template <
typename T,
size_t Rows,
size_t Cols,
typename M1>
913template <
typename T,
size_t Rows,
size_t Cols,
typename M1>
919template <
typename T,
size_t Rows,
size_t Cols,
typename M1>
930template <
typename T,
size_t Rows,
size_t Cols,
typename M1>
936template <
typename T,
size_t Rows,
size_t Cols,
typename M1>
942template <
typename T,
size_t Rows,
size_t Cols,
typename M1>
953template <
typename T,
size_t Rows,
size_t Cols,
typename M1>
959template <
typename T,
size_t Rows,
size_t Cols,
typename M1>
965template <
typename T,
size_t Rows,
size_t Cols,
typename M1>
972 return (j > i) ? m_mat1(i, j) : 0;
975 return (j >= i) ? m_mat1(i, j) : 0;
980 return (j < i) ? m_mat1(i, j) : 0;
983 return (j <= i) ? m_mat1(i, j) : 0;
986template <
typename T,
size_t Rows,
size_t Cols,
typename M1>
992template <
typename T,
size_t Rows,
size_t Cols,
typename M1>
998template <
typename T,
size_t Rows,
size_t Cols,
typename M1>
1002 return m_mat1(j, i);
1005template <
typename T,
size_t Rows,
size_t Cols,
typename M1,
typename UOp>
1011template <
typename T,
size_t Rows,
size_t Cols,
typename M1,
typename UOp>
1017template <
typename T,
size_t Rows,
size_t Cols,
typename M1,
typename UOp>
1021 return m_op(m_mat1(i, j));
1024template <
typename T,
size_t Rows,
size_t Cols,
typename M1>
1030template <
typename T,
size_t Rows,
size_t Cols,
typename M1>
1036template <
typename T,
size_t Rows,
size_t Cols,
typename M1>
1042template <
typename T,
size_t Rows,
size_t Cols,
typename E1,
typename E2,
1050template <
typename T,
size_t Rows,
size_t Cols,
typename E1,
typename E2,
1058template <
typename T,
size_t Rows,
size_t Cols,
typename E1,
typename E2,
1061 size_t i,
size_t j)
const
1063 return m_op(m_mat1(i, j), m_mat2(i, j));
1066template <
typename T,
size_t Rows,
size_t Cols,
typename M1,
typename M2>
1075template <
typename T,
size_t Rows,
size_t Cols,
typename M1,
typename M2>
1084template <
typename T,
size_t Rows,
size_t Cols,
typename M1,
typename M2>
1093template <
typename T,
size_t Rows,
size_t Cols,
typename M1,
typename M2>
1102template <
typename T,
size_t Rows,
size_t Cols,
typename M1,
typename M2>
1111template <
typename T,
size_t Rows,
size_t Cols,
typename M1,
typename M2>
1120template <
typename T,
size_t Rows,
size_t Cols,
typename M1,
typename BOp>
1127template <
typename T,
size_t Rows,
size_t Cols,
typename M1,
typename BOp>
1134template <
typename T,
size_t Rows,
size_t Cols,
typename M1,
typename BOp>
1136 size_t i,
size_t j)
const
1138 return m_op(m_mat1(i, j), m_scalar2);
1141template <
typename T,
size_t Rows,
size_t Cols,
typename M1>
1149template <
typename T,
size_t Rows,
size_t Cols,
typename M1>
1157template <
typename T,
size_t Rows,
size_t Cols,
typename M1>
1165template <
typename T,
size_t Rows,
size_t Cols,
typename M1>
1173template <
typename T,
size_t Rows,
size_t Cols,
typename M2,
typename BOp>
1180template <
typename T,
size_t Rows,
size_t Cols,
typename M2,
typename BOp>
1187template <
typename T,
size_t Rows,
size_t Cols,
typename M2,
typename BOp>
1189 size_t i,
size_t j)
const
1191 return m_op(m_scalar1, m_mat2(i, j));
1194template <
typename T,
size_t Rows,
size_t Cols,
typename M2>
1202template <
typename T,
size_t Rows,
size_t Cols,
typename M2>
1210template <
typename T,
size_t Rows,
size_t Cols,
typename M2>
1218template <
typename T,
size_t Rows,
size_t Cols,
typename M2>
1226template <
typename T,
size_t Rows,
size_t Cols,
typename M1,
typename M2,
1227 typename M3,
typename TOp>
1234template <
typename T,
size_t Rows,
size_t Cols,
typename M1,
typename M2,
1235 typename M3,
typename TOp>
1242template <
typename T,
size_t Rows,
size_t Cols,
typename M1,
typename M2,
1243 typename M3,
typename TOp>
1245 size_t i,
size_t j)
const
1247 return m_op(m_mat1(i, j), m_mat2(i, j), m_mat3(i, j));
1250template <
typename T,
size_t Rows,
size_t Cols,
typename M1,
typename M2,
1264template <
typename T,
size_t Rows,
size_t Cols,
typename M1,
typename M2>
1270template <
typename T,
size_t Rows,
size_t Cols,
typename M1,
typename M2>
1276template <
typename T,
size_t Rows,
size_t Cols,
typename M1,
typename M2>
1279 T sum = m_mat1(i, 0) * m_mat2(0, j);
1281 for (
size_t k = 1;
k < m_mat1.
GetCols(); ++
k)
1283 sum += m_mat1(i,
k) * m_mat2(
k, j);
1289template <
typename T,
size_t R1,
size_t C1,
size_t R2,
size_t C2,
typename M1,
constexpr size_t GetRows() const
Definition MatrixExpression-Impl.hpp:890
constexpr size_t GetCols() const
Definition MatrixExpression-Impl.hpp:896
constexpr T operator()(size_t, size_t) const
Definition MatrixExpression-Impl.hpp:902
constexpr size_t GetRows() const
Definition MatrixExpression-Impl.hpp:908
T operator()(size_t i, size_t j) const
Definition MatrixExpression-Impl.hpp:920
constexpr size_t GetCols() const
Definition MatrixExpression-Impl.hpp:914
constexpr size_t GetCols() const
Definition MatrixExpression-Impl.hpp:1052
constexpr size_t GetRows() const
Definition MatrixExpression-Impl.hpp:1044
constexpr T operator()(size_t i, size_t j) const
Definition MatrixExpression-Impl.hpp:1060
Base class for matrix expression.
Definition MatrixExpression.hpp:94
ValueType Determinant() const
Definition MatrixExpression-Impl.hpp:198
std::enable_if_t<(IsMatrixSizeDynamic< Rows, Cols >()||((Rows==2||Rows==3) &&Cols==1)) &&(IsMatrixSizeDynamic< R, C >()||((R==2||R==3) &&C==1)), Matrix< U, Rows, 1 > Projected(const MatrixExpression< T, R, C, E > &normal) const
Returns the projected vector to the surface with given surface normal.
std::enable_if_t<(IsMatrixSizeDynamic< Rows, Cols >()||(Rows==2 &&Cols==1)) &&(IsMatrixSizeDynamic< R, C >()||(R==2 &&C==1)), U > Cross(const MatrixExpression< T, R, C, E > &expression) const
Definition MatrixExpression-Impl.hpp:412
bool IsSimilar(const MatrixExpression< T, R, C, E > &m, double tol=std::numeric_limits< double >::epsilon()) const
Definition MatrixExpression-Impl.hpp:46
Matrix< T, Rows, Cols > Inverse() const
Returns inverse matrix.
Definition MatrixExpression-Impl.hpp:371
std::enable_if_t<(IsMatrixSizeDynamic< Rows, Cols >()||(Rows==3 &&Cols==1)), std::tuple< Matrix< U, 3, 1 >, Matrix< U, 3, 1 > > Tangentials() const
Returns the tangential vectors for this vector.
constexpr size_t GetRows() const
Returns the number of rows.
Definition MatrixExpression-Impl.hpp:21
ValueType AbsMin() const
Definition MatrixExpression-Impl.hpp:141
ValueType Avg() const
Definition MatrixExpression-Impl.hpp:93
ValueType Sum() const
Definition MatrixExpression-Impl.hpp:77
size_t SubdominantAxis() const
Definition MatrixExpression-Impl.hpp:228
MatrixTri< T, Rows, Cols, const Derived & > StrictLowerTri() const
Returns strictly lower triangle part of this matrix.
Definition MatrixExpression-Impl.hpp:337
ValueType Length() const
Definition MatrixExpression-Impl.hpp:278
ValueType NormSquared() const
Definition MatrixExpression-Impl.hpp:256
ValueType FrobeniusNorm() const
Definition MatrixExpression-Impl.hpp:272
constexpr size_t GetCols() const
Returns the number of columns.
Definition MatrixExpression-Impl.hpp:27
std::enable_if_t<(IsMatrixSizeDynamic< Rows, Cols >()||(Rows==2 &&Cols==1)), Matrix< U, 2, 1 > Tangential() const
Returns the tangential vector for this vector.
ValueType DistanceTo(const MatrixExpression< T, R, C, E > &other) const
Returns the distance to the other vector.
MatrixTri< T, Rows, Cols, const Derived & > UpperTri() const
Returns upper triangle part of this matrix (including the diagonal).
Definition MatrixExpression-Impl.hpp:358
MatrixDiagonal< T, Rows, Cols, const Derived & > Diagonal() const
Returns diagonal part of this matrix.
Definition MatrixExpression-Impl.hpp:323
MatrixUnaryOp< U, Rows, Cols, const Derived &, TypeCast< T, U > > CastTo() const
ValueType Min() const
Definition MatrixExpression-Impl.hpp:99
MatrixTranspose< T, Rows, Cols, const Derived & > Transposed() const
Definition MatrixExpression-Impl.hpp:365
T Eval(size_t i, size_t j) const
Returns the evaluated value for (i, j).
Definition MatrixExpression-Impl.hpp:33
ValueType LengthSquared() const
Definition MatrixExpression-Impl.hpp:286
constexpr bool IsSquare() const
Returns true if this matrix is a square matrix.
Definition MatrixExpression-Impl.hpp:71
ValueType AbsMax() const
Definition MatrixExpression-Impl.hpp:162
MatrixTri< T, Rows, Cols, const Derived & > LowerTri() const
Returns lower triangle part of this matrix (including the diagonal).
Definition MatrixExpression-Impl.hpp:351
ValueType Norm() const
Definition MatrixExpression-Impl.hpp:250
ValueType DistanceSquaredTo(const MatrixExpression< T, R, C, E > &other) const
Returns the squared distance to the other vector.
size_t DominantAxis() const
Definition MatrixExpression-Impl.hpp:206
ValueType Max() const
Definition MatrixExpression-Impl.hpp:120
Matrix< T, Rows, Cols > Eval() const
Definition MatrixExpression-Impl.hpp:39
std::enable_if_t<(IsMatrixSizeDynamic< Rows, Cols >()||((Rows==2||Rows==3) &&Cols==1)) &&(IsMatrixSizeDynamic< R, C >()||((R==2||R==3) &&C==1)), Matrix< U, Rows, 1 > Reflected(const MatrixExpression< T, R, C, E > &normal) const
Returns the reflection vector to the surface with given surface normal.
Derived & GetDerived()
Returns actual implementation (the subclass).
Definition MatrixExpression-Impl.hpp:509
MatrixScalarElemWiseBinaryOp< T, Rows, Cols, const Derived &, std::divides< T > > Normalized() const
Definition MatrixExpression-Impl.hpp:315
MatrixOffDiagonal< T, Rows, Cols, const Derived & > OffDiagonal() const
Returns off-diagonal part of this matrix.
Definition MatrixExpression-Impl.hpp:330
MatrixTri< T, Rows, Cols, const Derived & > StrictUpperTri() const
Returns strictly upper triangle part of this matrix.
Definition MatrixExpression-Impl.hpp:344
ValueType Trace() const
Definition MatrixExpression-Impl.hpp:183
constexpr size_t GetCols() const
Definition Matrix-Impl.hpp:266
constexpr size_t GetRows() const
Definition Matrix-Impl.hpp:260
constexpr size_t GetRows() const
Definition MatrixExpression-Impl.hpp:1265
constexpr size_t GetCols() const
Definition MatrixExpression-Impl.hpp:1271
T operator()(size_t i, size_t j) const
Definition MatrixExpression-Impl.hpp:1277
constexpr size_t GetCols() const
Definition MatrixExpression-Impl.hpp:937
constexpr size_t GetRows() const
Definition MatrixExpression-Impl.hpp:931
T operator()(size_t i, size_t j) const
Definition MatrixExpression-Impl.hpp:943
constexpr size_t GetCols() const
Definition MatrixExpression-Impl.hpp:1128
constexpr T operator()(size_t i, size_t j) const
Definition MatrixExpression-Impl.hpp:1135
constexpr size_t GetRows() const
Definition MatrixExpression-Impl.hpp:1121
constexpr size_t GetRows() const
Definition MatrixExpression-Impl.hpp:1228
constexpr T operator()(size_t i, size_t j) const
Definition MatrixExpression-Impl.hpp:1244
constexpr size_t GetCols() const
Definition MatrixExpression-Impl.hpp:1236
constexpr T operator()(size_t i, size_t j) const
Definition MatrixExpression-Impl.hpp:999
constexpr size_t GetCols() const
Definition MatrixExpression-Impl.hpp:993
constexpr size_t GetRows() const
Definition MatrixExpression-Impl.hpp:987
constexpr size_t GetCols() const
Definition MatrixExpression-Impl.hpp:960
T operator()(size_t i, size_t j) const
Definition MatrixExpression-Impl.hpp:966
constexpr size_t GetRows() const
Definition MatrixExpression-Impl.hpp:954
constexpr size_t GetCols() const
Definition MatrixExpression-Impl.hpp:1012
constexpr size_t GetRows() const
Definition MatrixExpression-Impl.hpp:1006
constexpr T operator()(size_t i, size_t j) const
Definition MatrixExpression-Impl.hpp:1018
constexpr T operator()(size_t i, size_t j) const
Definition MatrixExpression-Impl.hpp:1188
constexpr size_t GetRows() const
Definition MatrixExpression-Impl.hpp:1174
constexpr size_t GetCols() const
Definition MatrixExpression-Impl.hpp:1181
Definition pybind11Utils.hpp:21
MatrixCSR< T > operator-(const MatrixCSR< T > &a)
Definition MatrixCSR-Impl.hpp:1031
constexpr auto Max(const MatrixExpression< T, Rows, Cols, M1 > &a, const MatrixExpression< T, Rows, Cols, M2 > &b)
Definition MatrixExpression-Impl.hpp:1112
constexpr auto Ceil(const MatrixExpression< T, Rows, Cols, M1 > &a)
Definition MatrixExpression-Impl.hpp:1025
constexpr auto Min(const MatrixExpression< T, Rows, Cols, M1 > &a, const MatrixExpression< T, Rows, Cols, M2 > &b)
Definition MatrixExpression-Impl.hpp:1103
constexpr auto ElemMul(const MatrixExpression< T, Rows, Cols, M1 > &a, const MatrixExpression< T, Rows, Cols, M2 > &b)
Definition MatrixExpression-Impl.hpp:1085
std::enable_if_t< std::is_arithmetic< T >::value, T > AbsMax(T x, T y)
Returns the absolute maximum value among the two inputs.
Definition MathUtils-Impl.hpp:84
std::enable_if_t< std::is_arithmetic< T >::value, T > Clamp(T val, T low, T high)
Returns the clamped value.
Definition MathUtils-Impl.hpp:166
constexpr auto Floor(const MatrixExpression< T, Rows, Cols, M1 > &a)
Definition MatrixExpression-Impl.hpp:1031
Matrix< T, Rows, 1 > Vector
Definition Matrix.hpp:738
MatrixCSR< T > operator+(const MatrixCSR< T > &a, const MatrixCSR< T > &b)
Definition MatrixCSR-Impl.hpp:1037
constexpr auto ElemDiv(const MatrixExpression< T, Rows, Cols, M1 > &a, const MatrixExpression< T, Rows, Cols, M2 > &b)
Definition MatrixExpression-Impl.hpp:1094
MatrixCSR< T > operator/(const MatrixCSR< T > &a, T b)
Definition MatrixCSR-Impl.hpp:1092
Vector< T, 3 > operator*(const Quaternion< T > &q, const Vector< T, 3 > &v)
Returns quaternion q * vector v.
Definition Quaternion-Impl.hpp:543
std::enable_if_t< std::is_arithmetic< T >::value, T > AbsMin(T x, T y)
Returns the absolute minimum value among the two inputs.
Definition MathUtils-Impl.hpp:78