@smake/eigen 1.0.1 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/eigen/COPYING.APACHE +203 -0
- package/eigen/COPYING.BSD +1 -1
- package/eigen/COPYING.MINPACK +51 -52
- package/eigen/Eigen/Cholesky +0 -1
- package/eigen/Eigen/Core +108 -266
- package/eigen/Eigen/Eigenvalues +0 -1
- package/eigen/Eigen/Geometry +3 -6
- package/eigen/Eigen/Householder +0 -1
- package/eigen/Eigen/Jacobi +0 -1
- package/eigen/Eigen/KLUSupport +41 -0
- package/eigen/Eigen/LU +2 -5
- package/eigen/Eigen/OrderingMethods +0 -3
- package/eigen/Eigen/PaStiXSupport +1 -0
- package/eigen/Eigen/PardisoSupport +0 -0
- package/eigen/Eigen/QR +0 -1
- package/eigen/Eigen/QtAlignedMalloc +0 -1
- package/eigen/Eigen/SVD +0 -1
- package/eigen/Eigen/Sparse +0 -2
- package/eigen/Eigen/SparseCholesky +0 -8
- package/eigen/Eigen/SparseLU +4 -0
- package/eigen/Eigen/src/Cholesky/LDLT.h +42 -27
- package/eigen/Eigen/src/Cholesky/LLT.h +39 -23
- package/eigen/Eigen/src/CholmodSupport/CholmodSupport.h +90 -47
- package/eigen/Eigen/src/Core/ArithmeticSequence.h +413 -0
- package/eigen/Eigen/src/Core/Array.h +99 -11
- package/eigen/Eigen/src/Core/ArrayBase.h +1 -1
- package/eigen/Eigen/src/Core/ArrayWrapper.h +21 -21
- package/eigen/Eigen/src/Core/Assign.h +1 -1
- package/eigen/Eigen/src/Core/AssignEvaluator.h +125 -50
- package/eigen/Eigen/src/Core/Assign_MKL.h +10 -10
- package/eigen/Eigen/src/Core/BandMatrix.h +16 -16
- package/eigen/Eigen/src/Core/Block.h +56 -60
- package/eigen/Eigen/src/Core/BooleanRedux.h +29 -31
- package/eigen/Eigen/src/Core/CommaInitializer.h +7 -3
- package/eigen/Eigen/src/Core/CoreEvaluators.h +325 -272
- package/eigen/Eigen/src/Core/CoreIterators.h +5 -0
- package/eigen/Eigen/src/Core/CwiseBinaryOp.h +21 -22
- package/eigen/Eigen/src/Core/CwiseNullaryOp.h +153 -18
- package/eigen/Eigen/src/Core/CwiseUnaryOp.h +6 -6
- package/eigen/Eigen/src/Core/CwiseUnaryView.h +12 -10
- package/eigen/Eigen/src/Core/DenseBase.h +128 -39
- package/eigen/Eigen/src/Core/DenseCoeffsBase.h +25 -21
- package/eigen/Eigen/src/Core/DenseStorage.h +150 -68
- package/eigen/Eigen/src/Core/Diagonal.h +21 -23
- package/eigen/Eigen/src/Core/DiagonalMatrix.h +50 -2
- package/eigen/Eigen/src/Core/DiagonalProduct.h +1 -1
- package/eigen/Eigen/src/Core/Dot.h +10 -10
- package/eigen/Eigen/src/Core/EigenBase.h +10 -9
- package/eigen/Eigen/src/Core/ForceAlignedAccess.h +8 -4
- package/eigen/Eigen/src/Core/Fuzzy.h +3 -3
- package/eigen/Eigen/src/Core/GeneralProduct.h +20 -10
- package/eigen/Eigen/src/Core/GenericPacketMath.h +597 -147
- package/eigen/Eigen/src/Core/GlobalFunctions.h +40 -33
- package/eigen/Eigen/src/Core/IO.h +40 -7
- package/eigen/Eigen/src/Core/IndexedView.h +237 -0
- package/eigen/Eigen/src/Core/Inverse.h +9 -10
- package/eigen/Eigen/src/Core/Map.h +7 -7
- package/eigen/Eigen/src/Core/MapBase.h +5 -3
- package/eigen/Eigen/src/Core/MathFunctions.h +756 -120
- package/eigen/Eigen/src/Core/MathFunctionsImpl.h +118 -19
- package/eigen/Eigen/src/Core/Matrix.h +131 -25
- package/eigen/Eigen/src/Core/MatrixBase.h +19 -2
- package/eigen/Eigen/src/Core/NestByValue.h +25 -50
- package/eigen/Eigen/src/Core/NoAlias.h +4 -3
- package/eigen/Eigen/src/Core/NumTraits.h +107 -20
- package/eigen/Eigen/src/Core/PartialReduxEvaluator.h +232 -0
- package/eigen/Eigen/src/Core/PermutationMatrix.h +3 -3
- package/eigen/Eigen/src/Core/PlainObjectBase.h +145 -54
- package/eigen/Eigen/src/Core/Product.h +30 -25
- package/eigen/Eigen/src/Core/ProductEvaluators.h +183 -142
- package/eigen/Eigen/src/Core/Random.h +37 -1
- package/eigen/Eigen/src/Core/Redux.h +180 -170
- package/eigen/Eigen/src/Core/Ref.h +118 -21
- package/eigen/Eigen/src/Core/Replicate.h +8 -8
- package/eigen/Eigen/src/Core/Reshaped.h +454 -0
- package/eigen/Eigen/src/Core/ReturnByValue.h +7 -5
- package/eigen/Eigen/src/Core/Reverse.h +18 -12
- package/eigen/Eigen/src/Core/Select.h +8 -6
- package/eigen/Eigen/src/Core/SelfAdjointView.h +33 -20
- package/eigen/Eigen/src/Core/Solve.h +14 -14
- package/eigen/Eigen/src/Core/SolveTriangular.h +13 -13
- package/eigen/Eigen/src/Core/SolverBase.h +41 -3
- package/eigen/Eigen/src/Core/StableNorm.h +100 -70
- package/eigen/Eigen/src/Core/StlIterators.h +463 -0
- package/eigen/Eigen/src/Core/Stride.h +9 -4
- package/eigen/Eigen/src/Core/Swap.h +5 -4
- package/eigen/Eigen/src/Core/Transpose.h +86 -27
- package/eigen/Eigen/src/Core/Transpositions.h +26 -8
- package/eigen/Eigen/src/Core/TriangularMatrix.h +88 -72
- package/eigen/Eigen/src/Core/VectorBlock.h +5 -5
- package/eigen/Eigen/src/Core/VectorwiseOp.h +159 -70
- package/eigen/Eigen/src/Core/Visitor.h +137 -29
- package/eigen/Eigen/src/Core/arch/AVX/Complex.h +50 -129
- package/eigen/Eigen/src/Core/arch/AVX/MathFunctions.h +126 -337
- package/eigen/Eigen/src/Core/arch/AVX/PacketMath.h +1092 -155
- package/eigen/Eigen/src/Core/arch/AVX/TypeCasting.h +65 -1
- package/eigen/Eigen/src/Core/arch/AVX512/Complex.h +422 -0
- package/eigen/Eigen/src/Core/arch/AVX512/MathFunctions.h +186 -213
- package/eigen/Eigen/src/Core/arch/AVX512/PacketMath.h +1250 -252
- package/eigen/Eigen/src/Core/arch/AVX512/TypeCasting.h +89 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/Complex.h +152 -165
- package/eigen/Eigen/src/Core/arch/AltiVec/MathFunctions.h +19 -251
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProduct.h +2937 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductCommon.h +221 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductMMA.h +629 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/PacketMath.h +2042 -392
- package/eigen/Eigen/src/Core/arch/CUDA/Complex.h +235 -80
- package/eigen/Eigen/src/Core/arch/Default/BFloat16.h +700 -0
- package/eigen/Eigen/src/Core/arch/Default/ConjHelper.h +102 -14
- package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h +1649 -0
- package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctionsFwd.h +110 -0
- package/eigen/Eigen/src/Core/arch/Default/Half.h +942 -0
- package/eigen/Eigen/src/Core/arch/Default/Settings.h +1 -1
- package/eigen/Eigen/src/Core/arch/Default/TypeCasting.h +120 -0
- package/eigen/Eigen/src/Core/arch/{CUDA → GPU}/MathFunctions.h +16 -4
- package/eigen/Eigen/src/Core/arch/GPU/PacketMath.h +1685 -0
- package/eigen/Eigen/src/Core/arch/GPU/TypeCasting.h +80 -0
- package/eigen/Eigen/src/Core/arch/HIP/hcc/math_constants.h +23 -0
- package/eigen/Eigen/src/Core/arch/MSA/Complex.h +648 -0
- package/eigen/Eigen/src/Core/arch/MSA/MathFunctions.h +387 -0
- package/eigen/Eigen/src/Core/arch/MSA/PacketMath.h +1233 -0
- package/eigen/Eigen/src/Core/arch/NEON/Complex.h +313 -219
- package/eigen/Eigen/src/Core/arch/NEON/GeneralBlockPanelKernel.h +183 -0
- package/eigen/Eigen/src/Core/arch/NEON/MathFunctions.h +54 -70
- package/eigen/Eigen/src/Core/arch/NEON/PacketMath.h +4376 -549
- package/eigen/Eigen/src/Core/arch/NEON/TypeCasting.h +1419 -0
- package/eigen/Eigen/src/Core/arch/SSE/Complex.h +59 -179
- package/eigen/Eigen/src/Core/arch/SSE/MathFunctions.h +65 -428
- package/eigen/Eigen/src/Core/arch/SSE/PacketMath.h +893 -283
- package/eigen/Eigen/src/Core/arch/SSE/TypeCasting.h +65 -0
- package/eigen/Eigen/src/Core/arch/SVE/MathFunctions.h +44 -0
- package/eigen/Eigen/src/Core/arch/SVE/PacketMath.h +752 -0
- package/eigen/Eigen/src/Core/arch/SVE/TypeCasting.h +49 -0
- package/eigen/Eigen/src/Core/arch/SYCL/InteropHeaders.h +232 -0
- package/eigen/Eigen/src/Core/arch/SYCL/MathFunctions.h +301 -0
- package/eigen/Eigen/src/Core/arch/SYCL/PacketMath.h +670 -0
- package/eigen/Eigen/src/Core/arch/SYCL/SyclMemoryModel.h +694 -0
- package/eigen/Eigen/src/Core/arch/SYCL/TypeCasting.h +85 -0
- package/eigen/Eigen/src/Core/arch/ZVector/Complex.h +212 -183
- package/eigen/Eigen/src/Core/arch/ZVector/MathFunctions.h +101 -5
- package/eigen/Eigen/src/Core/arch/ZVector/PacketMath.h +510 -395
- package/eigen/Eigen/src/Core/functors/AssignmentFunctors.h +11 -2
- package/eigen/Eigen/src/Core/functors/BinaryFunctors.h +112 -46
- package/eigen/Eigen/src/Core/functors/NullaryFunctors.h +31 -30
- package/eigen/Eigen/src/Core/functors/StlFunctors.h +32 -2
- package/eigen/Eigen/src/Core/functors/UnaryFunctors.h +354 -15
- package/eigen/Eigen/src/Core/products/GeneralBlockPanelKernel.h +1073 -585
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrix.h +29 -7
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h +4 -4
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_BLAS.h +1 -1
- package/eigen/Eigen/src/Core/products/GeneralMatrixVector.h +382 -483
- package/eigen/Eigen/src/Core/products/Parallelizer.h +23 -9
- package/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix.h +23 -6
- package/eigen/Eigen/src/Core/products/SelfadjointMatrixVector.h +8 -6
- package/eigen/Eigen/src/Core/products/SelfadjointProduct.h +2 -2
- package/eigen/Eigen/src/Core/products/SelfadjointRank2Update.h +5 -4
- package/eigen/Eigen/src/Core/products/TriangularMatrixMatrix.h +3 -3
- package/eigen/Eigen/src/Core/products/TriangularSolverMatrix.h +5 -3
- package/eigen/Eigen/src/Core/products/TriangularSolverVector.h +13 -10
- package/eigen/Eigen/src/Core/util/BlasUtil.h +208 -124
- package/eigen/Eigen/src/Core/util/ConfigureVectorization.h +512 -0
- package/eigen/Eigen/src/Core/util/Constants.h +25 -9
- package/eigen/Eigen/src/Core/util/DisableStupidWarnings.h +14 -2
- package/eigen/Eigen/src/Core/util/ForwardDeclarations.h +28 -4
- package/eigen/Eigen/src/Core/util/IndexedViewHelper.h +186 -0
- package/eigen/Eigen/src/Core/util/IntegralConstant.h +272 -0
- package/eigen/Eigen/src/Core/util/MKL_support.h +8 -1
- package/eigen/Eigen/src/Core/util/Macros.h +661 -250
- package/eigen/Eigen/src/Core/util/Memory.h +222 -52
- package/eigen/Eigen/src/Core/util/Meta.h +349 -105
- package/eigen/Eigen/src/Core/util/ReshapedHelper.h +51 -0
- package/eigen/Eigen/src/Core/util/StaticAssert.h +8 -5
- package/eigen/Eigen/src/Core/util/SymbolicIndex.h +293 -0
- package/eigen/Eigen/src/Core/util/XprHelper.h +48 -30
- package/eigen/Eigen/src/Eigenvalues/ComplexEigenSolver.h +1 -1
- package/eigen/Eigen/src/Eigenvalues/ComplexSchur.h +1 -1
- package/eigen/Eigen/src/Eigenvalues/EigenSolver.h +2 -2
- package/eigen/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h +1 -1
- package/eigen/Eigen/src/Eigenvalues/HessenbergDecomposition.h +2 -2
- package/eigen/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h +2 -2
- package/eigen/Eigen/src/Eigenvalues/RealQZ.h +9 -6
- package/eigen/Eigen/src/Eigenvalues/RealSchur.h +10 -5
- package/eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h +75 -42
- package/eigen/Eigen/src/Eigenvalues/Tridiagonalization.h +20 -15
- package/eigen/Eigen/src/Geometry/AlignedBox.h +99 -5
- package/eigen/Eigen/src/Geometry/AngleAxis.h +4 -4
- package/eigen/Eigen/src/Geometry/EulerAngles.h +3 -3
- package/eigen/Eigen/src/Geometry/Homogeneous.h +15 -11
- package/eigen/Eigen/src/Geometry/Hyperplane.h +1 -1
- package/eigen/Eigen/src/Geometry/OrthoMethods.h +3 -2
- package/eigen/Eigen/src/Geometry/ParametrizedLine.h +39 -2
- package/eigen/Eigen/src/Geometry/Quaternion.h +52 -14
- package/eigen/Eigen/src/Geometry/Rotation2D.h +3 -3
- package/eigen/Eigen/src/Geometry/Scaling.h +22 -4
- package/eigen/Eigen/src/Geometry/Transform.h +86 -65
- package/eigen/Eigen/src/Geometry/Translation.h +6 -6
- package/eigen/Eigen/src/Geometry/arch/Geometry_SIMD.h +168 -0
- package/eigen/Eigen/src/Householder/BlockHouseholder.h +9 -2
- package/eigen/Eigen/src/Householder/Householder.h +8 -4
- package/eigen/Eigen/src/Householder/HouseholderSequence.h +123 -48
- package/eigen/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h +15 -15
- package/eigen/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h +7 -23
- package/eigen/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h +5 -22
- package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h +41 -47
- package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h +51 -60
- package/eigen/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h +70 -20
- package/eigen/Eigen/src/IterativeLinearSolvers/LeastSquareConjugateGradient.h +2 -20
- package/eigen/Eigen/src/IterativeLinearSolvers/SolveWithGuess.h +11 -9
- package/eigen/Eigen/src/Jacobi/Jacobi.h +31 -10
- package/eigen/Eigen/src/KLUSupport/KLUSupport.h +358 -0
- package/eigen/Eigen/src/LU/Determinant.h +35 -19
- package/eigen/Eigen/src/LU/FullPivLU.h +29 -43
- package/eigen/Eigen/src/LU/InverseImpl.h +25 -8
- package/eigen/Eigen/src/LU/PartialPivLU.h +67 -57
- package/eigen/Eigen/src/LU/arch/InverseSize4.h +351 -0
- package/eigen/Eigen/src/OrderingMethods/Amd.h +7 -17
- package/eigen/Eigen/src/OrderingMethods/Eigen_Colamd.h +297 -277
- package/eigen/Eigen/src/OrderingMethods/Ordering.h +6 -10
- package/eigen/Eigen/src/PaStiXSupport/PaStiXSupport.h +1 -1
- package/eigen/Eigen/src/PardisoSupport/PardisoSupport.h +10 -9
- package/eigen/Eigen/src/QR/ColPivHouseholderQR.h +41 -20
- package/eigen/Eigen/src/QR/CompleteOrthogonalDecomposition.h +100 -27
- package/eigen/Eigen/src/QR/FullPivHouseholderQR.h +59 -22
- package/eigen/Eigen/src/QR/HouseholderQR.h +48 -23
- package/eigen/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h +25 -3
- package/eigen/Eigen/src/SVD/BDCSVD.h +137 -48
- package/eigen/Eigen/src/SVD/JacobiSVD.h +22 -14
- package/eigen/Eigen/src/SVD/SVDBase.h +82 -21
- package/eigen/Eigen/src/SVD/UpperBidiagonalization.h +3 -3
- package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky.h +16 -8
- package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h +11 -36
- package/eigen/Eigen/src/SparseCore/CompressedStorage.h +16 -0
- package/eigen/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h +6 -6
- package/eigen/Eigen/src/SparseCore/SparseAssign.h +81 -27
- package/eigen/Eigen/src/SparseCore/SparseBlock.h +25 -57
- package/eigen/Eigen/src/SparseCore/SparseCompressedBase.h +40 -11
- package/eigen/Eigen/src/SparseCore/SparseCwiseBinaryOp.h +11 -15
- package/eigen/Eigen/src/SparseCore/SparseCwiseUnaryOp.h +2 -2
- package/eigen/Eigen/src/SparseCore/SparseDenseProduct.h +30 -8
- package/eigen/Eigen/src/SparseCore/SparseMatrix.h +124 -10
- package/eigen/Eigen/src/SparseCore/SparseMatrixBase.h +5 -12
- package/eigen/Eigen/src/SparseCore/SparseProduct.h +13 -1
- package/eigen/Eigen/src/SparseCore/SparseRef.h +7 -7
- package/eigen/Eigen/src/SparseCore/SparseSelfAdjointView.h +3 -0
- package/eigen/Eigen/src/SparseCore/SparseUtil.h +8 -0
- package/eigen/Eigen/src/SparseCore/SparseVector.h +1 -1
- package/eigen/Eigen/src/SparseLU/SparseLU.h +160 -10
- package/eigen/Eigen/src/SparseLU/SparseLU_Memory.h +1 -1
- package/eigen/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h +76 -2
- package/eigen/Eigen/src/SparseLU/SparseLU_column_dfs.h +2 -2
- package/eigen/Eigen/src/SparseLU/SparseLU_gemm_kernel.h +1 -1
- package/eigen/Eigen/src/SparseLU/SparseLU_panel_bmod.h +1 -1
- package/eigen/Eigen/src/SparseQR/SparseQR.h +19 -6
- package/eigen/Eigen/src/StlSupport/StdDeque.h +2 -14
- package/eigen/Eigen/src/StlSupport/StdList.h +2 -2
- package/eigen/Eigen/src/StlSupport/StdVector.h +2 -2
- package/eigen/Eigen/src/SuperLUSupport/SuperLUSupport.h +6 -8
- package/eigen/Eigen/src/UmfPackSupport/UmfPackSupport.h +175 -39
- package/eigen/Eigen/src/misc/lapacke.h +5 -4
- package/eigen/Eigen/src/plugins/ArrayCwiseBinaryOps.h +27 -1
- package/eigen/Eigen/src/plugins/ArrayCwiseUnaryOps.h +155 -11
- package/eigen/Eigen/src/plugins/BlockMethods.h +626 -242
- package/eigen/Eigen/src/plugins/CommonCwiseUnaryOps.h +14 -0
- package/eigen/Eigen/src/plugins/IndexedViewMethods.h +262 -0
- package/eigen/Eigen/src/plugins/MatrixCwiseBinaryOps.h +4 -4
- package/eigen/Eigen/src/plugins/MatrixCwiseUnaryOps.h +10 -0
- package/eigen/Eigen/src/plugins/ReshapedMethods.h +149 -0
- package/eigen/README.md +2 -0
- package/lib/LibEigen.d.ts +4 -0
- package/lib/LibEigen.js +14 -0
- package/lib/index.d.ts +1 -1
- package/lib/index.js +7 -3
- package/package.json +2 -10
- package/eigen/Eigen/CMakeLists.txt +0 -19
- package/eigen/Eigen/src/Core/arch/CUDA/Half.h +0 -675
- package/eigen/Eigen/src/Core/arch/CUDA/PacketMath.h +0 -333
- package/eigen/Eigen/src/Core/arch/CUDA/PacketMathHalf.h +0 -1124
- package/eigen/Eigen/src/Core/arch/CUDA/TypeCasting.h +0 -212
- package/eigen/Eigen/src/Geometry/arch/Geometry_SSE.h +0 -161
- package/eigen/Eigen/src/LU/arch/Inverse_SSE.h +0 -338
- package/lib/eigen.d.ts +0 -2
- package/lib/eigen.js +0 -15
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
#ifndef EIGEN_TRANSFORM_H
|
|
13
13
|
#define EIGEN_TRANSFORM_H
|
|
14
14
|
|
|
15
|
-
namespace Eigen {
|
|
15
|
+
namespace Eigen {
|
|
16
16
|
|
|
17
17
|
namespace internal {
|
|
18
18
|
|
|
@@ -47,7 +47,7 @@ struct transform_left_product_impl;
|
|
|
47
47
|
|
|
48
48
|
template< typename Lhs,
|
|
49
49
|
typename Rhs,
|
|
50
|
-
bool AnyProjective =
|
|
50
|
+
bool AnyProjective =
|
|
51
51
|
transform_traits<Lhs>::IsProjective ||
|
|
52
52
|
transform_traits<Rhs>::IsProjective>
|
|
53
53
|
struct transform_transform_product_impl;
|
|
@@ -97,6 +97,9 @@ template<int Mode> struct transform_make_affine;
|
|
|
97
97
|
* - #AffineCompact: the transformation is stored as a (Dim)x(Dim+1) matrix.
|
|
98
98
|
* - #Projective: the transformation is stored as a (Dim+1)^2 matrix
|
|
99
99
|
* without any assumption.
|
|
100
|
+
* - #Isometry: same as #Affine with the additional assumption that
|
|
101
|
+
* the linear part represents a rotation. This assumption is exploited
|
|
102
|
+
* to speed up some functions such as inverse() and rotation().
|
|
100
103
|
* \tparam _Options has the same meaning as in class Matrix. It allows to specify DontAlign and/or RowMajor.
|
|
101
104
|
* These Options are passed directly to the underlying matrix type.
|
|
102
105
|
*
|
|
@@ -115,7 +118,7 @@ template<int Mode> struct transform_make_affine;
|
|
|
115
118
|
* \end{array} \right) \f$
|
|
116
119
|
*
|
|
117
120
|
* Note that for a projective transformation the last row can be anything,
|
|
118
|
-
* and then the interpretation of different parts might be
|
|
121
|
+
* and then the interpretation of different parts might be slightly different.
|
|
119
122
|
*
|
|
120
123
|
* However, unlike a plain matrix, the Transform class provides many features
|
|
121
124
|
* simplifying both its assembly and usage. In particular, it can be composed
|
|
@@ -220,9 +223,9 @@ public:
|
|
|
220
223
|
/** type of the matrix used to represent the linear part of the transformation */
|
|
221
224
|
typedef Matrix<Scalar,Dim,Dim,Options> LinearMatrixType;
|
|
222
225
|
/** type of read/write reference to the linear part of the transformation */
|
|
223
|
-
typedef Block<MatrixType,Dim,Dim,int(Mode)==(AffineCompact) && (Options&RowMajor)==0> LinearPart;
|
|
226
|
+
typedef Block<MatrixType,Dim,Dim,int(Mode)==(AffineCompact) && (int(Options)&RowMajor)==0> LinearPart;
|
|
224
227
|
/** type of read reference to the linear part of the transformation */
|
|
225
|
-
typedef const Block<ConstMatrixType,Dim,Dim,int(Mode)==(AffineCompact) && (Options&RowMajor)==0> ConstLinearPart;
|
|
228
|
+
typedef const Block<ConstMatrixType,Dim,Dim,int(Mode)==(AffineCompact) && (int(Options)&RowMajor)==0> ConstLinearPart;
|
|
226
229
|
/** type of read/write reference to the affine part of the transformation */
|
|
227
230
|
typedef typename internal::conditional<int(Mode)==int(AffineCompact),
|
|
228
231
|
MatrixType&,
|
|
@@ -239,7 +242,7 @@ public:
|
|
|
239
242
|
typedef const Block<ConstMatrixType,Dim,1,!(internal::traits<MatrixType>::Flags & RowMajorBit)> ConstTranslationPart;
|
|
240
243
|
/** corresponding translation type */
|
|
241
244
|
typedef Translation<Scalar,Dim> TranslationType;
|
|
242
|
-
|
|
245
|
+
|
|
243
246
|
// this intermediate enum is needed to avoid an ICE with gcc 3.4 and 4.0
|
|
244
247
|
enum { TransformTimeDiagonalMode = ((Mode==int(Isometry))?Affine:int(Mode)) };
|
|
245
248
|
/** The return type of the product between a diagonal matrix and a transform */
|
|
@@ -259,12 +262,6 @@ public:
|
|
|
259
262
|
internal::transform_make_affine<(int(Mode)==Affine || int(Mode)==Isometry) ? Affine : AffineCompact>::run(m_matrix);
|
|
260
263
|
}
|
|
261
264
|
|
|
262
|
-
EIGEN_DEVICE_FUNC inline Transform(const Transform& other)
|
|
263
|
-
{
|
|
264
|
-
check_template_params();
|
|
265
|
-
m_matrix = other.m_matrix;
|
|
266
|
-
}
|
|
267
|
-
|
|
268
265
|
EIGEN_DEVICE_FUNC inline explicit Transform(const TranslationType& t)
|
|
269
266
|
{
|
|
270
267
|
check_template_params();
|
|
@@ -282,9 +279,6 @@ public:
|
|
|
282
279
|
*this = r;
|
|
283
280
|
}
|
|
284
281
|
|
|
285
|
-
EIGEN_DEVICE_FUNC inline Transform& operator=(const Transform& other)
|
|
286
|
-
{ m_matrix = other.m_matrix; return *this; }
|
|
287
|
-
|
|
288
282
|
typedef internal::transform_take_affine_part<Transform> take_affine_part;
|
|
289
283
|
|
|
290
284
|
/** Constructs and initializes a transformation from a Dim^2 or a (Dim+1)^2 matrix. */
|
|
@@ -308,7 +302,7 @@ public:
|
|
|
308
302
|
internal::transform_construct_from_matrix<OtherDerived,Mode,Options,Dim,HDim>::run(this, other.derived());
|
|
309
303
|
return *this;
|
|
310
304
|
}
|
|
311
|
-
|
|
305
|
+
|
|
312
306
|
template<int OtherOptions>
|
|
313
307
|
EIGEN_DEVICE_FUNC inline Transform(const Transform<Scalar,Dim,Mode,OtherOptions>& other)
|
|
314
308
|
{
|
|
@@ -335,7 +329,7 @@ public:
|
|
|
335
329
|
OtherModeIsAffineCompact = OtherMode == int(AffineCompact)
|
|
336
330
|
};
|
|
337
331
|
|
|
338
|
-
if(ModeIsAffineCompact == OtherModeIsAffineCompact)
|
|
332
|
+
if(EIGEN_CONST_CONDITIONAL(ModeIsAffineCompact == OtherModeIsAffineCompact))
|
|
339
333
|
{
|
|
340
334
|
// We need the block expression because the code is compiled for all
|
|
341
335
|
// combinations of transformations and will trigger a compile time error
|
|
@@ -343,7 +337,7 @@ public:
|
|
|
343
337
|
m_matrix.template block<Dim,Dim+1>(0,0) = other.matrix().template block<Dim,Dim+1>(0,0);
|
|
344
338
|
makeAffine();
|
|
345
339
|
}
|
|
346
|
-
else if(OtherModeIsAffineCompact)
|
|
340
|
+
else if(EIGEN_CONST_CONDITIONAL(OtherModeIsAffineCompact))
|
|
347
341
|
{
|
|
348
342
|
typedef typename Transform<Scalar,Dim,OtherMode,OtherOptions>::MatrixType OtherMatrixType;
|
|
349
343
|
internal::transform_construct_from_matrix<OtherMatrixType,Mode,Options,Dim,HDim>::run(this, other.matrix());
|
|
@@ -380,9 +374,9 @@ public:
|
|
|
380
374
|
inline Transform& operator=(const QTransform& other);
|
|
381
375
|
inline QTransform toQTransform(void) const;
|
|
382
376
|
#endif
|
|
383
|
-
|
|
384
|
-
EIGEN_DEVICE_FUNC Index rows() const { return int(Mode)==int(Projective) ? m_matrix.cols() : (m_matrix.cols()-1); }
|
|
385
|
-
EIGEN_DEVICE_FUNC Index cols() const { return m_matrix.cols(); }
|
|
377
|
+
|
|
378
|
+
EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT { return int(Mode)==int(Projective) ? m_matrix.cols() : (m_matrix.cols()-1); }
|
|
379
|
+
EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT { return m_matrix.cols(); }
|
|
386
380
|
|
|
387
381
|
/** shortcut for m_matrix(row,col);
|
|
388
382
|
* \sa MatrixBase::operator(Index,Index) const */
|
|
@@ -456,7 +450,7 @@ public:
|
|
|
456
450
|
/** \returns The product expression of a transform \a a times a diagonal matrix \a b
|
|
457
451
|
*
|
|
458
452
|
* The rhs diagonal matrix is interpreted as an affine scaling transformation. The
|
|
459
|
-
* product results in a Transform of the same type (mode) as the lhs only if the lhs
|
|
453
|
+
* product results in a Transform of the same type (mode) as the lhs only if the lhs
|
|
460
454
|
* mode is no isometry. In that case, the returned transform is an affinity.
|
|
461
455
|
*/
|
|
462
456
|
template<typename DiagonalDerived>
|
|
@@ -471,7 +465,7 @@ public:
|
|
|
471
465
|
/** \returns The product expression of a diagonal matrix \a a times a transform \a b
|
|
472
466
|
*
|
|
473
467
|
* The lhs diagonal matrix is interpreted as an affine scaling transformation. The
|
|
474
|
-
* product results in a Transform of the same type (mode) as the lhs only if the lhs
|
|
468
|
+
* product results in a Transform of the same type (mode) as the lhs only if the lhs
|
|
475
469
|
* mode is no isometry. In that case, the returned transform is an affinity.
|
|
476
470
|
*/
|
|
477
471
|
template<typename DiagonalDerived>
|
|
@@ -481,7 +475,7 @@ public:
|
|
|
481
475
|
TransformTimeDiagonalReturnType res;
|
|
482
476
|
res.linear().noalias() = a*b.linear();
|
|
483
477
|
res.translation().noalias() = a*b.translation();
|
|
484
|
-
if (Mode!=int(AffineCompact))
|
|
478
|
+
if (EIGEN_CONST_CONDITIONAL(Mode!=int(AffineCompact)))
|
|
485
479
|
res.matrix().row(Dim) = b.matrix().row(Dim);
|
|
486
480
|
return res;
|
|
487
481
|
}
|
|
@@ -494,7 +488,7 @@ public:
|
|
|
494
488
|
{
|
|
495
489
|
return internal::transform_transform_product_impl<Transform,Transform>::run(*this,other);
|
|
496
490
|
}
|
|
497
|
-
|
|
491
|
+
|
|
498
492
|
#if EIGEN_COMP_ICC
|
|
499
493
|
private:
|
|
500
494
|
// this intermediate structure permits to workaround a bug in ICC 11:
|
|
@@ -503,13 +497,13 @@ private:
|
|
|
503
497
|
// (the meaning of a name may have changed since the template declaration -- the type of the template is:
|
|
504
498
|
// "Eigen::internal::transform_transform_product_impl<Eigen::Transform<double, 3, 32, 0>,
|
|
505
499
|
// Eigen::Transform<double, 3, Mode, Options>, <expression>>::ResultType (const Eigen::Transform<double, 3, Mode, Options> &) const")
|
|
506
|
-
//
|
|
500
|
+
//
|
|
507
501
|
template<int OtherMode,int OtherOptions> struct icc_11_workaround
|
|
508
502
|
{
|
|
509
503
|
typedef internal::transform_transform_product_impl<Transform,Transform<Scalar,Dim,OtherMode,OtherOptions> > ProductType;
|
|
510
504
|
typedef typename ProductType::ResultType ResultType;
|
|
511
505
|
};
|
|
512
|
-
|
|
506
|
+
|
|
513
507
|
public:
|
|
514
508
|
/** Concatenates two different transformations */
|
|
515
509
|
template<int OtherMode,int OtherOptions>
|
|
@@ -542,7 +536,7 @@ public:
|
|
|
542
536
|
}
|
|
543
537
|
|
|
544
538
|
template<typename OtherDerived>
|
|
545
|
-
EIGEN_DEVICE_FUNC
|
|
539
|
+
EIGEN_DEVICE_FUNC
|
|
546
540
|
inline Transform& scale(const MatrixBase<OtherDerived> &other);
|
|
547
541
|
|
|
548
542
|
template<typename OtherDerived>
|
|
@@ -572,18 +566,18 @@ public:
|
|
|
572
566
|
EIGEN_DEVICE_FUNC Transform& preshear(const Scalar& sx, const Scalar& sy);
|
|
573
567
|
|
|
574
568
|
EIGEN_DEVICE_FUNC inline Transform& operator=(const TranslationType& t);
|
|
575
|
-
|
|
569
|
+
|
|
576
570
|
EIGEN_DEVICE_FUNC
|
|
577
571
|
inline Transform& operator*=(const TranslationType& t) { return translate(t.vector()); }
|
|
578
|
-
|
|
572
|
+
|
|
579
573
|
EIGEN_DEVICE_FUNC inline Transform operator*(const TranslationType& t) const;
|
|
580
574
|
|
|
581
|
-
EIGEN_DEVICE_FUNC
|
|
575
|
+
EIGEN_DEVICE_FUNC
|
|
582
576
|
inline Transform& operator=(const UniformScaling<Scalar>& t);
|
|
583
|
-
|
|
577
|
+
|
|
584
578
|
EIGEN_DEVICE_FUNC
|
|
585
579
|
inline Transform& operator*=(const UniformScaling<Scalar>& s) { return scale(s.factor()); }
|
|
586
|
-
|
|
580
|
+
|
|
587
581
|
EIGEN_DEVICE_FUNC
|
|
588
582
|
inline TransformTimeDiagonalReturnType operator*(const UniformScaling<Scalar>& s) const
|
|
589
583
|
{
|
|
@@ -602,7 +596,9 @@ public:
|
|
|
602
596
|
template<typename Derived>
|
|
603
597
|
EIGEN_DEVICE_FUNC inline Transform operator*(const RotationBase<Derived,Dim>& r) const;
|
|
604
598
|
|
|
605
|
-
|
|
599
|
+
typedef typename internal::conditional<int(Mode)==Isometry,ConstLinearPart,const LinearMatrixType>::type RotationReturnType;
|
|
600
|
+
EIGEN_DEVICE_FUNC RotationReturnType rotation() const;
|
|
601
|
+
|
|
606
602
|
template<typename RotationMatrixType, typename ScalingMatrixType>
|
|
607
603
|
EIGEN_DEVICE_FUNC
|
|
608
604
|
void computeRotationScaling(RotationMatrixType *rotation, ScalingMatrixType *scaling) const;
|
|
@@ -684,7 +680,7 @@ public:
|
|
|
684
680
|
#ifdef EIGEN_TRANSFORM_PLUGIN
|
|
685
681
|
#include EIGEN_TRANSFORM_PLUGIN
|
|
686
682
|
#endif
|
|
687
|
-
|
|
683
|
+
|
|
688
684
|
protected:
|
|
689
685
|
#ifndef EIGEN_PARSED_BY_DOXYGEN
|
|
690
686
|
EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void check_template_params()
|
|
@@ -755,7 +751,7 @@ template<typename Scalar, int Dim, int Mode,int Options>
|
|
|
755
751
|
Transform<Scalar,Dim,Mode,Options>& Transform<Scalar,Dim,Mode,Options>::operator=(const QMatrix& other)
|
|
756
752
|
{
|
|
757
753
|
EIGEN_STATIC_ASSERT(Dim==2, YOU_MADE_A_PROGRAMMING_MISTAKE)
|
|
758
|
-
if (Mode == int(AffineCompact))
|
|
754
|
+
if (EIGEN_CONST_CONDITIONAL(Mode == int(AffineCompact)))
|
|
759
755
|
m_matrix << other.m11(), other.m21(), other.dx(),
|
|
760
756
|
other.m12(), other.m22(), other.dy();
|
|
761
757
|
else
|
|
@@ -801,7 +797,7 @@ Transform<Scalar,Dim,Mode,Options>& Transform<Scalar,Dim,Mode,Options>::operator
|
|
|
801
797
|
{
|
|
802
798
|
check_template_params();
|
|
803
799
|
EIGEN_STATIC_ASSERT(Dim==2, YOU_MADE_A_PROGRAMMING_MISTAKE)
|
|
804
|
-
if (Mode == int(AffineCompact))
|
|
800
|
+
if (EIGEN_CONST_CONDITIONAL(Mode == int(AffineCompact)))
|
|
805
801
|
m_matrix << other.m11(), other.m21(), other.dx(),
|
|
806
802
|
other.m12(), other.m22(), other.dy();
|
|
807
803
|
else
|
|
@@ -819,7 +815,7 @@ template<typename Scalar, int Dim, int Mode, int Options>
|
|
|
819
815
|
QTransform Transform<Scalar,Dim,Mode,Options>::toQTransform(void) const
|
|
820
816
|
{
|
|
821
817
|
EIGEN_STATIC_ASSERT(Dim==2, YOU_MADE_A_PROGRAMMING_MISTAKE)
|
|
822
|
-
if (Mode == int(AffineCompact))
|
|
818
|
+
if (EIGEN_CONST_CONDITIONAL(Mode == int(AffineCompact)))
|
|
823
819
|
return QTransform(m_matrix.coeff(0,0), m_matrix.coeff(1,0),
|
|
824
820
|
m_matrix.coeff(0,1), m_matrix.coeff(1,1),
|
|
825
821
|
m_matrix.coeff(0,2), m_matrix.coeff(1,2));
|
|
@@ -912,7 +908,7 @@ EIGEN_DEVICE_FUNC Transform<Scalar,Dim,Mode,Options>&
|
|
|
912
908
|
Transform<Scalar,Dim,Mode,Options>::pretranslate(const MatrixBase<OtherDerived> &other)
|
|
913
909
|
{
|
|
914
910
|
EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(OtherDerived,int(Dim))
|
|
915
|
-
if(int(Mode)==int(Projective))
|
|
911
|
+
if(EIGEN_CONST_CONDITIONAL(int(Mode)==int(Projective)))
|
|
916
912
|
affine() += other * m_matrix.row(Dim);
|
|
917
913
|
else
|
|
918
914
|
translation() += other;
|
|
@@ -1046,20 +1042,43 @@ EIGEN_DEVICE_FUNC inline Transform<Scalar,Dim,Mode,Options> Transform<Scalar,Dim
|
|
|
1046
1042
|
*** Special functions ***
|
|
1047
1043
|
************************/
|
|
1048
1044
|
|
|
1045
|
+
namespace internal {
|
|
1046
|
+
template<int Mode> struct transform_rotation_impl {
|
|
1047
|
+
template<typename TransformType>
|
|
1048
|
+
EIGEN_DEVICE_FUNC static inline
|
|
1049
|
+
const typename TransformType::LinearMatrixType run(const TransformType& t)
|
|
1050
|
+
{
|
|
1051
|
+
typedef typename TransformType::LinearMatrixType LinearMatrixType;
|
|
1052
|
+
LinearMatrixType result;
|
|
1053
|
+
t.computeRotationScaling(&result, (LinearMatrixType*)0);
|
|
1054
|
+
return result;
|
|
1055
|
+
}
|
|
1056
|
+
};
|
|
1057
|
+
template<> struct transform_rotation_impl<Isometry> {
|
|
1058
|
+
template<typename TransformType>
|
|
1059
|
+
EIGEN_DEVICE_FUNC static inline
|
|
1060
|
+
typename TransformType::ConstLinearPart run(const TransformType& t)
|
|
1061
|
+
{
|
|
1062
|
+
return t.linear();
|
|
1063
|
+
}
|
|
1064
|
+
};
|
|
1065
|
+
}
|
|
1049
1066
|
/** \returns the rotation part of the transformation
|
|
1050
1067
|
*
|
|
1068
|
+
* If Mode==Isometry, then this method is an alias for linear(),
|
|
1069
|
+
* otherwise it calls computeRotationScaling() to extract the rotation
|
|
1070
|
+
* through a SVD decomposition.
|
|
1051
1071
|
*
|
|
1052
1072
|
* \svd_module
|
|
1053
1073
|
*
|
|
1054
1074
|
* \sa computeRotationScaling(), computeScalingRotation(), class SVD
|
|
1055
1075
|
*/
|
|
1056
1076
|
template<typename Scalar, int Dim, int Mode, int Options>
|
|
1057
|
-
EIGEN_DEVICE_FUNC
|
|
1077
|
+
EIGEN_DEVICE_FUNC
|
|
1078
|
+
typename Transform<Scalar,Dim,Mode,Options>::RotationReturnType
|
|
1058
1079
|
Transform<Scalar,Dim,Mode,Options>::rotation() const
|
|
1059
1080
|
{
|
|
1060
|
-
|
|
1061
|
-
computeRotationScaling(&result, (LinearMatrixType*)0);
|
|
1062
|
-
return result;
|
|
1081
|
+
return internal::transform_rotation_impl<Mode>::run(*this);
|
|
1063
1082
|
}
|
|
1064
1083
|
|
|
1065
1084
|
|
|
@@ -1078,17 +1097,18 @@ template<typename Scalar, int Dim, int Mode, int Options>
|
|
|
1078
1097
|
template<typename RotationMatrixType, typename ScalingMatrixType>
|
|
1079
1098
|
EIGEN_DEVICE_FUNC void Transform<Scalar,Dim,Mode,Options>::computeRotationScaling(RotationMatrixType *rotation, ScalingMatrixType *scaling) const
|
|
1080
1099
|
{
|
|
1100
|
+
// Note that JacobiSVD is faster than BDCSVD for small matrices.
|
|
1081
1101
|
JacobiSVD<LinearMatrixType> svd(linear(), ComputeFullU | ComputeFullV);
|
|
1082
1102
|
|
|
1083
|
-
Scalar x = (svd.matrixU() * svd.matrixV().adjoint()).determinant(); // so x has absolute value 1
|
|
1103
|
+
Scalar x = (svd.matrixU() * svd.matrixV().adjoint()).determinant() < Scalar(0) ? Scalar(-1) : Scalar(1); // so x has absolute value 1
|
|
1084
1104
|
VectorType sv(svd.singularValues());
|
|
1085
|
-
sv.coeffRef(
|
|
1086
|
-
if(scaling) scaling
|
|
1105
|
+
sv.coeffRef(Dim-1) *= x;
|
|
1106
|
+
if(scaling) *scaling = svd.matrixV() * sv.asDiagonal() * svd.matrixV().adjoint();
|
|
1087
1107
|
if(rotation)
|
|
1088
1108
|
{
|
|
1089
1109
|
LinearMatrixType m(svd.matrixU());
|
|
1090
|
-
m.col(
|
|
1091
|
-
rotation
|
|
1110
|
+
m.col(Dim-1) *= x;
|
|
1111
|
+
*rotation = m * svd.matrixV().adjoint();
|
|
1092
1112
|
}
|
|
1093
1113
|
}
|
|
1094
1114
|
|
|
@@ -1107,17 +1127,18 @@ template<typename Scalar, int Dim, int Mode, int Options>
|
|
|
1107
1127
|
template<typename ScalingMatrixType, typename RotationMatrixType>
|
|
1108
1128
|
EIGEN_DEVICE_FUNC void Transform<Scalar,Dim,Mode,Options>::computeScalingRotation(ScalingMatrixType *scaling, RotationMatrixType *rotation) const
|
|
1109
1129
|
{
|
|
1130
|
+
// Note that JacobiSVD is faster than BDCSVD for small matrices.
|
|
1110
1131
|
JacobiSVD<LinearMatrixType> svd(linear(), ComputeFullU | ComputeFullV);
|
|
1111
1132
|
|
|
1112
|
-
Scalar x = (svd.matrixU() * svd.matrixV().adjoint()).determinant(); // so x has absolute value 1
|
|
1133
|
+
Scalar x = (svd.matrixU() * svd.matrixV().adjoint()).determinant() < Scalar(0) ? Scalar(-1) : Scalar(1); // so x has absolute value 1
|
|
1113
1134
|
VectorType sv(svd.singularValues());
|
|
1114
|
-
sv.coeffRef(
|
|
1115
|
-
if(scaling) scaling
|
|
1135
|
+
sv.coeffRef(Dim-1) *= x;
|
|
1136
|
+
if(scaling) *scaling = svd.matrixU() * sv.asDiagonal() * svd.matrixU().adjoint();
|
|
1116
1137
|
if(rotation)
|
|
1117
1138
|
{
|
|
1118
1139
|
LinearMatrixType m(svd.matrixU());
|
|
1119
|
-
m.col(
|
|
1120
|
-
rotation
|
|
1140
|
+
m.col(Dim-1) *= x;
|
|
1141
|
+
*rotation = m * svd.matrixV().adjoint();
|
|
1121
1142
|
}
|
|
1122
1143
|
}
|
|
1123
1144
|
|
|
@@ -1156,7 +1177,7 @@ struct transform_make_affine<AffineCompact>
|
|
|
1156
1177
|
{
|
|
1157
1178
|
template<typename MatrixType> EIGEN_DEVICE_FUNC static void run(MatrixType &) { }
|
|
1158
1179
|
};
|
|
1159
|
-
|
|
1180
|
+
|
|
1160
1181
|
// selector needed to avoid taking the inverse of a 3x4 matrix
|
|
1161
1182
|
template<typename TransformType, int Mode=TransformType::Mode>
|
|
1162
1183
|
struct projective_transform_inverse
|
|
@@ -1297,8 +1318,8 @@ struct transform_construct_from_matrix<Other, AffineCompact,Options,Dim,HDim, HD
|
|
|
1297
1318
|
template<int LhsMode,int RhsMode>
|
|
1298
1319
|
struct transform_product_result
|
|
1299
1320
|
{
|
|
1300
|
-
enum
|
|
1301
|
-
{
|
|
1321
|
+
enum
|
|
1322
|
+
{
|
|
1302
1323
|
Mode =
|
|
1303
1324
|
(LhsMode == (int)Projective || RhsMode == (int)Projective ) ? Projective :
|
|
1304
1325
|
(LhsMode == (int)Affine || RhsMode == (int)Affine ) ? Affine :
|
|
@@ -1312,7 +1333,7 @@ struct transform_right_product_impl< TransformType, MatrixType, 0, RhsCols>
|
|
|
1312
1333
|
{
|
|
1313
1334
|
typedef typename MatrixType::PlainObject ResultType;
|
|
1314
1335
|
|
|
1315
|
-
static EIGEN_STRONG_INLINE ResultType run(const TransformType& T, const MatrixType& other)
|
|
1336
|
+
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ResultType run(const TransformType& T, const MatrixType& other)
|
|
1316
1337
|
{
|
|
1317
1338
|
return T.matrix() * other;
|
|
1318
1339
|
}
|
|
@@ -1321,8 +1342,8 @@ struct transform_right_product_impl< TransformType, MatrixType, 0, RhsCols>
|
|
|
1321
1342
|
template< typename TransformType, typename MatrixType, int RhsCols>
|
|
1322
1343
|
struct transform_right_product_impl< TransformType, MatrixType, 1, RhsCols>
|
|
1323
1344
|
{
|
|
1324
|
-
enum {
|
|
1325
|
-
Dim = TransformType::Dim,
|
|
1345
|
+
enum {
|
|
1346
|
+
Dim = TransformType::Dim,
|
|
1326
1347
|
HDim = TransformType::HDim,
|
|
1327
1348
|
OtherRows = MatrixType::RowsAtCompileTime,
|
|
1328
1349
|
OtherCols = MatrixType::ColsAtCompileTime
|
|
@@ -1330,7 +1351,7 @@ struct transform_right_product_impl< TransformType, MatrixType, 1, RhsCols>
|
|
|
1330
1351
|
|
|
1331
1352
|
typedef typename MatrixType::PlainObject ResultType;
|
|
1332
1353
|
|
|
1333
|
-
static EIGEN_STRONG_INLINE ResultType run(const TransformType& T, const MatrixType& other)
|
|
1354
|
+
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ResultType run(const TransformType& T, const MatrixType& other)
|
|
1334
1355
|
{
|
|
1335
1356
|
EIGEN_STATIC_ASSERT(OtherRows==HDim, YOU_MIXED_MATRICES_OF_DIFFERENT_SIZES);
|
|
1336
1357
|
|
|
@@ -1339,7 +1360,7 @@ struct transform_right_product_impl< TransformType, MatrixType, 1, RhsCols>
|
|
|
1339
1360
|
ResultType res(other.rows(),other.cols());
|
|
1340
1361
|
TopLeftLhs(res, 0, 0, Dim, other.cols()).noalias() = T.affine() * other;
|
|
1341
1362
|
res.row(OtherRows-1) = other.row(OtherRows-1);
|
|
1342
|
-
|
|
1363
|
+
|
|
1343
1364
|
return res;
|
|
1344
1365
|
}
|
|
1345
1366
|
};
|
|
@@ -1347,8 +1368,8 @@ struct transform_right_product_impl< TransformType, MatrixType, 1, RhsCols>
|
|
|
1347
1368
|
template< typename TransformType, typename MatrixType, int RhsCols>
|
|
1348
1369
|
struct transform_right_product_impl< TransformType, MatrixType, 2, RhsCols>
|
|
1349
1370
|
{
|
|
1350
|
-
enum {
|
|
1351
|
-
Dim = TransformType::Dim,
|
|
1371
|
+
enum {
|
|
1372
|
+
Dim = TransformType::Dim,
|
|
1352
1373
|
HDim = TransformType::HDim,
|
|
1353
1374
|
OtherRows = MatrixType::RowsAtCompileTime,
|
|
1354
1375
|
OtherCols = MatrixType::ColsAtCompileTime
|
|
@@ -1356,7 +1377,7 @@ struct transform_right_product_impl< TransformType, MatrixType, 2, RhsCols>
|
|
|
1356
1377
|
|
|
1357
1378
|
typedef typename MatrixType::PlainObject ResultType;
|
|
1358
1379
|
|
|
1359
|
-
static EIGEN_STRONG_INLINE ResultType run(const TransformType& T, const MatrixType& other)
|
|
1380
|
+
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ResultType run(const TransformType& T, const MatrixType& other)
|
|
1360
1381
|
{
|
|
1361
1382
|
EIGEN_STATIC_ASSERT(OtherRows==Dim, YOU_MIXED_MATRICES_OF_DIFFERENT_SIZES);
|
|
1362
1383
|
|
|
@@ -1381,7 +1402,7 @@ struct transform_right_product_impl< TransformType, MatrixType, 2, 1> // rhs is
|
|
|
1381
1402
|
|
|
1382
1403
|
typedef typename MatrixType::PlainObject ResultType;
|
|
1383
1404
|
|
|
1384
|
-
static EIGEN_STRONG_INLINE ResultType run(const TransformType& T, const MatrixType& other)
|
|
1405
|
+
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ResultType run(const TransformType& T, const MatrixType& other)
|
|
1385
1406
|
{
|
|
1386
1407
|
EIGEN_STATIC_ASSERT(OtherRows==Dim, YOU_MIXED_MATRICES_OF_DIFFERENT_SIZES);
|
|
1387
1408
|
|
|
@@ -70,18 +70,18 @@ public:
|
|
|
70
70
|
/** Constructs and initialize the translation transformation from a vector of translation coefficients */
|
|
71
71
|
EIGEN_DEVICE_FUNC explicit inline Translation(const VectorType& vector) : m_coeffs(vector) {}
|
|
72
72
|
|
|
73
|
-
/** \brief
|
|
73
|
+
/** \brief Returns the x-translation by value. **/
|
|
74
74
|
EIGEN_DEVICE_FUNC inline Scalar x() const { return m_coeffs.x(); }
|
|
75
|
-
/** \brief
|
|
75
|
+
/** \brief Returns the y-translation by value. **/
|
|
76
76
|
EIGEN_DEVICE_FUNC inline Scalar y() const { return m_coeffs.y(); }
|
|
77
|
-
/** \brief
|
|
77
|
+
/** \brief Returns the z-translation by value. **/
|
|
78
78
|
EIGEN_DEVICE_FUNC inline Scalar z() const { return m_coeffs.z(); }
|
|
79
79
|
|
|
80
|
-
/** \brief
|
|
80
|
+
/** \brief Returns the x-translation as a reference. **/
|
|
81
81
|
EIGEN_DEVICE_FUNC inline Scalar& x() { return m_coeffs.x(); }
|
|
82
|
-
/** \brief
|
|
82
|
+
/** \brief Returns the y-translation as a reference. **/
|
|
83
83
|
EIGEN_DEVICE_FUNC inline Scalar& y() { return m_coeffs.y(); }
|
|
84
|
-
/** \brief
|
|
84
|
+
/** \brief Returns the z-translation as a reference. **/
|
|
85
85
|
EIGEN_DEVICE_FUNC inline Scalar& z() { return m_coeffs.z(); }
|
|
86
86
|
|
|
87
87
|
EIGEN_DEVICE_FUNC const VectorType& vector() const { return m_coeffs; }
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
// This file is part of Eigen, a lightweight C++ template library
|
|
2
|
+
// for linear algebra.
|
|
3
|
+
//
|
|
4
|
+
// Copyright (C) 2009 Rohit Garg <rpg.314@gmail.com>
|
|
5
|
+
// Copyright (C) 2009-2010 Gael Guennebaud <gael.guennebaud@inria.fr>
|
|
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_GEOMETRY_SIMD_H
|
|
12
|
+
#define EIGEN_GEOMETRY_SIMD_H
|
|
13
|
+
|
|
14
|
+
namespace Eigen {
|
|
15
|
+
|
|
16
|
+
namespace internal {
|
|
17
|
+
|
|
18
|
+
template<class Derived, class OtherDerived>
|
|
19
|
+
struct quat_product<Architecture::Target, Derived, OtherDerived, float>
|
|
20
|
+
{
|
|
21
|
+
enum {
|
|
22
|
+
AAlignment = traits<Derived>::Alignment,
|
|
23
|
+
BAlignment = traits<OtherDerived>::Alignment,
|
|
24
|
+
ResAlignment = traits<Quaternion<float> >::Alignment
|
|
25
|
+
};
|
|
26
|
+
static inline Quaternion<float> run(const QuaternionBase<Derived>& _a, const QuaternionBase<OtherDerived>& _b)
|
|
27
|
+
{
|
|
28
|
+
evaluator<typename Derived::Coefficients> ae(_a.coeffs());
|
|
29
|
+
evaluator<typename OtherDerived::Coefficients> be(_b.coeffs());
|
|
30
|
+
Quaternion<float> res;
|
|
31
|
+
const float neg_zero = numext::bit_cast<float>(0x80000000u);
|
|
32
|
+
const float arr[4] = {0.f, 0.f, 0.f, neg_zero};
|
|
33
|
+
const Packet4f mask = ploadu<Packet4f>(arr);
|
|
34
|
+
Packet4f a = ae.template packet<AAlignment,Packet4f>(0);
|
|
35
|
+
Packet4f b = be.template packet<BAlignment,Packet4f>(0);
|
|
36
|
+
Packet4f s1 = pmul(vec4f_swizzle1(a,1,2,0,2),vec4f_swizzle1(b,2,0,1,2));
|
|
37
|
+
Packet4f s2 = pmul(vec4f_swizzle1(a,3,3,3,1),vec4f_swizzle1(b,0,1,2,1));
|
|
38
|
+
pstoret<float,Packet4f,ResAlignment>(
|
|
39
|
+
&res.x(),
|
|
40
|
+
padd(psub(pmul(a,vec4f_swizzle1(b,3,3,3,3)),
|
|
41
|
+
pmul(vec4f_swizzle1(a,2,0,1,0),
|
|
42
|
+
vec4f_swizzle1(b,1,2,0,0))),
|
|
43
|
+
pxor(mask,padd(s1,s2))));
|
|
44
|
+
|
|
45
|
+
return res;
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
template<class Derived>
|
|
50
|
+
struct quat_conj<Architecture::Target, Derived, float>
|
|
51
|
+
{
|
|
52
|
+
enum {
|
|
53
|
+
ResAlignment = traits<Quaternion<float> >::Alignment
|
|
54
|
+
};
|
|
55
|
+
static inline Quaternion<float> run(const QuaternionBase<Derived>& q)
|
|
56
|
+
{
|
|
57
|
+
evaluator<typename Derived::Coefficients> qe(q.coeffs());
|
|
58
|
+
Quaternion<float> res;
|
|
59
|
+
const float neg_zero = numext::bit_cast<float>(0x80000000u);
|
|
60
|
+
const float arr[4] = {neg_zero, neg_zero, neg_zero,0.f};
|
|
61
|
+
const Packet4f mask = ploadu<Packet4f>(arr);
|
|
62
|
+
pstoret<float,Packet4f,ResAlignment>(&res.x(), pxor(mask, qe.template packet<traits<Derived>::Alignment,Packet4f>(0)));
|
|
63
|
+
return res;
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
template<typename VectorLhs,typename VectorRhs>
|
|
69
|
+
struct cross3_impl<Architecture::Target,VectorLhs,VectorRhs,float,true>
|
|
70
|
+
{
|
|
71
|
+
enum {
|
|
72
|
+
ResAlignment = traits<typename plain_matrix_type<VectorLhs>::type>::Alignment
|
|
73
|
+
};
|
|
74
|
+
static inline typename plain_matrix_type<VectorLhs>::type
|
|
75
|
+
run(const VectorLhs& lhs, const VectorRhs& rhs)
|
|
76
|
+
{
|
|
77
|
+
evaluator<VectorLhs> lhs_eval(lhs);
|
|
78
|
+
evaluator<VectorRhs> rhs_eval(rhs);
|
|
79
|
+
Packet4f a = lhs_eval.template packet<traits<VectorLhs>::Alignment,Packet4f>(0);
|
|
80
|
+
Packet4f b = rhs_eval.template packet<traits<VectorRhs>::Alignment,Packet4f>(0);
|
|
81
|
+
Packet4f mul1 = pmul(vec4f_swizzle1(a,1,2,0,3),vec4f_swizzle1(b,2,0,1,3));
|
|
82
|
+
Packet4f mul2 = pmul(vec4f_swizzle1(a,2,0,1,3),vec4f_swizzle1(b,1,2,0,3));
|
|
83
|
+
typename plain_matrix_type<VectorLhs>::type res;
|
|
84
|
+
pstoret<float,Packet4f,ResAlignment>(&res.x(),psub(mul1,mul2));
|
|
85
|
+
return res;
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
#if (defined EIGEN_VECTORIZE_SSE) || (EIGEN_ARCH_ARM64)
|
|
92
|
+
|
|
93
|
+
template<class Derived, class OtherDerived>
|
|
94
|
+
struct quat_product<Architecture::Target, Derived, OtherDerived, double>
|
|
95
|
+
{
|
|
96
|
+
enum {
|
|
97
|
+
BAlignment = traits<OtherDerived>::Alignment,
|
|
98
|
+
ResAlignment = traits<Quaternion<double> >::Alignment
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
static inline Quaternion<double> run(const QuaternionBase<Derived>& _a, const QuaternionBase<OtherDerived>& _b)
|
|
102
|
+
{
|
|
103
|
+
Quaternion<double> res;
|
|
104
|
+
|
|
105
|
+
evaluator<typename Derived::Coefficients> ae(_a.coeffs());
|
|
106
|
+
evaluator<typename OtherDerived::Coefficients> be(_b.coeffs());
|
|
107
|
+
|
|
108
|
+
const double* a = _a.coeffs().data();
|
|
109
|
+
Packet2d b_xy = be.template packet<BAlignment,Packet2d>(0);
|
|
110
|
+
Packet2d b_zw = be.template packet<BAlignment,Packet2d>(2);
|
|
111
|
+
Packet2d a_xx = pset1<Packet2d>(a[0]);
|
|
112
|
+
Packet2d a_yy = pset1<Packet2d>(a[1]);
|
|
113
|
+
Packet2d a_zz = pset1<Packet2d>(a[2]);
|
|
114
|
+
Packet2d a_ww = pset1<Packet2d>(a[3]);
|
|
115
|
+
|
|
116
|
+
// two temporaries:
|
|
117
|
+
Packet2d t1, t2;
|
|
118
|
+
|
|
119
|
+
/*
|
|
120
|
+
* t1 = ww*xy + yy*zw
|
|
121
|
+
* t2 = zz*xy - xx*zw
|
|
122
|
+
* res.xy = t1 +/- swap(t2)
|
|
123
|
+
*/
|
|
124
|
+
t1 = padd(pmul(a_ww, b_xy), pmul(a_yy, b_zw));
|
|
125
|
+
t2 = psub(pmul(a_zz, b_xy), pmul(a_xx, b_zw));
|
|
126
|
+
pstoret<double,Packet2d,ResAlignment>(&res.x(), paddsub(t1, preverse(t2)));
|
|
127
|
+
|
|
128
|
+
/*
|
|
129
|
+
* t1 = ww*zw - yy*xy
|
|
130
|
+
* t2 = zz*zw + xx*xy
|
|
131
|
+
* res.zw = t1 -/+ swap(t2) = swap( swap(t1) +/- t2)
|
|
132
|
+
*/
|
|
133
|
+
t1 = psub(pmul(a_ww, b_zw), pmul(a_yy, b_xy));
|
|
134
|
+
t2 = padd(pmul(a_zz, b_zw), pmul(a_xx, b_xy));
|
|
135
|
+
pstoret<double,Packet2d,ResAlignment>(&res.z(), preverse(paddsub(preverse(t1), t2)));
|
|
136
|
+
|
|
137
|
+
return res;
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
template<class Derived>
|
|
142
|
+
struct quat_conj<Architecture::Target, Derived, double>
|
|
143
|
+
{
|
|
144
|
+
enum {
|
|
145
|
+
ResAlignment = traits<Quaternion<double> >::Alignment
|
|
146
|
+
};
|
|
147
|
+
static inline Quaternion<double> run(const QuaternionBase<Derived>& q)
|
|
148
|
+
{
|
|
149
|
+
evaluator<typename Derived::Coefficients> qe(q.coeffs());
|
|
150
|
+
Quaternion<double> res;
|
|
151
|
+
const double neg_zero = numext::bit_cast<double>(0x8000000000000000ull);
|
|
152
|
+
const double arr1[2] = {neg_zero, neg_zero};
|
|
153
|
+
const double arr2[2] = {neg_zero, 0.0};
|
|
154
|
+
const Packet2d mask0 = ploadu<Packet2d>(arr1);
|
|
155
|
+
const Packet2d mask2 = ploadu<Packet2d>(arr2);
|
|
156
|
+
pstoret<double,Packet2d,ResAlignment>(&res.x(), pxor(mask0, qe.template packet<traits<Derived>::Alignment,Packet2d>(0)));
|
|
157
|
+
pstoret<double,Packet2d,ResAlignment>(&res.z(), pxor(mask2, qe.template packet<traits<Derived>::Alignment,Packet2d>(2)));
|
|
158
|
+
return res;
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
#endif // end EIGEN_VECTORIZE_SSE_OR_EIGEN_ARCH_ARM64
|
|
163
|
+
|
|
164
|
+
} // end namespace internal
|
|
165
|
+
|
|
166
|
+
} // end namespace Eigen
|
|
167
|
+
|
|
168
|
+
#endif // EIGEN_GEOMETRY_SIMD_H
|
|
@@ -63,8 +63,15 @@ void make_block_householder_triangular_factor(TriangularFactorType& triFactor, c
|
|
|
63
63
|
triFactor.row(i).tail(rt).noalias() = -hCoeffs(i) * vectors.col(i).tail(rs).adjoint()
|
|
64
64
|
* vectors.bottomRightCorner(rs, rt).template triangularView<UnitLower>();
|
|
65
65
|
|
|
66
|
-
// FIXME
|
|
67
|
-
triFactor.row(i).tail(rt) = triFactor.row(i).tail(rt) * triFactor.bottomRightCorner(rt,rt).template triangularView<Upper>();
|
|
66
|
+
// FIXME use the following line with .noalias() once the triangular product can work inplace
|
|
67
|
+
// triFactor.row(i).tail(rt) = triFactor.row(i).tail(rt) * triFactor.bottomRightCorner(rt,rt).template triangularView<Upper>();
|
|
68
|
+
for(Index j=nbVecs-1; j>i; --j)
|
|
69
|
+
{
|
|
70
|
+
typename TriangularFactorType::Scalar z = triFactor(i,j);
|
|
71
|
+
triFactor(i,j) = z * triFactor(j,j);
|
|
72
|
+
if(nbVecs-j-1>0)
|
|
73
|
+
triFactor.row(i).tail(nbVecs-j-1) += z * triFactor.row(j).tail(nbVecs-j-1);
|
|
74
|
+
}
|
|
68
75
|
|
|
69
76
|
}
|
|
70
77
|
triFactor(i,i) = hCoeffs(i);
|