@smake/eigen 1.1.0 → 1.1.1
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/Eigen/AccelerateSupport +52 -0
- package/eigen/Eigen/Cholesky +18 -20
- package/eigen/Eigen/CholmodSupport +28 -28
- package/eigen/Eigen/Core +187 -120
- package/eigen/Eigen/Eigenvalues +16 -13
- package/eigen/Eigen/Geometry +18 -18
- package/eigen/Eigen/Householder +9 -7
- package/eigen/Eigen/IterativeLinearSolvers +8 -4
- package/eigen/Eigen/Jacobi +14 -13
- package/eigen/Eigen/KLUSupport +23 -21
- package/eigen/Eigen/LU +15 -16
- package/eigen/Eigen/MetisSupport +12 -12
- package/eigen/Eigen/OrderingMethods +54 -51
- package/eigen/Eigen/PaStiXSupport +23 -21
- package/eigen/Eigen/PardisoSupport +17 -14
- package/eigen/Eigen/QR +18 -20
- package/eigen/Eigen/QtAlignedMalloc +5 -12
- package/eigen/Eigen/SPQRSupport +21 -14
- package/eigen/Eigen/SVD +23 -17
- package/eigen/Eigen/Sparse +1 -2
- package/eigen/Eigen/SparseCholesky +18 -15
- package/eigen/Eigen/SparseCore +18 -17
- package/eigen/Eigen/SparseLU +9 -9
- package/eigen/Eigen/SparseQR +16 -14
- package/eigen/Eigen/StdDeque +5 -2
- package/eigen/Eigen/StdList +5 -2
- package/eigen/Eigen/StdVector +5 -2
- package/eigen/Eigen/SuperLUSupport +30 -24
- package/eigen/Eigen/ThreadPool +80 -0
- package/eigen/Eigen/UmfPackSupport +19 -17
- package/eigen/Eigen/Version +14 -0
- package/eigen/Eigen/src/AccelerateSupport/AccelerateSupport.h +423 -0
- package/eigen/Eigen/src/AccelerateSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Cholesky/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Cholesky/LDLT.h +366 -405
- package/eigen/Eigen/src/Cholesky/LLT.h +323 -367
- package/eigen/Eigen/src/Cholesky/LLT_LAPACKE.h +81 -56
- package/eigen/Eigen/src/CholmodSupport/CholmodSupport.h +585 -529
- package/eigen/Eigen/src/CholmodSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Core/ArithmeticSequence.h +143 -317
- package/eigen/Eigen/src/Core/Array.h +329 -370
- package/eigen/Eigen/src/Core/ArrayBase.h +190 -203
- package/eigen/Eigen/src/Core/ArrayWrapper.h +126 -170
- package/eigen/Eigen/src/Core/Assign.h +30 -40
- package/eigen/Eigen/src/Core/AssignEvaluator.h +651 -604
- package/eigen/Eigen/src/Core/Assign_MKL.h +125 -120
- package/eigen/Eigen/src/Core/BandMatrix.h +267 -282
- package/eigen/Eigen/src/Core/Block.h +371 -390
- package/eigen/Eigen/src/Core/CommaInitializer.h +85 -100
- package/eigen/Eigen/src/Core/ConditionEstimator.h +51 -53
- package/eigen/Eigen/src/Core/CoreEvaluators.h +1214 -937
- package/eigen/Eigen/src/Core/CoreIterators.h +72 -63
- package/eigen/Eigen/src/Core/CwiseBinaryOp.h +112 -129
- package/eigen/Eigen/src/Core/CwiseNullaryOp.h +676 -702
- package/eigen/Eigen/src/Core/CwiseTernaryOp.h +77 -103
- package/eigen/Eigen/src/Core/CwiseUnaryOp.h +55 -67
- package/eigen/Eigen/src/Core/CwiseUnaryView.h +127 -92
- package/eigen/Eigen/src/Core/DenseBase.h +630 -658
- package/eigen/Eigen/src/Core/DenseCoeffsBase.h +511 -628
- package/eigen/Eigen/src/Core/DenseStorage.h +511 -590
- package/eigen/Eigen/src/Core/DeviceWrapper.h +153 -0
- package/eigen/Eigen/src/Core/Diagonal.h +168 -207
- package/eigen/Eigen/src/Core/DiagonalMatrix.h +346 -317
- package/eigen/Eigen/src/Core/DiagonalProduct.h +12 -10
- package/eigen/Eigen/src/Core/Dot.h +167 -217
- package/eigen/Eigen/src/Core/EigenBase.h +74 -85
- package/eigen/Eigen/src/Core/Fill.h +138 -0
- package/eigen/Eigen/src/Core/FindCoeff.h +464 -0
- package/eigen/Eigen/src/Core/ForceAlignedAccess.h +90 -113
- package/eigen/Eigen/src/Core/Fuzzy.h +82 -105
- package/eigen/Eigen/src/Core/GeneralProduct.h +315 -261
- package/eigen/Eigen/src/Core/GenericPacketMath.h +1182 -520
- package/eigen/Eigen/src/Core/GlobalFunctions.h +193 -157
- package/eigen/Eigen/src/Core/IO.h +131 -156
- package/eigen/Eigen/src/Core/IndexedView.h +209 -125
- package/eigen/Eigen/src/Core/InnerProduct.h +260 -0
- package/eigen/Eigen/src/Core/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Core/Inverse.h +50 -59
- package/eigen/Eigen/src/Core/Map.h +123 -141
- package/eigen/Eigen/src/Core/MapBase.h +255 -282
- package/eigen/Eigen/src/Core/MathFunctions.h +1247 -1201
- package/eigen/Eigen/src/Core/MathFunctionsImpl.h +162 -99
- package/eigen/Eigen/src/Core/Matrix.h +463 -494
- package/eigen/Eigen/src/Core/MatrixBase.h +468 -470
- package/eigen/Eigen/src/Core/NestByValue.h +58 -52
- package/eigen/Eigen/src/Core/NoAlias.h +79 -86
- package/eigen/Eigen/src/Core/NumTraits.h +206 -206
- package/eigen/Eigen/src/Core/PartialReduxEvaluator.h +163 -142
- package/eigen/Eigen/src/Core/PermutationMatrix.h +461 -511
- package/eigen/Eigen/src/Core/PlainObjectBase.h +858 -972
- package/eigen/Eigen/src/Core/Product.h +246 -130
- package/eigen/Eigen/src/Core/ProductEvaluators.h +779 -671
- package/eigen/Eigen/src/Core/Random.h +153 -164
- package/eigen/Eigen/src/Core/RandomImpl.h +262 -0
- package/eigen/Eigen/src/Core/RealView.h +250 -0
- package/eigen/Eigen/src/Core/Redux.h +334 -314
- package/eigen/Eigen/src/Core/Ref.h +259 -257
- package/eigen/Eigen/src/Core/Replicate.h +92 -104
- package/eigen/Eigen/src/Core/Reshaped.h +215 -271
- package/eigen/Eigen/src/Core/ReturnByValue.h +47 -55
- package/eigen/Eigen/src/Core/Reverse.h +133 -148
- package/eigen/Eigen/src/Core/Select.h +68 -140
- package/eigen/Eigen/src/Core/SelfAdjointView.h +254 -290
- package/eigen/Eigen/src/Core/SelfCwiseBinaryOp.h +23 -20
- package/eigen/Eigen/src/Core/SkewSymmetricMatrix3.h +382 -0
- package/eigen/Eigen/src/Core/Solve.h +88 -102
- package/eigen/Eigen/src/Core/SolveTriangular.h +126 -124
- package/eigen/Eigen/src/Core/SolverBase.h +132 -133
- package/eigen/Eigen/src/Core/StableNorm.h +113 -147
- package/eigen/Eigen/src/Core/StlIterators.h +404 -248
- package/eigen/Eigen/src/Core/Stride.h +90 -92
- package/eigen/Eigen/src/Core/Swap.h +70 -39
- package/eigen/Eigen/src/Core/Transpose.h +258 -295
- package/eigen/Eigen/src/Core/Transpositions.h +270 -333
- package/eigen/Eigen/src/Core/TriangularMatrix.h +642 -743
- package/eigen/Eigen/src/Core/VectorBlock.h +59 -72
- package/eigen/Eigen/src/Core/VectorwiseOp.h +653 -704
- package/eigen/Eigen/src/Core/Visitor.h +464 -308
- package/eigen/Eigen/src/Core/arch/AVX/Complex.h +380 -187
- package/eigen/Eigen/src/Core/arch/AVX/MathFunctions.h +65 -163
- package/eigen/Eigen/src/Core/arch/AVX/PacketMath.h +2145 -638
- package/eigen/Eigen/src/Core/arch/AVX/Reductions.h +353 -0
- package/eigen/Eigen/src/Core/arch/AVX/TypeCasting.h +253 -60
- package/eigen/Eigen/src/Core/arch/AVX512/Complex.h +278 -228
- package/eigen/Eigen/src/Core/arch/AVX512/GemmKernel.h +1245 -0
- package/eigen/Eigen/src/Core/arch/AVX512/MathFunctions.h +48 -269
- package/eigen/Eigen/src/Core/arch/AVX512/MathFunctionsFP16.h +75 -0
- package/eigen/Eigen/src/Core/arch/AVX512/PacketMath.h +1597 -754
- package/eigen/Eigen/src/Core/arch/AVX512/PacketMathFP16.h +1413 -0
- package/eigen/Eigen/src/Core/arch/AVX512/Reductions.h +297 -0
- package/eigen/Eigen/src/Core/arch/AVX512/TrsmKernel.h +1167 -0
- package/eigen/Eigen/src/Core/arch/AVX512/TrsmUnrolls.inc +1219 -0
- package/eigen/Eigen/src/Core/arch/AVX512/TypeCasting.h +229 -41
- package/eigen/Eigen/src/Core/arch/AVX512/TypeCastingFP16.h +130 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/Complex.h +420 -184
- package/eigen/Eigen/src/Core/arch/AltiVec/MathFunctions.h +40 -49
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProduct.h +2962 -2213
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductCommon.h +196 -212
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductMMA.h +713 -441
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductMMAbfloat16.h +742 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixVectorProduct.inc +2818 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/PacketMath.h +2380 -1362
- package/eigen/Eigen/src/Core/arch/AltiVec/TypeCasting.h +153 -0
- package/eigen/Eigen/src/Core/arch/Default/BFloat16.h +390 -224
- package/eigen/Eigen/src/Core/arch/Default/ConjHelper.h +78 -67
- package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h +1784 -799
- package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctionsFwd.h +167 -50
- package/eigen/Eigen/src/Core/arch/Default/Half.h +528 -379
- package/eigen/Eigen/src/Core/arch/Default/Settings.h +10 -12
- package/eigen/Eigen/src/Core/arch/GPU/Complex.h +244 -0
- package/eigen/Eigen/src/Core/arch/GPU/MathFunctions.h +41 -40
- package/eigen/Eigen/src/Core/arch/GPU/PacketMath.h +550 -523
- package/eigen/Eigen/src/Core/arch/GPU/Tuple.h +268 -0
- package/eigen/Eigen/src/Core/arch/GPU/TypeCasting.h +27 -30
- package/eigen/Eigen/src/Core/arch/HIP/hcc/math_constants.h +8 -8
- package/eigen/Eigen/src/Core/arch/HVX/PacketMath.h +1088 -0
- package/eigen/Eigen/src/Core/arch/LSX/Complex.h +520 -0
- package/eigen/Eigen/src/Core/arch/LSX/GeneralBlockPanelKernel.h +23 -0
- package/eigen/Eigen/src/Core/arch/LSX/MathFunctions.h +43 -0
- package/eigen/Eigen/src/Core/arch/LSX/PacketMath.h +2866 -0
- package/eigen/Eigen/src/Core/arch/LSX/TypeCasting.h +526 -0
- package/eigen/Eigen/src/Core/arch/MSA/Complex.h +54 -82
- package/eigen/Eigen/src/Core/arch/MSA/MathFunctions.h +84 -92
- package/eigen/Eigen/src/Core/arch/MSA/PacketMath.h +51 -47
- package/eigen/Eigen/src/Core/arch/NEON/Complex.h +454 -306
- package/eigen/Eigen/src/Core/arch/NEON/GeneralBlockPanelKernel.h +175 -115
- package/eigen/Eigen/src/Core/arch/NEON/MathFunctions.h +23 -30
- package/eigen/Eigen/src/Core/arch/NEON/PacketMath.h +4366 -2857
- package/eigen/Eigen/src/Core/arch/NEON/TypeCasting.h +616 -393
- package/eigen/Eigen/src/Core/arch/NEON/UnaryFunctors.h +57 -0
- package/eigen/Eigen/src/Core/arch/SSE/Complex.h +350 -198
- package/eigen/Eigen/src/Core/arch/SSE/MathFunctions.h +38 -149
- package/eigen/Eigen/src/Core/arch/SSE/PacketMath.h +1791 -912
- package/eigen/Eigen/src/Core/arch/SSE/Reductions.h +324 -0
- package/eigen/Eigen/src/Core/arch/SSE/TypeCasting.h +128 -40
- package/eigen/Eigen/src/Core/arch/SVE/MathFunctions.h +10 -6
- package/eigen/Eigen/src/Core/arch/SVE/PacketMath.h +156 -234
- package/eigen/Eigen/src/Core/arch/SVE/TypeCasting.h +6 -3
- package/eigen/Eigen/src/Core/arch/SYCL/InteropHeaders.h +27 -32
- package/eigen/Eigen/src/Core/arch/SYCL/MathFunctions.h +119 -117
- package/eigen/Eigen/src/Core/arch/SYCL/PacketMath.h +325 -419
- package/eigen/Eigen/src/Core/arch/SYCL/TypeCasting.h +15 -17
- package/eigen/Eigen/src/Core/arch/ZVector/Complex.h +325 -181
- package/eigen/Eigen/src/Core/arch/ZVector/MathFunctions.h +94 -83
- package/eigen/Eigen/src/Core/arch/ZVector/PacketMath.h +811 -458
- package/eigen/Eigen/src/Core/functors/AssignmentFunctors.h +121 -124
- package/eigen/Eigen/src/Core/functors/BinaryFunctors.h +576 -370
- package/eigen/Eigen/src/Core/functors/NullaryFunctors.h +194 -109
- package/eigen/Eigen/src/Core/functors/StlFunctors.h +95 -112
- package/eigen/Eigen/src/Core/functors/TernaryFunctors.h +34 -7
- package/eigen/Eigen/src/Core/functors/UnaryFunctors.h +1038 -749
- package/eigen/Eigen/src/Core/products/GeneralBlockPanelKernel.h +1883 -1375
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrix.h +312 -370
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h +189 -176
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_BLAS.h +84 -81
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrix_BLAS.h +154 -73
- package/eigen/Eigen/src/Core/products/GeneralMatrixVector.h +292 -337
- package/eigen/Eigen/src/Core/products/GeneralMatrixVector_BLAS.h +80 -77
- package/eigen/Eigen/src/Core/products/Parallelizer.h +207 -105
- package/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix.h +327 -388
- package/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix_BLAS.h +206 -224
- package/eigen/Eigen/src/Core/products/SelfadjointMatrixVector.h +138 -147
- package/eigen/Eigen/src/Core/products/SelfadjointMatrixVector_BLAS.h +58 -61
- package/eigen/Eigen/src/Core/products/SelfadjointProduct.h +71 -71
- package/eigen/Eigen/src/Core/products/SelfadjointRank2Update.h +48 -47
- package/eigen/Eigen/src/Core/products/TriangularMatrixMatrix.h +294 -369
- package/eigen/Eigen/src/Core/products/TriangularMatrixMatrix_BLAS.h +246 -238
- package/eigen/Eigen/src/Core/products/TriangularMatrixVector.h +244 -247
- package/eigen/Eigen/src/Core/products/TriangularMatrixVector_BLAS.h +212 -192
- package/eigen/Eigen/src/Core/products/TriangularSolverMatrix.h +328 -277
- package/eigen/Eigen/src/Core/products/TriangularSolverMatrix_BLAS.h +108 -109
- package/eigen/Eigen/src/Core/products/TriangularSolverVector.h +68 -94
- package/eigen/Eigen/src/Core/util/Assert.h +158 -0
- package/eigen/Eigen/src/Core/util/BlasUtil.h +342 -303
- package/eigen/Eigen/src/Core/util/ConfigureVectorization.h +348 -317
- package/eigen/Eigen/src/Core/util/Constants.h +297 -262
- package/eigen/Eigen/src/Core/util/DisableStupidWarnings.h +130 -90
- package/eigen/Eigen/src/Core/util/EmulateArray.h +270 -0
- package/eigen/Eigen/src/Core/util/ForwardDeclarations.h +449 -247
- package/eigen/Eigen/src/Core/util/GpuHipCudaDefines.inc +101 -0
- package/eigen/Eigen/src/Core/util/GpuHipCudaUndefines.inc +45 -0
- package/eigen/Eigen/src/Core/util/IndexedViewHelper.h +417 -116
- package/eigen/Eigen/src/Core/util/IntegralConstant.h +211 -204
- package/eigen/Eigen/src/Core/util/MKL_support.h +39 -37
- package/eigen/Eigen/src/Core/util/Macros.h +655 -773
- package/eigen/Eigen/src/Core/util/MaxSizeVector.h +139 -0
- package/eigen/Eigen/src/Core/util/Memory.h +970 -748
- package/eigen/Eigen/src/Core/util/Meta.h +581 -633
- package/eigen/Eigen/src/Core/util/MoreMeta.h +638 -0
- package/eigen/Eigen/src/Core/util/ReenableStupidWarnings.h +32 -19
- package/eigen/Eigen/src/Core/util/ReshapedHelper.h +17 -17
- package/eigen/Eigen/src/Core/util/Serializer.h +209 -0
- package/eigen/Eigen/src/Core/util/StaticAssert.h +50 -166
- package/eigen/Eigen/src/Core/util/SymbolicIndex.h +377 -225
- package/eigen/Eigen/src/Core/util/XprHelper.h +784 -547
- package/eigen/Eigen/src/Eigenvalues/ComplexEigenSolver.h +246 -277
- package/eigen/Eigen/src/Eigenvalues/ComplexSchur.h +299 -319
- package/eigen/Eigen/src/Eigenvalues/ComplexSchur_LAPACKE.h +52 -48
- package/eigen/Eigen/src/Eigenvalues/EigenSolver.h +413 -456
- package/eigen/Eigen/src/Eigenvalues/GeneralizedEigenSolver.h +309 -325
- package/eigen/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h +157 -171
- package/eigen/Eigen/src/Eigenvalues/HessenbergDecomposition.h +292 -310
- package/eigen/Eigen/src/Eigenvalues/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h +89 -105
- package/eigen/Eigen/src/Eigenvalues/RealQZ.h +537 -607
- package/eigen/Eigen/src/Eigenvalues/RealSchur.h +342 -381
- package/eigen/Eigen/src/Eigenvalues/RealSchur_LAPACKE.h +41 -35
- package/eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h +541 -595
- package/eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver_LAPACKE.h +47 -44
- package/eigen/Eigen/src/Eigenvalues/Tridiagonalization.h +430 -462
- package/eigen/Eigen/src/Geometry/AlignedBox.h +226 -227
- package/eigen/Eigen/src/Geometry/AngleAxis.h +131 -133
- package/eigen/Eigen/src/Geometry/EulerAngles.h +163 -74
- package/eigen/Eigen/src/Geometry/Homogeneous.h +285 -333
- package/eigen/Eigen/src/Geometry/Hyperplane.h +151 -160
- package/eigen/Eigen/src/Geometry/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Geometry/OrthoMethods.h +168 -146
- package/eigen/Eigen/src/Geometry/ParametrizedLine.h +127 -127
- package/eigen/Eigen/src/Geometry/Quaternion.h +566 -506
- package/eigen/Eigen/src/Geometry/Rotation2D.h +107 -105
- package/eigen/Eigen/src/Geometry/RotationBase.h +148 -145
- package/eigen/Eigen/src/Geometry/Scaling.h +113 -106
- package/eigen/Eigen/src/Geometry/Transform.h +858 -936
- package/eigen/Eigen/src/Geometry/Translation.h +94 -92
- package/eigen/Eigen/src/Geometry/Umeyama.h +79 -84
- package/eigen/Eigen/src/Geometry/arch/Geometry_SIMD.h +90 -104
- package/eigen/Eigen/src/Householder/BlockHouseholder.h +51 -46
- package/eigen/Eigen/src/Householder/Householder.h +102 -124
- package/eigen/Eigen/src/Householder/HouseholderSequence.h +412 -453
- package/eigen/Eigen/src/Householder/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h +149 -162
- package/eigen/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h +124 -119
- package/eigen/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h +92 -104
- package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h +251 -243
- package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h +224 -228
- package/eigen/Eigen/src/IterativeLinearSolvers/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h +178 -227
- package/eigen/Eigen/src/IterativeLinearSolvers/LeastSquareConjugateGradient.h +79 -84
- package/eigen/Eigen/src/IterativeLinearSolvers/SolveWithGuess.h +54 -60
- package/eigen/Eigen/src/Jacobi/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Jacobi/Jacobi.h +252 -308
- package/eigen/Eigen/src/KLUSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/KLUSupport/KLUSupport.h +208 -227
- package/eigen/Eigen/src/LU/Determinant.h +50 -69
- package/eigen/Eigen/src/LU/FullPivLU.h +545 -596
- package/eigen/Eigen/src/LU/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/LU/InverseImpl.h +206 -285
- package/eigen/Eigen/src/LU/PartialPivLU.h +390 -428
- package/eigen/Eigen/src/LU/PartialPivLU_LAPACKE.h +54 -40
- package/eigen/Eigen/src/LU/arch/InverseSize4.h +72 -70
- package/eigen/Eigen/src/MetisSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/MetisSupport/MetisSupport.h +81 -93
- package/eigen/Eigen/src/OrderingMethods/Amd.h +243 -265
- package/eigen/Eigen/src/OrderingMethods/Eigen_Colamd.h +831 -1004
- package/eigen/Eigen/src/OrderingMethods/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/OrderingMethods/Ordering.h +112 -119
- package/eigen/Eigen/src/PaStiXSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/PaStiXSupport/PaStiXSupport.h +524 -570
- package/eigen/Eigen/src/PardisoSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/PardisoSupport/PardisoSupport.h +385 -430
- package/eigen/Eigen/src/QR/ColPivHouseholderQR.h +479 -479
- package/eigen/Eigen/src/QR/ColPivHouseholderQR_LAPACKE.h +120 -56
- package/eigen/Eigen/src/QR/CompleteOrthogonalDecomposition.h +166 -153
- package/eigen/Eigen/src/QR/FullPivHouseholderQR.h +495 -475
- package/eigen/Eigen/src/QR/HouseholderQR.h +394 -285
- package/eigen/Eigen/src/QR/HouseholderQR_LAPACKE.h +32 -23
- package/eigen/Eigen/src/QR/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SPQRSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h +244 -264
- package/eigen/Eigen/src/SVD/BDCSVD.h +817 -713
- package/eigen/Eigen/src/SVD/BDCSVD_LAPACKE.h +174 -0
- package/eigen/Eigen/src/SVD/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SVD/JacobiSVD.h +577 -543
- package/eigen/Eigen/src/SVD/JacobiSVD_LAPACKE.h +85 -49
- package/eigen/Eigen/src/SVD/SVDBase.h +242 -182
- package/eigen/Eigen/src/SVD/UpperBidiagonalization.h +200 -235
- package/eigen/Eigen/src/SparseCholesky/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky.h +765 -594
- package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h +308 -94
- package/eigen/Eigen/src/SparseCore/AmbiVector.h +202 -251
- package/eigen/Eigen/src/SparseCore/CompressedStorage.h +184 -252
- package/eigen/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h +134 -178
- package/eigen/Eigen/src/SparseCore/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SparseCore/SparseAssign.h +149 -140
- package/eigen/Eigen/src/SparseCore/SparseBlock.h +403 -440
- package/eigen/Eigen/src/SparseCore/SparseColEtree.h +100 -112
- package/eigen/Eigen/src/SparseCore/SparseCompressedBase.h +525 -303
- package/eigen/Eigen/src/SparseCore/SparseCwiseBinaryOp.h +555 -339
- package/eigen/Eigen/src/SparseCore/SparseCwiseUnaryOp.h +100 -108
- package/eigen/Eigen/src/SparseCore/SparseDenseProduct.h +169 -197
- package/eigen/Eigen/src/SparseCore/SparseDiagonalProduct.h +71 -71
- package/eigen/Eigen/src/SparseCore/SparseDot.h +49 -47
- package/eigen/Eigen/src/SparseCore/SparseFuzzy.h +13 -11
- package/eigen/Eigen/src/SparseCore/SparseMap.h +243 -253
- package/eigen/Eigen/src/SparseCore/SparseMatrix.h +1603 -1245
- package/eigen/Eigen/src/SparseCore/SparseMatrixBase.h +403 -350
- package/eigen/Eigen/src/SparseCore/SparsePermutation.h +186 -115
- package/eigen/Eigen/src/SparseCore/SparseProduct.h +94 -97
- package/eigen/Eigen/src/SparseCore/SparseRedux.h +22 -24
- package/eigen/Eigen/src/SparseCore/SparseRef.h +268 -295
- package/eigen/Eigen/src/SparseCore/SparseSelfAdjointView.h +370 -416
- package/eigen/Eigen/src/SparseCore/SparseSolverBase.h +78 -87
- package/eigen/Eigen/src/SparseCore/SparseSparseProductWithPruning.h +81 -95
- package/eigen/Eigen/src/SparseCore/SparseTranspose.h +62 -71
- package/eigen/Eigen/src/SparseCore/SparseTriangularView.h +132 -144
- package/eigen/Eigen/src/SparseCore/SparseUtil.h +138 -115
- package/eigen/Eigen/src/SparseCore/SparseVector.h +426 -372
- package/eigen/Eigen/src/SparseCore/SparseView.h +164 -193
- package/eigen/Eigen/src/SparseCore/TriangularSolver.h +129 -170
- package/eigen/Eigen/src/SparseLU/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SparseLU/SparseLU.h +756 -710
- package/eigen/Eigen/src/SparseLU/SparseLUImpl.h +61 -48
- package/eigen/Eigen/src/SparseLU/SparseLU_Memory.h +102 -118
- package/eigen/Eigen/src/SparseLU/SparseLU_Structs.h +38 -35
- package/eigen/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h +245 -301
- package/eigen/Eigen/src/SparseLU/SparseLU_Utils.h +44 -49
- package/eigen/Eigen/src/SparseLU/SparseLU_column_bmod.h +104 -108
- package/eigen/Eigen/src/SparseLU/SparseLU_column_dfs.h +89 -100
- package/eigen/Eigen/src/SparseLU/SparseLU_copy_to_ucol.h +57 -58
- package/eigen/Eigen/src/SparseLU/SparseLU_heap_relax_snode.h +43 -55
- package/eigen/Eigen/src/SparseLU/SparseLU_kernel_bmod.h +74 -71
- package/eigen/Eigen/src/SparseLU/SparseLU_panel_bmod.h +124 -132
- package/eigen/Eigen/src/SparseLU/SparseLU_panel_dfs.h +136 -159
- package/eigen/Eigen/src/SparseLU/SparseLU_pivotL.h +51 -52
- package/eigen/Eigen/src/SparseLU/SparseLU_pruneL.h +67 -73
- package/eigen/Eigen/src/SparseLU/SparseLU_relax_snode.h +24 -26
- package/eigen/Eigen/src/SparseQR/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SparseQR/SparseQR.h +450 -502
- package/eigen/Eigen/src/StlSupport/StdDeque.h +28 -93
- package/eigen/Eigen/src/StlSupport/StdList.h +28 -84
- package/eigen/Eigen/src/StlSupport/StdVector.h +28 -108
- package/eigen/Eigen/src/StlSupport/details.h +48 -50
- package/eigen/Eigen/src/SuperLUSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SuperLUSupport/SuperLUSupport.h +634 -730
- package/eigen/Eigen/src/ThreadPool/Barrier.h +70 -0
- package/eigen/Eigen/src/ThreadPool/CoreThreadPoolDevice.h +336 -0
- package/eigen/Eigen/src/ThreadPool/EventCount.h +241 -0
- package/eigen/Eigen/src/ThreadPool/ForkJoin.h +140 -0
- package/eigen/Eigen/src/ThreadPool/InternalHeaderCheck.h +4 -0
- package/eigen/Eigen/src/ThreadPool/NonBlockingThreadPool.h +587 -0
- package/eigen/Eigen/src/ThreadPool/RunQueue.h +230 -0
- package/eigen/Eigen/src/ThreadPool/ThreadCancel.h +21 -0
- package/eigen/Eigen/src/ThreadPool/ThreadEnvironment.h +43 -0
- package/eigen/Eigen/src/ThreadPool/ThreadLocal.h +289 -0
- package/eigen/Eigen/src/ThreadPool/ThreadPoolInterface.h +50 -0
- package/eigen/Eigen/src/ThreadPool/ThreadYield.h +16 -0
- package/eigen/Eigen/src/UmfPackSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/UmfPackSupport/UmfPackSupport.h +428 -464
- package/eigen/Eigen/src/misc/Image.h +41 -43
- package/eigen/Eigen/src/misc/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/misc/Kernel.h +39 -41
- package/eigen/Eigen/src/misc/RealSvd2x2.h +19 -21
- package/eigen/Eigen/src/misc/blas.h +83 -426
- package/eigen/Eigen/src/misc/lapacke.h +9972 -16179
- package/eigen/Eigen/src/misc/lapacke_helpers.h +163 -0
- package/eigen/Eigen/src/misc/lapacke_mangling.h +4 -5
- package/eigen/Eigen/src/plugins/ArrayCwiseBinaryOps.inc +344 -0
- package/eigen/Eigen/src/plugins/ArrayCwiseUnaryOps.inc +544 -0
- package/eigen/Eigen/src/plugins/{BlockMethods.h → BlockMethods.inc} +434 -506
- package/eigen/Eigen/src/plugins/CommonCwiseBinaryOps.inc +116 -0
- package/eigen/Eigen/src/plugins/{CommonCwiseUnaryOps.h → CommonCwiseUnaryOps.inc} +58 -68
- package/eigen/Eigen/src/plugins/IndexedViewMethods.inc +192 -0
- package/eigen/Eigen/src/plugins/InternalHeaderCheck.inc +3 -0
- package/eigen/Eigen/src/plugins/MatrixCwiseBinaryOps.inc +331 -0
- package/eigen/Eigen/src/plugins/MatrixCwiseUnaryOps.inc +118 -0
- package/eigen/Eigen/src/plugins/ReshapedMethods.inc +133 -0
- package/package.json +1 -1
- package/eigen/COPYING.APACHE +0 -203
- package/eigen/COPYING.BSD +0 -26
- package/eigen/COPYING.GPL +0 -674
- package/eigen/COPYING.LGPL +0 -502
- package/eigen/COPYING.MINPACK +0 -51
- package/eigen/COPYING.MPL2 +0 -373
- package/eigen/COPYING.README +0 -18
- package/eigen/Eigen/src/Core/BooleanRedux.h +0 -162
- package/eigen/Eigen/src/Core/arch/CUDA/Complex.h +0 -258
- package/eigen/Eigen/src/Core/arch/Default/TypeCasting.h +0 -120
- package/eigen/Eigen/src/Core/arch/SYCL/SyclMemoryModel.h +0 -694
- package/eigen/Eigen/src/Core/util/NonMPL2.h +0 -3
- package/eigen/Eigen/src/SparseCore/MappedSparseMatrix.h +0 -67
- package/eigen/Eigen/src/SparseLU/SparseLU_gemm_kernel.h +0 -280
- package/eigen/Eigen/src/misc/lapack.h +0 -152
- package/eigen/Eigen/src/plugins/ArrayCwiseBinaryOps.h +0 -358
- package/eigen/Eigen/src/plugins/ArrayCwiseUnaryOps.h +0 -696
- package/eigen/Eigen/src/plugins/CommonCwiseBinaryOps.h +0 -115
- package/eigen/Eigen/src/plugins/IndexedViewMethods.h +0 -262
- package/eigen/Eigen/src/plugins/MatrixCwiseBinaryOps.h +0 -152
- package/eigen/Eigen/src/plugins/MatrixCwiseUnaryOps.h +0 -95
- package/eigen/Eigen/src/plugins/ReshapedMethods.h +0 -149
- package/eigen/README.md +0 -5
|
@@ -11,78 +11,88 @@
|
|
|
11
11
|
#ifndef EIGEN_COLPIVOTINGHOUSEHOLDERQR_H
|
|
12
12
|
#define EIGEN_COLPIVOTINGHOUSEHOLDERQR_H
|
|
13
13
|
|
|
14
|
+
// IWYU pragma: private
|
|
15
|
+
#include "./InternalHeaderCheck.h"
|
|
16
|
+
|
|
14
17
|
namespace Eigen {
|
|
15
18
|
|
|
16
19
|
namespace internal {
|
|
17
|
-
template<typename
|
|
18
|
-
: traits<
|
|
19
|
-
{
|
|
20
|
+
template <typename MatrixType_, typename PermutationIndex_>
|
|
21
|
+
struct traits<ColPivHouseholderQR<MatrixType_, PermutationIndex_>> : traits<MatrixType_> {
|
|
20
22
|
typedef MatrixXpr XprKind;
|
|
21
23
|
typedef SolverStorage StorageKind;
|
|
22
|
-
typedef
|
|
24
|
+
typedef PermutationIndex_ PermutationIndex;
|
|
23
25
|
enum { Flags = 0 };
|
|
24
26
|
};
|
|
25
27
|
|
|
26
|
-
}
|
|
28
|
+
} // end namespace internal
|
|
27
29
|
|
|
28
30
|
/** \ingroup QR_Module
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
template<typename
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
31
|
+
*
|
|
32
|
+
* \class ColPivHouseholderQR
|
|
33
|
+
*
|
|
34
|
+
* \brief Householder rank-revealing QR decomposition of a matrix with column-pivoting
|
|
35
|
+
*
|
|
36
|
+
* \tparam MatrixType_ the type of the matrix of which we are computing the QR decomposition
|
|
37
|
+
*
|
|
38
|
+
* This class performs a rank-revealing QR decomposition of a matrix \b A into matrices \b P, \b Q and \b R
|
|
39
|
+
* such that
|
|
40
|
+
* \f[
|
|
41
|
+
* \mathbf{A} \, \mathbf{P} = \mathbf{Q} \, \mathbf{R}
|
|
42
|
+
* \f]
|
|
43
|
+
* by using Householder transformations. Here, \b P is a permutation matrix, \b Q a unitary matrix and \b R an
|
|
44
|
+
* upper triangular matrix.
|
|
45
|
+
*
|
|
46
|
+
* This decomposition performs column pivoting in order to be rank-revealing and improve
|
|
47
|
+
* numerical stability. It is slower than HouseholderQR, and faster than FullPivHouseholderQR.
|
|
48
|
+
*
|
|
49
|
+
* This class supports the \link InplaceDecomposition inplace decomposition \endlink mechanism.
|
|
50
|
+
*
|
|
51
|
+
* \sa MatrixBase::colPivHouseholderQr()
|
|
52
|
+
*/
|
|
53
|
+
template <typename MatrixType_, typename PermutationIndex_>
|
|
54
|
+
class ColPivHouseholderQR : public SolverBase<ColPivHouseholderQR<MatrixType_, PermutationIndex_>> {
|
|
55
|
+
public:
|
|
56
|
+
typedef MatrixType_ MatrixType;
|
|
57
|
+
typedef SolverBase<ColPivHouseholderQR> Base;
|
|
58
|
+
friend class SolverBase<ColPivHouseholderQR>;
|
|
59
|
+
typedef PermutationIndex_ PermutationIndex;
|
|
60
|
+
EIGEN_GENERIC_PUBLIC_INTERFACE(ColPivHouseholderQR)
|
|
61
|
+
|
|
62
|
+
enum {
|
|
63
|
+
MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
|
|
64
|
+
MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
|
|
65
|
+
};
|
|
66
|
+
typedef typename internal::plain_diag_type<MatrixType>::type HCoeffsType;
|
|
67
|
+
typedef PermutationMatrix<ColsAtCompileTime, MaxColsAtCompileTime, PermutationIndex> PermutationType;
|
|
68
|
+
typedef typename internal::plain_row_type<MatrixType, PermutationIndex>::type IntRowVectorType;
|
|
69
|
+
typedef typename internal::plain_row_type<MatrixType>::type RowVectorType;
|
|
70
|
+
typedef typename internal::plain_row_type<MatrixType, RealScalar>::type RealRowVectorType;
|
|
71
|
+
typedef HouseholderSequence<MatrixType, internal::remove_all_t<typename HCoeffsType::ConjugateReturnType>>
|
|
72
|
+
HouseholderSequenceType;
|
|
73
|
+
typedef typename MatrixType::PlainObject PlainObject;
|
|
74
|
+
|
|
75
|
+
private:
|
|
76
|
+
void init(Index rows, Index cols) {
|
|
77
|
+
Index diag = numext::mini(rows, cols);
|
|
78
|
+
m_hCoeffs.resize(diag);
|
|
79
|
+
m_colsPermutation.resize(cols);
|
|
80
|
+
m_colsTranspositions.resize(cols);
|
|
81
|
+
m_temp.resize(cols);
|
|
82
|
+
m_colNormsUpdated.resize(cols);
|
|
83
|
+
m_colNormsDirect.resize(cols);
|
|
84
|
+
m_isInitialized = false;
|
|
85
|
+
m_usePrescribedThreshold = false;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
public:
|
|
89
|
+
/**
|
|
90
|
+
* \brief Default Constructor.
|
|
91
|
+
*
|
|
92
|
+
* The default constructor is useful in cases in which the user intends to
|
|
93
|
+
* perform decompositions via ColPivHouseholderQR::compute(const MatrixType&).
|
|
94
|
+
*/
|
|
95
|
+
ColPivHouseholderQR()
|
|
86
96
|
: m_qr(),
|
|
87
97
|
m_hCoeffs(),
|
|
88
98
|
m_colsPermutation(),
|
|
@@ -93,398 +103,390 @@ template<typename _MatrixType> class ColPivHouseholderQR
|
|
|
93
103
|
m_isInitialized(false),
|
|
94
104
|
m_usePrescribedThreshold(false) {}
|
|
95
105
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
106
|
+
/** \brief Default Constructor with memory preallocation
|
|
107
|
+
*
|
|
108
|
+
* Like the default constructor but with preallocation of the internal data
|
|
109
|
+
* according to the specified problem \a size.
|
|
110
|
+
* \sa ColPivHouseholderQR()
|
|
111
|
+
*/
|
|
112
|
+
ColPivHouseholderQR(Index rows, Index cols) : m_qr(rows, cols) { init(rows, cols); }
|
|
113
|
+
|
|
114
|
+
/** \brief Constructs a QR factorization from a given matrix
|
|
115
|
+
*
|
|
116
|
+
* This constructor computes the QR factorization of the matrix \a matrix by calling
|
|
117
|
+
* the method compute(). It is a short cut for:
|
|
118
|
+
*
|
|
119
|
+
* \code
|
|
120
|
+
* ColPivHouseholderQR<MatrixType> qr(matrix.rows(), matrix.cols());
|
|
121
|
+
* qr.compute(matrix);
|
|
122
|
+
* \endcode
|
|
123
|
+
*
|
|
124
|
+
* \sa compute()
|
|
125
|
+
*/
|
|
126
|
+
template <typename InputType>
|
|
127
|
+
explicit ColPivHouseholderQR(const EigenBase<InputType>& matrix) : m_qr(matrix.rows(), matrix.cols()) {
|
|
128
|
+
init(matrix.rows(), matrix.cols());
|
|
129
|
+
compute(matrix.derived());
|
|
130
|
+
}
|
|
112
131
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
template<typename InputType>
|
|
126
|
-
explicit ColPivHouseholderQR(const EigenBase<InputType>& matrix)
|
|
127
|
-
: m_qr(matrix.rows(), matrix.cols()),
|
|
128
|
-
m_hCoeffs((std::min)(matrix.rows(),matrix.cols())),
|
|
129
|
-
m_colsPermutation(PermIndexType(matrix.cols())),
|
|
130
|
-
m_colsTranspositions(matrix.cols()),
|
|
131
|
-
m_temp(matrix.cols()),
|
|
132
|
-
m_colNormsUpdated(matrix.cols()),
|
|
133
|
-
m_colNormsDirect(matrix.cols()),
|
|
134
|
-
m_isInitialized(false),
|
|
135
|
-
m_usePrescribedThreshold(false)
|
|
136
|
-
{
|
|
137
|
-
compute(matrix.derived());
|
|
138
|
-
}
|
|
132
|
+
/** \brief Constructs a QR factorization from a given matrix
|
|
133
|
+
*
|
|
134
|
+
* This overloaded constructor is provided for \link InplaceDecomposition inplace decomposition \endlink when \c
|
|
135
|
+
* MatrixType is a Eigen::Ref.
|
|
136
|
+
*
|
|
137
|
+
* \sa ColPivHouseholderQR(const EigenBase&)
|
|
138
|
+
*/
|
|
139
|
+
template <typename InputType>
|
|
140
|
+
explicit ColPivHouseholderQR(EigenBase<InputType>& matrix) : m_qr(matrix.derived()) {
|
|
141
|
+
init(matrix.rows(), matrix.cols());
|
|
142
|
+
computeInPlace();
|
|
143
|
+
}
|
|
139
144
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
computeInPlace();
|
|
159
|
-
}
|
|
145
|
+
#ifdef EIGEN_PARSED_BY_DOXYGEN
|
|
146
|
+
/** This method finds a solution x to the equation Ax=b, where A is the matrix of which
|
|
147
|
+
* *this is the QR decomposition, if any exists.
|
|
148
|
+
*
|
|
149
|
+
* \param b the right-hand-side of the equation to solve.
|
|
150
|
+
*
|
|
151
|
+
* \returns a solution.
|
|
152
|
+
*
|
|
153
|
+
* \note_about_checking_solutions
|
|
154
|
+
*
|
|
155
|
+
* \note_about_arbitrary_choice_of_solution
|
|
156
|
+
*
|
|
157
|
+
* Example: \include ColPivHouseholderQR_solve.cpp
|
|
158
|
+
* Output: \verbinclude ColPivHouseholderQR_solve.out
|
|
159
|
+
*/
|
|
160
|
+
template <typename Rhs>
|
|
161
|
+
inline const Solve<ColPivHouseholderQR, Rhs> solve(const MatrixBase<Rhs>& b) const;
|
|
162
|
+
#endif
|
|
160
163
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
* *this is the QR decomposition, if any exists.
|
|
164
|
-
*
|
|
165
|
-
* \param b the right-hand-side of the equation to solve.
|
|
166
|
-
*
|
|
167
|
-
* \returns a solution.
|
|
168
|
-
*
|
|
169
|
-
* \note_about_checking_solutions
|
|
170
|
-
*
|
|
171
|
-
* \note_about_arbitrary_choice_of_solution
|
|
172
|
-
*
|
|
173
|
-
* Example: \include ColPivHouseholderQR_solve.cpp
|
|
174
|
-
* Output: \verbinclude ColPivHouseholderQR_solve.out
|
|
175
|
-
*/
|
|
176
|
-
template<typename Rhs>
|
|
177
|
-
inline const Solve<ColPivHouseholderQR, Rhs>
|
|
178
|
-
solve(const MatrixBase<Rhs>& b) const;
|
|
179
|
-
#endif
|
|
180
|
-
|
|
181
|
-
HouseholderSequenceType householderQ() const;
|
|
182
|
-
HouseholderSequenceType matrixQ() const
|
|
183
|
-
{
|
|
184
|
-
return householderQ();
|
|
185
|
-
}
|
|
164
|
+
HouseholderSequenceType householderQ() const;
|
|
165
|
+
HouseholderSequenceType matrixQ() const { return householderQ(); }
|
|
186
166
|
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
}
|
|
167
|
+
/** \returns a reference to the matrix where the Householder QR decomposition is stored
|
|
168
|
+
*/
|
|
169
|
+
const MatrixType& matrixQR() const {
|
|
170
|
+
eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
|
|
171
|
+
return m_qr;
|
|
172
|
+
}
|
|
194
173
|
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
}
|
|
174
|
+
/** \returns a reference to the matrix where the result Householder QR is stored
|
|
175
|
+
* \warning The strict lower part of this matrix contains internal values.
|
|
176
|
+
* Only the upper triangular part should be referenced. To get it, use
|
|
177
|
+
* \code matrixR().template triangularView<Upper>() \endcode
|
|
178
|
+
* For rank-deficient matrices, use
|
|
179
|
+
* \code
|
|
180
|
+
* matrixR().topLeftCorner(rank(), rank()).template triangularView<Upper>()
|
|
181
|
+
* \endcode
|
|
182
|
+
*/
|
|
183
|
+
const MatrixType& matrixR() const {
|
|
184
|
+
eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
|
|
185
|
+
return m_qr;
|
|
186
|
+
}
|
|
209
187
|
|
|
210
|
-
|
|
211
|
-
|
|
188
|
+
template <typename InputType>
|
|
189
|
+
ColPivHouseholderQR& compute(const EigenBase<InputType>& matrix);
|
|
212
190
|
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
}
|
|
191
|
+
/** \returns a const reference to the column permutation matrix */
|
|
192
|
+
const PermutationType& colsPermutation() const {
|
|
193
|
+
eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
|
|
194
|
+
return m_colsPermutation;
|
|
195
|
+
}
|
|
219
196
|
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
197
|
+
/** \returns the determinant of the matrix of which
|
|
198
|
+
* *this is the QR decomposition. It has only linear complexity
|
|
199
|
+
* (that is, O(n) where n is the dimension of the square matrix)
|
|
200
|
+
* as the QR decomposition has already been computed.
|
|
201
|
+
*
|
|
202
|
+
* \note This is only for square matrices.
|
|
203
|
+
*
|
|
204
|
+
* \warning a determinant can be very big or small, so for matrices
|
|
205
|
+
* of large enough dimension, there is a risk of overflow/underflow.
|
|
206
|
+
* One way to work around that is to use logAbsDeterminant() instead.
|
|
207
|
+
*
|
|
208
|
+
* \sa absDeterminant(), logAbsDeterminant(), MatrixBase::determinant()
|
|
209
|
+
*/
|
|
210
|
+
typename MatrixType::Scalar determinant() const;
|
|
211
|
+
|
|
212
|
+
/** \returns the absolute value of the determinant of the matrix of which
|
|
213
|
+
* *this is the QR decomposition. It has only linear complexity
|
|
214
|
+
* (that is, O(n) where n is the dimension of the square matrix)
|
|
215
|
+
* as the QR decomposition has already been computed.
|
|
216
|
+
*
|
|
217
|
+
* \note This is only for square matrices.
|
|
218
|
+
*
|
|
219
|
+
* \warning a determinant can be very big or small, so for matrices
|
|
220
|
+
* of large enough dimension, there is a risk of overflow/underflow.
|
|
221
|
+
* One way to work around that is to use logAbsDeterminant() instead.
|
|
222
|
+
*
|
|
223
|
+
* \sa determinant(), logAbsDeterminant(), MatrixBase::determinant()
|
|
224
|
+
*/
|
|
225
|
+
typename MatrixType::RealScalar absDeterminant() const;
|
|
226
|
+
|
|
227
|
+
/** \returns the natural log of the absolute value of the determinant of the matrix of which
|
|
228
|
+
* *this is the QR decomposition. It has only linear complexity
|
|
229
|
+
* (that is, O(n) where n is the dimension of the square matrix)
|
|
230
|
+
* as the QR decomposition has already been computed.
|
|
231
|
+
*
|
|
232
|
+
* \note This is only for square matrices.
|
|
233
|
+
*
|
|
234
|
+
* \note This method is useful to work around the risk of overflow/underflow that's inherent
|
|
235
|
+
* to determinant computation.
|
|
236
|
+
*
|
|
237
|
+
* \sa determinant(), absDeterminant(), MatrixBase::determinant()
|
|
238
|
+
*/
|
|
239
|
+
typename MatrixType::RealScalar logAbsDeterminant() const;
|
|
240
|
+
|
|
241
|
+
/** \returns the sign of the determinant of the matrix of which
|
|
242
|
+
* *this is the QR decomposition. It has only linear complexity
|
|
243
|
+
* (that is, O(n) where n is the dimension of the square matrix)
|
|
244
|
+
* as the QR decomposition has already been computed.
|
|
245
|
+
*
|
|
246
|
+
* \note This is only for square matrices.
|
|
247
|
+
*
|
|
248
|
+
* \note This method is useful to work around the risk of overflow/underflow that's inherent
|
|
249
|
+
* to determinant computation.
|
|
250
|
+
*
|
|
251
|
+
* \sa determinant(), absDeterminant(), logAbsDeterminant(), MatrixBase::determinant()
|
|
252
|
+
*/
|
|
253
|
+
typename MatrixType::Scalar signDeterminant() const;
|
|
254
|
+
|
|
255
|
+
/** \returns the rank of the matrix of which *this is the QR decomposition.
|
|
256
|
+
*
|
|
257
|
+
* \note This method has to determine which pivots should be considered nonzero.
|
|
258
|
+
* For that, it uses the threshold value that you can control by calling
|
|
259
|
+
* setThreshold(const RealScalar&).
|
|
260
|
+
*/
|
|
261
|
+
inline Index rank() const {
|
|
262
|
+
using std::abs;
|
|
263
|
+
eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
|
|
264
|
+
RealScalar premultiplied_threshold = abs(m_maxpivot) * threshold();
|
|
265
|
+
Index result = 0;
|
|
266
|
+
for (Index i = 0; i < m_nonzero_pivots; ++i) result += (abs(m_qr.coeff(i, i)) > premultiplied_threshold);
|
|
267
|
+
return result;
|
|
268
|
+
}
|
|
265
269
|
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
}
|
|
270
|
+
/** \returns the dimension of the kernel of the matrix of which *this is the QR decomposition.
|
|
271
|
+
*
|
|
272
|
+
* \note This method has to determine which pivots should be considered nonzero.
|
|
273
|
+
* For that, it uses the threshold value that you can control by calling
|
|
274
|
+
* setThreshold(const RealScalar&).
|
|
275
|
+
*/
|
|
276
|
+
inline Index dimensionOfKernel() const {
|
|
277
|
+
eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
|
|
278
|
+
return cols() - rank();
|
|
279
|
+
}
|
|
277
280
|
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
}
|
|
281
|
+
/** \returns true if the matrix of which *this is the QR decomposition represents an injective
|
|
282
|
+
* linear map, i.e. has trivial kernel; false otherwise.
|
|
283
|
+
*
|
|
284
|
+
* \note This method has to determine which pivots should be considered nonzero.
|
|
285
|
+
* For that, it uses the threshold value that you can control by calling
|
|
286
|
+
* setThreshold(const RealScalar&).
|
|
287
|
+
*/
|
|
288
|
+
inline bool isInjective() const {
|
|
289
|
+
eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
|
|
290
|
+
return rank() == cols();
|
|
291
|
+
}
|
|
290
292
|
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
}
|
|
293
|
+
/** \returns true if the matrix of which *this is the QR decomposition represents a surjective
|
|
294
|
+
* linear map; false otherwise.
|
|
295
|
+
*
|
|
296
|
+
* \note This method has to determine which pivots should be considered nonzero.
|
|
297
|
+
* For that, it uses the threshold value that you can control by calling
|
|
298
|
+
* setThreshold(const RealScalar&).
|
|
299
|
+
*/
|
|
300
|
+
inline bool isSurjective() const {
|
|
301
|
+
eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
|
|
302
|
+
return rank() == rows();
|
|
303
|
+
}
|
|
303
304
|
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
}
|
|
305
|
+
/** \returns true if the matrix of which *this is the QR decomposition is invertible.
|
|
306
|
+
*
|
|
307
|
+
* \note This method has to determine which pivots should be considered nonzero.
|
|
308
|
+
* For that, it uses the threshold value that you can control by calling
|
|
309
|
+
* setThreshold(const RealScalar&).
|
|
310
|
+
*/
|
|
311
|
+
inline bool isInvertible() const {
|
|
312
|
+
eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
|
|
313
|
+
return isInjective() && isSurjective();
|
|
314
|
+
}
|
|
315
315
|
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
}
|
|
316
|
+
/** \returns the inverse of the matrix of which *this is the QR decomposition.
|
|
317
|
+
*
|
|
318
|
+
* \note If this matrix is not invertible, the returned matrix has undefined coefficients.
|
|
319
|
+
* Use isInvertible() to first determine whether this matrix is invertible.
|
|
320
|
+
*/
|
|
321
|
+
inline const Inverse<ColPivHouseholderQR> inverse() const {
|
|
322
|
+
eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
|
|
323
|
+
return Inverse<ColPivHouseholderQR>(*this);
|
|
324
|
+
}
|
|
326
325
|
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
}
|
|
326
|
+
inline Index rows() const { return m_qr.rows(); }
|
|
327
|
+
inline Index cols() const { return m_qr.cols(); }
|
|
328
|
+
|
|
329
|
+
/** \returns a const reference to the vector of Householder coefficients used to represent the factor \c Q.
|
|
330
|
+
*
|
|
331
|
+
* For advanced uses only.
|
|
332
|
+
*/
|
|
333
|
+
const HCoeffsType& hCoeffs() const { return m_hCoeffs; }
|
|
334
|
+
|
|
335
|
+
/** Allows to prescribe a threshold to be used by certain methods, such as rank(),
|
|
336
|
+
* who need to determine when pivots are to be considered nonzero. This is not used for the
|
|
337
|
+
* QR decomposition itself.
|
|
338
|
+
*
|
|
339
|
+
* When it needs to get the threshold value, Eigen calls threshold(). By default, this
|
|
340
|
+
* uses a formula to automatically determine a reasonable threshold.
|
|
341
|
+
* Once you have called the present method setThreshold(const RealScalar&),
|
|
342
|
+
* your value is used instead.
|
|
343
|
+
*
|
|
344
|
+
* \param threshold The new value to use as the threshold.
|
|
345
|
+
*
|
|
346
|
+
* A pivot will be considered nonzero if its absolute value is strictly greater than
|
|
347
|
+
* \f$ \vert pivot \vert \leqslant threshold \times \vert maxpivot \vert \f$
|
|
348
|
+
* where maxpivot is the biggest pivot.
|
|
349
|
+
*
|
|
350
|
+
* If you want to come back to the default behavior, call setThreshold(Default_t)
|
|
351
|
+
*/
|
|
352
|
+
ColPivHouseholderQR& setThreshold(const RealScalar& threshold) {
|
|
353
|
+
m_usePrescribedThreshold = true;
|
|
354
|
+
m_prescribedThreshold = threshold;
|
|
355
|
+
return *this;
|
|
356
|
+
}
|
|
359
357
|
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
}
|
|
358
|
+
/** Allows to come back to the default behavior, letting Eigen use its default formula for
|
|
359
|
+
* determining the threshold.
|
|
360
|
+
*
|
|
361
|
+
* You should pass the special object Eigen::Default as parameter here.
|
|
362
|
+
* \code qr.setThreshold(Eigen::Default); \endcode
|
|
363
|
+
*
|
|
364
|
+
* See the documentation of setThreshold(const RealScalar&).
|
|
365
|
+
*/
|
|
366
|
+
ColPivHouseholderQR& setThreshold(Default_t) {
|
|
367
|
+
m_usePrescribedThreshold = false;
|
|
368
|
+
return *this;
|
|
369
|
+
}
|
|
373
370
|
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
}
|
|
371
|
+
/** Returns the threshold that will be used by certain methods such as rank().
|
|
372
|
+
*
|
|
373
|
+
* See the documentation of setThreshold(const RealScalar&).
|
|
374
|
+
*/
|
|
375
|
+
RealScalar threshold() const {
|
|
376
|
+
eigen_assert(m_isInitialized || m_usePrescribedThreshold);
|
|
377
|
+
return m_usePrescribedThreshold ? m_prescribedThreshold
|
|
378
|
+
// this formula comes from experimenting (see "LU precision tuning" thread on the
|
|
379
|
+
// list) and turns out to be identical to Higham's formula used already in LDLt.
|
|
380
|
+
: NumTraits<Scalar>::epsilon() * RealScalar(m_qr.diagonalSize());
|
|
381
|
+
}
|
|
386
382
|
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
}
|
|
383
|
+
/** \returns the number of nonzero pivots in the QR decomposition.
|
|
384
|
+
* Here nonzero is meant in the exact sense, not in a fuzzy sense.
|
|
385
|
+
* So that notion isn't really intrinsically interesting, but it is
|
|
386
|
+
* still useful when implementing algorithms.
|
|
387
|
+
*
|
|
388
|
+
* \sa rank()
|
|
389
|
+
*/
|
|
390
|
+
inline Index nonzeroPivots() const {
|
|
391
|
+
eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
|
|
392
|
+
return m_nonzero_pivots;
|
|
393
|
+
}
|
|
399
394
|
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
}
|
|
395
|
+
/** \returns the absolute value of the biggest pivot, i.e. the biggest
|
|
396
|
+
* diagonal coefficient of R.
|
|
397
|
+
*/
|
|
398
|
+
RealScalar maxPivot() const { return m_maxpivot; }
|
|
399
|
+
|
|
400
|
+
/** \brief Reports whether the QR factorization was successful.
|
|
401
|
+
*
|
|
402
|
+
* \note This function always returns \c Success. It is provided for compatibility
|
|
403
|
+
* with other factorization routines.
|
|
404
|
+
* \returns \c Success
|
|
405
|
+
*/
|
|
406
|
+
ComputationInfo info() const {
|
|
407
|
+
eigen_assert(m_isInitialized && "Decomposition is not initialized.");
|
|
408
|
+
return Success;
|
|
409
|
+
}
|
|
416
410
|
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
411
|
+
#ifndef EIGEN_PARSED_BY_DOXYGEN
|
|
412
|
+
template <typename RhsType, typename DstType>
|
|
413
|
+
void _solve_impl(const RhsType& rhs, DstType& dst) const;
|
|
420
414
|
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
415
|
+
template <bool Conjugate, typename RhsType, typename DstType>
|
|
416
|
+
void _solve_impl_transposed(const RhsType& rhs, DstType& dst) const;
|
|
417
|
+
#endif
|
|
424
418
|
|
|
425
|
-
|
|
419
|
+
protected:
|
|
420
|
+
friend class CompleteOrthogonalDecomposition<MatrixType, PermutationIndex>;
|
|
426
421
|
|
|
427
|
-
|
|
422
|
+
EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
|
|
428
423
|
|
|
429
|
-
|
|
430
|
-
{
|
|
431
|
-
EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar);
|
|
432
|
-
}
|
|
424
|
+
void computeInPlace();
|
|
433
425
|
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
Index m_nonzero_pivots;
|
|
446
|
-
Index m_det_pq;
|
|
426
|
+
MatrixType m_qr;
|
|
427
|
+
HCoeffsType m_hCoeffs;
|
|
428
|
+
PermutationType m_colsPermutation;
|
|
429
|
+
IntRowVectorType m_colsTranspositions;
|
|
430
|
+
RowVectorType m_temp;
|
|
431
|
+
RealRowVectorType m_colNormsUpdated;
|
|
432
|
+
RealRowVectorType m_colNormsDirect;
|
|
433
|
+
bool m_isInitialized, m_usePrescribedThreshold;
|
|
434
|
+
RealScalar m_prescribedThreshold, m_maxpivot;
|
|
435
|
+
Index m_nonzero_pivots;
|
|
436
|
+
Index m_det_p;
|
|
447
437
|
};
|
|
448
438
|
|
|
449
|
-
template<typename MatrixType>
|
|
450
|
-
typename MatrixType::
|
|
451
|
-
|
|
439
|
+
template <typename MatrixType, typename PermutationIndex>
|
|
440
|
+
typename MatrixType::Scalar ColPivHouseholderQR<MatrixType, PermutationIndex>::determinant() const {
|
|
441
|
+
eigen_assert(m_isInitialized && "HouseholderQR is not initialized.");
|
|
442
|
+
eigen_assert(m_qr.rows() == m_qr.cols() && "You can't take the determinant of a non-square matrix!");
|
|
443
|
+
Scalar detQ;
|
|
444
|
+
internal::householder_determinant<HCoeffsType, Scalar, NumTraits<Scalar>::IsComplex>::run(m_hCoeffs, detQ);
|
|
445
|
+
return isInjective() ? (detQ * Scalar(m_det_p)) * m_qr.diagonal().prod() : Scalar(0);
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
template <typename MatrixType, typename PermutationIndex>
|
|
449
|
+
typename MatrixType::RealScalar ColPivHouseholderQR<MatrixType, PermutationIndex>::absDeterminant() const {
|
|
452
450
|
using std::abs;
|
|
453
451
|
eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
|
|
454
452
|
eigen_assert(m_qr.rows() == m_qr.cols() && "You can't take the determinant of a non-square matrix!");
|
|
455
|
-
return abs(m_qr.diagonal().prod());
|
|
453
|
+
return isInjective() ? abs(m_qr.diagonal().prod()) : RealScalar(0);
|
|
456
454
|
}
|
|
457
455
|
|
|
458
|
-
template<typename MatrixType>
|
|
459
|
-
typename MatrixType::RealScalar ColPivHouseholderQR<MatrixType>::logAbsDeterminant() const
|
|
460
|
-
{
|
|
456
|
+
template <typename MatrixType, typename PermutationIndex>
|
|
457
|
+
typename MatrixType::RealScalar ColPivHouseholderQR<MatrixType, PermutationIndex>::logAbsDeterminant() const {
|
|
461
458
|
eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
|
|
462
459
|
eigen_assert(m_qr.rows() == m_qr.cols() && "You can't take the determinant of a non-square matrix!");
|
|
463
|
-
return m_qr.diagonal().cwiseAbs().array().log().sum();
|
|
460
|
+
return isInjective() ? m_qr.diagonal().cwiseAbs().array().log().sum() : -NumTraits<RealScalar>::infinity();
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
template <typename MatrixType, typename PermutationIndex>
|
|
464
|
+
typename MatrixType::Scalar ColPivHouseholderQR<MatrixType, PermutationIndex>::signDeterminant() const {
|
|
465
|
+
eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
|
|
466
|
+
eigen_assert(m_qr.rows() == m_qr.cols() && "You can't take the determinant of a non-square matrix!");
|
|
467
|
+
Scalar detQ;
|
|
468
|
+
internal::householder_determinant<HCoeffsType, Scalar, NumTraits<Scalar>::IsComplex>::run(m_hCoeffs, detQ);
|
|
469
|
+
return isInjective() ? (detQ * Scalar(m_det_p)) * m_qr.diagonal().array().sign().prod() : Scalar(0);
|
|
464
470
|
}
|
|
465
471
|
|
|
466
472
|
/** Performs the QR factorization of the given matrix \a matrix. The result of
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
template<typename MatrixType>
|
|
473
|
-
template<typename InputType>
|
|
474
|
-
ColPivHouseholderQR<MatrixType>& ColPivHouseholderQR<MatrixType>::compute(
|
|
475
|
-
{
|
|
473
|
+
* the factorization is stored into \c *this, and a reference to \c *this
|
|
474
|
+
* is returned.
|
|
475
|
+
*
|
|
476
|
+
* \sa class ColPivHouseholderQR, ColPivHouseholderQR(const MatrixType&)
|
|
477
|
+
*/
|
|
478
|
+
template <typename MatrixType, typename PermutationIndex>
|
|
479
|
+
template <typename InputType>
|
|
480
|
+
ColPivHouseholderQR<MatrixType, PermutationIndex>& ColPivHouseholderQR<MatrixType, PermutationIndex>::compute(
|
|
481
|
+
const EigenBase<InputType>& matrix) {
|
|
476
482
|
m_qr = matrix.derived();
|
|
477
483
|
computeInPlace();
|
|
478
484
|
return *this;
|
|
479
485
|
}
|
|
480
486
|
|
|
481
|
-
template<typename MatrixType>
|
|
482
|
-
void ColPivHouseholderQR<MatrixType>::computeInPlace()
|
|
483
|
-
|
|
484
|
-
check_template_parameters();
|
|
485
|
-
|
|
486
|
-
// the column permutation is stored as int indices, so just to be sure:
|
|
487
|
-
eigen_assert(m_qr.cols()<=NumTraits<int>::highest());
|
|
487
|
+
template <typename MatrixType, typename PermutationIndex>
|
|
488
|
+
void ColPivHouseholderQR<MatrixType, PermutationIndex>::computeInPlace() {
|
|
489
|
+
eigen_assert(m_qr.cols() <= NumTraits<PermutationIndex>::highest());
|
|
488
490
|
|
|
489
491
|
using std::abs;
|
|
490
492
|
|
|
@@ -508,27 +510,26 @@ void ColPivHouseholderQR<MatrixType>::computeInPlace()
|
|
|
508
510
|
m_colNormsUpdated.coeffRef(k) = m_colNormsDirect.coeffRef(k);
|
|
509
511
|
}
|
|
510
512
|
|
|
511
|
-
RealScalar threshold_helper =
|
|
513
|
+
RealScalar threshold_helper =
|
|
514
|
+
numext::abs2<RealScalar>(m_colNormsUpdated.maxCoeff() * NumTraits<RealScalar>::epsilon()) / RealScalar(rows);
|
|
512
515
|
RealScalar norm_downdate_threshold = numext::sqrt(NumTraits<RealScalar>::epsilon());
|
|
513
516
|
|
|
514
|
-
m_nonzero_pivots = size;
|
|
517
|
+
m_nonzero_pivots = size; // the generic case is that in which all pivots are nonzero (invertible case)
|
|
515
518
|
m_maxpivot = RealScalar(0);
|
|
516
519
|
|
|
517
|
-
for(Index k = 0; k < size; ++k)
|
|
518
|
-
{
|
|
520
|
+
for (Index k = 0; k < size; ++k) {
|
|
519
521
|
// first, we look up in our table m_colNormsUpdated which column has the biggest norm
|
|
520
522
|
Index biggest_col_index;
|
|
521
|
-
RealScalar biggest_col_sq_norm = numext::abs2(m_colNormsUpdated.tail(cols-k).maxCoeff(&biggest_col_index));
|
|
523
|
+
RealScalar biggest_col_sq_norm = numext::abs2(m_colNormsUpdated.tail(cols - k).maxCoeff(&biggest_col_index));
|
|
522
524
|
biggest_col_index += k;
|
|
523
525
|
|
|
524
526
|
// Track the number of meaningful pivots but do not stop the decomposition to make
|
|
525
527
|
// sure that the initial matrix is properly reproduced. See bug 941.
|
|
526
|
-
if(m_nonzero_pivots==size && biggest_col_sq_norm < threshold_helper * RealScalar(rows-k))
|
|
527
|
-
m_nonzero_pivots = k;
|
|
528
|
+
if (m_nonzero_pivots == size && biggest_col_sq_norm < threshold_helper * RealScalar(rows - k)) m_nonzero_pivots = k;
|
|
528
529
|
|
|
529
530
|
// apply the transposition to the columns
|
|
530
|
-
m_colsTranspositions.coeffRef(k) = biggest_col_index;
|
|
531
|
-
if(k != biggest_col_index) {
|
|
531
|
+
m_colsTranspositions.coeffRef(k) = static_cast<PermutationIndex>(biggest_col_index);
|
|
532
|
+
if (k != biggest_col_index) {
|
|
532
533
|
m_qr.col(k).swap(m_qr.col(biggest_col_index));
|
|
533
534
|
std::swap(m_colNormsUpdated.coeffRef(k), m_colNormsUpdated.coeffRef(biggest_col_index));
|
|
534
535
|
std::swap(m_colNormsDirect.coeffRef(k), m_colNormsDirect.coeffRef(biggest_col_index));
|
|
@@ -537,17 +538,17 @@ void ColPivHouseholderQR<MatrixType>::computeInPlace()
|
|
|
537
538
|
|
|
538
539
|
// generate the householder vector, store it below the diagonal
|
|
539
540
|
RealScalar beta;
|
|
540
|
-
m_qr.col(k).tail(rows-k).makeHouseholderInPlace(m_hCoeffs.coeffRef(k), beta);
|
|
541
|
+
m_qr.col(k).tail(rows - k).makeHouseholderInPlace(m_hCoeffs.coeffRef(k), beta);
|
|
541
542
|
|
|
542
543
|
// apply the householder transformation to the diagonal coefficient
|
|
543
|
-
m_qr.coeffRef(k,k) = beta;
|
|
544
|
+
m_qr.coeffRef(k, k) = beta;
|
|
544
545
|
|
|
545
546
|
// remember the maximum absolute value of diagonal coefficients
|
|
546
|
-
if(abs(beta) > m_maxpivot) m_maxpivot = abs(beta);
|
|
547
|
+
if (abs(beta) > m_maxpivot) m_maxpivot = abs(beta);
|
|
547
548
|
|
|
548
549
|
// apply the householder transformation
|
|
549
|
-
m_qr.bottomRightCorner(rows-k, cols-k-1)
|
|
550
|
-
.applyHouseholderOnTheLeft(m_qr.col(k).tail(rows-k-1), m_hCoeffs.coeffRef(k), &m_temp.coeffRef(k+1));
|
|
550
|
+
m_qr.bottomRightCorner(rows - k, cols - k - 1)
|
|
551
|
+
.applyHouseholderOnTheLeft(m_qr.col(k).tail(rows - k - 1), m_hCoeffs.coeffRef(k), &m_temp.coeffRef(k + 1));
|
|
551
552
|
|
|
552
553
|
// update our table of norms of the columns
|
|
553
554
|
for (Index j = k + 1; j < cols; ++j) {
|
|
@@ -555,12 +556,12 @@ void ColPivHouseholderQR<MatrixType>::computeInPlace()
|
|
|
555
556
|
// http://www.netlib.org/lapack/lawnspdf/lawn176.pdf
|
|
556
557
|
// and used in LAPACK routines xGEQPF and xGEQP3.
|
|
557
558
|
// See lines 278-297 in http://www.netlib.org/lapack/explore-html/dc/df4/sgeqpf_8f_source.html
|
|
558
|
-
if (m_colNormsUpdated.coeffRef(j)
|
|
559
|
+
if (!numext::is_exactly_zero(m_colNormsUpdated.coeffRef(j))) {
|
|
559
560
|
RealScalar temp = abs(m_qr.coeffRef(k, j)) / m_colNormsUpdated.coeffRef(j);
|
|
560
561
|
temp = (RealScalar(1) + temp) * (RealScalar(1) - temp);
|
|
561
|
-
temp = temp <
|
|
562
|
-
RealScalar temp2 =
|
|
563
|
-
|
|
562
|
+
temp = temp < RealScalar(0) ? RealScalar(0) : temp;
|
|
563
|
+
RealScalar temp2 =
|
|
564
|
+
temp * numext::abs2<RealScalar>(m_colNormsUpdated.coeffRef(j) / m_colNormsDirect.coeffRef(j));
|
|
564
565
|
if (temp2 <= norm_downdate_threshold) {
|
|
565
566
|
// The updated norm has become too inaccurate so re-compute the column
|
|
566
567
|
// norm directly.
|
|
@@ -573,102 +574,101 @@ void ColPivHouseholderQR<MatrixType>::computeInPlace()
|
|
|
573
574
|
}
|
|
574
575
|
}
|
|
575
576
|
|
|
576
|
-
m_colsPermutation.setIdentity(
|
|
577
|
-
for(
|
|
578
|
-
m_colsPermutation.applyTranspositionOnTheRight(k,
|
|
577
|
+
m_colsPermutation.setIdentity(cols);
|
|
578
|
+
for (Index k = 0; k < size /*m_nonzero_pivots*/; ++k)
|
|
579
|
+
m_colsPermutation.applyTranspositionOnTheRight(k, static_cast<Index>(m_colsTranspositions.coeff(k)));
|
|
579
580
|
|
|
580
|
-
|
|
581
|
+
m_det_p = (number_of_transpositions % 2) ? -1 : 1;
|
|
581
582
|
m_isInitialized = true;
|
|
582
583
|
}
|
|
583
584
|
|
|
584
585
|
#ifndef EIGEN_PARSED_BY_DOXYGEN
|
|
585
|
-
template<typename
|
|
586
|
-
template<typename RhsType, typename DstType>
|
|
587
|
-
void ColPivHouseholderQR<
|
|
588
|
-
{
|
|
586
|
+
template <typename MatrixType_, typename PermutationIndex_>
|
|
587
|
+
template <typename RhsType, typename DstType>
|
|
588
|
+
void ColPivHouseholderQR<MatrixType_, PermutationIndex_>::_solve_impl(const RhsType& rhs, DstType& dst) const {
|
|
589
589
|
const Index nonzero_pivots = nonzeroPivots();
|
|
590
590
|
|
|
591
|
-
if(nonzero_pivots == 0)
|
|
592
|
-
{
|
|
591
|
+
if (nonzero_pivots == 0) {
|
|
593
592
|
dst.setZero();
|
|
594
593
|
return;
|
|
595
594
|
}
|
|
596
595
|
|
|
597
596
|
typename RhsType::PlainObject c(rhs);
|
|
598
597
|
|
|
599
|
-
c.applyOnTheLeft(householderQ().setLength(nonzero_pivots).adjoint()
|
|
598
|
+
c.applyOnTheLeft(householderQ().setLength(nonzero_pivots).adjoint());
|
|
600
599
|
|
|
601
600
|
m_qr.topLeftCorner(nonzero_pivots, nonzero_pivots)
|
|
602
601
|
.template triangularView<Upper>()
|
|
603
602
|
.solveInPlace(c.topRows(nonzero_pivots));
|
|
604
603
|
|
|
605
|
-
for(Index i = 0; i < nonzero_pivots; ++i) dst.row(m_colsPermutation.indices().coeff(i)) = c.row(i);
|
|
606
|
-
for(Index i = nonzero_pivots; i < cols(); ++i) dst.row(m_colsPermutation.indices().coeff(i)).setZero();
|
|
604
|
+
for (Index i = 0; i < nonzero_pivots; ++i) dst.row(m_colsPermutation.indices().coeff(i)) = c.row(i);
|
|
605
|
+
for (Index i = nonzero_pivots; i < cols(); ++i) dst.row(m_colsPermutation.indices().coeff(i)).setZero();
|
|
607
606
|
}
|
|
608
607
|
|
|
609
|
-
template<typename
|
|
610
|
-
template<bool Conjugate, typename RhsType, typename DstType>
|
|
611
|
-
void ColPivHouseholderQR<
|
|
612
|
-
{
|
|
608
|
+
template <typename MatrixType_, typename PermutationIndex_>
|
|
609
|
+
template <bool Conjugate, typename RhsType, typename DstType>
|
|
610
|
+
void ColPivHouseholderQR<MatrixType_, PermutationIndex_>::_solve_impl_transposed(const RhsType& rhs,
|
|
611
|
+
DstType& dst) const {
|
|
613
612
|
const Index nonzero_pivots = nonzeroPivots();
|
|
614
613
|
|
|
615
|
-
if(nonzero_pivots == 0)
|
|
616
|
-
{
|
|
614
|
+
if (nonzero_pivots == 0) {
|
|
617
615
|
dst.setZero();
|
|
618
616
|
return;
|
|
619
617
|
}
|
|
620
618
|
|
|
621
|
-
typename RhsType::PlainObject c(m_colsPermutation.transpose()*rhs);
|
|
619
|
+
typename RhsType::PlainObject c(m_colsPermutation.transpose() * rhs);
|
|
622
620
|
|
|
623
621
|
m_qr.topLeftCorner(nonzero_pivots, nonzero_pivots)
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
622
|
+
.template triangularView<Upper>()
|
|
623
|
+
.transpose()
|
|
624
|
+
.template conjugateIf<Conjugate>()
|
|
625
|
+
.solveInPlace(c.topRows(nonzero_pivots));
|
|
627
626
|
|
|
628
627
|
dst.topRows(nonzero_pivots) = c.topRows(nonzero_pivots);
|
|
629
|
-
dst.bottomRows(rows()-nonzero_pivots).setZero();
|
|
628
|
+
dst.bottomRows(rows() - nonzero_pivots).setZero();
|
|
630
629
|
|
|
631
|
-
dst.applyOnTheLeft(householderQ().setLength(nonzero_pivots).template conjugateIf<!Conjugate>()
|
|
630
|
+
dst.applyOnTheLeft(householderQ().setLength(nonzero_pivots).template conjugateIf<!Conjugate>());
|
|
632
631
|
}
|
|
633
632
|
#endif
|
|
634
633
|
|
|
635
634
|
namespace internal {
|
|
636
635
|
|
|
637
|
-
template<typename DstXprType, typename MatrixType>
|
|
638
|
-
struct Assignment<DstXprType, Inverse<ColPivHouseholderQR<MatrixType
|
|
639
|
-
|
|
640
|
-
|
|
636
|
+
template <typename DstXprType, typename MatrixType, typename PermutationIndex>
|
|
637
|
+
struct Assignment<DstXprType, Inverse<ColPivHouseholderQR<MatrixType, PermutationIndex>>,
|
|
638
|
+
internal::assign_op<typename DstXprType::Scalar,
|
|
639
|
+
typename ColPivHouseholderQR<MatrixType, PermutationIndex>::Scalar>,
|
|
640
|
+
Dense2Dense> {
|
|
641
|
+
typedef ColPivHouseholderQR<MatrixType, PermutationIndex> QrType;
|
|
641
642
|
typedef Inverse<QrType> SrcXprType;
|
|
642
|
-
static void run(DstXprType
|
|
643
|
-
|
|
643
|
+
static void run(DstXprType& dst, const SrcXprType& src,
|
|
644
|
+
const internal::assign_op<typename DstXprType::Scalar, typename QrType::Scalar>&) {
|
|
644
645
|
dst = src.nestedExpression().solve(MatrixType::Identity(src.rows(), src.cols()));
|
|
645
646
|
}
|
|
646
647
|
};
|
|
647
648
|
|
|
648
|
-
}
|
|
649
|
+
} // end namespace internal
|
|
649
650
|
|
|
650
651
|
/** \returns the matrix Q as a sequence of householder transformations.
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
template<typename MatrixType>
|
|
654
|
-
typename ColPivHouseholderQR<MatrixType>::HouseholderSequenceType
|
|
655
|
-
|
|
656
|
-
{
|
|
652
|
+
* You can extract the meaningful part only by using:
|
|
653
|
+
* \code qr.householderQ().setLength(qr.nonzeroPivots()) \endcode*/
|
|
654
|
+
template <typename MatrixType, typename PermutationIndex>
|
|
655
|
+
typename ColPivHouseholderQR<MatrixType, PermutationIndex>::HouseholderSequenceType
|
|
656
|
+
ColPivHouseholderQR<MatrixType, PermutationIndex>::householderQ() const {
|
|
657
657
|
eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
|
|
658
658
|
return HouseholderSequenceType(m_qr, m_hCoeffs.conjugate());
|
|
659
659
|
}
|
|
660
660
|
|
|
661
661
|
/** \return the column-pivoting Householder QR decomposition of \c *this.
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
template<typename Derived>
|
|
666
|
-
|
|
667
|
-
MatrixBase<Derived>::
|
|
668
|
-
{
|
|
669
|
-
return ColPivHouseholderQR<PlainObject>(eval());
|
|
662
|
+
*
|
|
663
|
+
* \sa class ColPivHouseholderQR
|
|
664
|
+
*/
|
|
665
|
+
template <typename Derived>
|
|
666
|
+
template <typename PermutationIndexType>
|
|
667
|
+
const ColPivHouseholderQR<typename MatrixBase<Derived>::PlainObject, PermutationIndexType>
|
|
668
|
+
MatrixBase<Derived>::colPivHouseholderQr() const {
|
|
669
|
+
return ColPivHouseholderQR<PlainObject, PermutationIndexType>(eval());
|
|
670
670
|
}
|
|
671
671
|
|
|
672
|
-
}
|
|
672
|
+
} // end namespace Eigen
|
|
673
673
|
|
|
674
|
-
#endif
|
|
674
|
+
#endif // EIGEN_COLPIVOTINGHOUSEHOLDERQR_H
|