@smake/eigen 1.0.2 → 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 -21
- package/eigen/Eigen/CholmodSupport +28 -28
- package/eigen/Eigen/Core +235 -326
- package/eigen/Eigen/Eigenvalues +16 -14
- package/eigen/Eigen/Geometry +21 -24
- package/eigen/Eigen/Householder +9 -8
- package/eigen/Eigen/IterativeLinearSolvers +8 -4
- package/eigen/Eigen/Jacobi +14 -14
- package/eigen/Eigen/KLUSupport +43 -0
- package/eigen/Eigen/LU +16 -20
- package/eigen/Eigen/MetisSupport +12 -12
- package/eigen/Eigen/OrderingMethods +54 -54
- package/eigen/Eigen/PaStiXSupport +23 -20
- package/eigen/Eigen/PardisoSupport +17 -14
- package/eigen/Eigen/QR +18 -21
- package/eigen/Eigen/QtAlignedMalloc +5 -13
- package/eigen/Eigen/SPQRSupport +21 -14
- package/eigen/Eigen/SVD +23 -18
- package/eigen/Eigen/Sparse +1 -4
- package/eigen/Eigen/SparseCholesky +18 -23
- package/eigen/Eigen/SparseCore +18 -17
- package/eigen/Eigen/SparseLU +12 -8
- 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 +377 -401
- package/eigen/Eigen/src/Cholesky/LLT.h +332 -360
- package/eigen/Eigen/src/Cholesky/LLT_LAPACKE.h +81 -56
- package/eigen/Eigen/src/CholmodSupport/CholmodSupport.h +620 -521
- package/eigen/Eigen/src/CholmodSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Core/ArithmeticSequence.h +239 -0
- package/eigen/Eigen/src/Core/Array.h +341 -294
- package/eigen/Eigen/src/Core/ArrayBase.h +190 -203
- package/eigen/Eigen/src/Core/ArrayWrapper.h +127 -171
- package/eigen/Eigen/src/Core/Assign.h +30 -40
- package/eigen/Eigen/src/Core/AssignEvaluator.h +711 -589
- package/eigen/Eigen/src/Core/Assign_MKL.h +130 -125
- package/eigen/Eigen/src/Core/BandMatrix.h +268 -283
- package/eigen/Eigen/src/Core/Block.h +375 -398
- package/eigen/Eigen/src/Core/CommaInitializer.h +86 -97
- package/eigen/Eigen/src/Core/ConditionEstimator.h +51 -53
- package/eigen/Eigen/src/Core/CoreEvaluators.h +1356 -1026
- package/eigen/Eigen/src/Core/CoreIterators.h +73 -59
- package/eigen/Eigen/src/Core/CwiseBinaryOp.h +114 -132
- package/eigen/Eigen/src/Core/CwiseNullaryOp.h +726 -617
- package/eigen/Eigen/src/Core/CwiseTernaryOp.h +77 -103
- package/eigen/Eigen/src/Core/CwiseUnaryOp.h +56 -68
- package/eigen/Eigen/src/Core/CwiseUnaryView.h +132 -95
- package/eigen/Eigen/src/Core/DenseBase.h +632 -571
- package/eigen/Eigen/src/Core/DenseCoeffsBase.h +511 -624
- package/eigen/Eigen/src/Core/DenseStorage.h +512 -509
- package/eigen/Eigen/src/Core/DeviceWrapper.h +153 -0
- package/eigen/Eigen/src/Core/Diagonal.h +169 -210
- package/eigen/Eigen/src/Core/DiagonalMatrix.h +351 -274
- package/eigen/Eigen/src/Core/DiagonalProduct.h +12 -10
- package/eigen/Eigen/src/Core/Dot.h +172 -222
- package/eigen/Eigen/src/Core/EigenBase.h +75 -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 -109
- package/eigen/Eigen/src/Core/Fuzzy.h +82 -105
- package/eigen/Eigen/src/Core/GeneralProduct.h +327 -263
- package/eigen/Eigen/src/Core/GenericPacketMath.h +1472 -360
- package/eigen/Eigen/src/Core/GlobalFunctions.h +194 -151
- package/eigen/Eigen/src/Core/IO.h +147 -139
- package/eigen/Eigen/src/Core/IndexedView.h +321 -0
- 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 +56 -66
- package/eigen/Eigen/src/Core/Map.h +124 -142
- package/eigen/Eigen/src/Core/MapBase.h +256 -281
- package/eigen/Eigen/src/Core/MathFunctions.h +1620 -938
- package/eigen/Eigen/src/Core/MathFunctionsImpl.h +233 -71
- package/eigen/Eigen/src/Core/Matrix.h +491 -416
- package/eigen/Eigen/src/Core/MatrixBase.h +468 -453
- package/eigen/Eigen/src/Core/NestByValue.h +66 -85
- package/eigen/Eigen/src/Core/NoAlias.h +79 -85
- package/eigen/Eigen/src/Core/NumTraits.h +235 -148
- package/eigen/Eigen/src/Core/PartialReduxEvaluator.h +253 -0
- package/eigen/Eigen/src/Core/PermutationMatrix.h +461 -511
- package/eigen/Eigen/src/Core/PlainObjectBase.h +871 -894
- package/eigen/Eigen/src/Core/Product.h +260 -139
- package/eigen/Eigen/src/Core/ProductEvaluators.h +863 -714
- package/eigen/Eigen/src/Core/Random.h +161 -136
- 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 +366 -336
- package/eigen/Eigen/src/Core/Ref.h +308 -209
- package/eigen/Eigen/src/Core/Replicate.h +94 -106
- package/eigen/Eigen/src/Core/Reshaped.h +398 -0
- package/eigen/Eigen/src/Core/ReturnByValue.h +49 -55
- package/eigen/Eigen/src/Core/Reverse.h +136 -145
- package/eigen/Eigen/src/Core/Select.h +70 -140
- package/eigen/Eigen/src/Core/SelfAdjointView.h +262 -285
- 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 +97 -111
- package/eigen/Eigen/src/Core/SolveTriangular.h +131 -129
- package/eigen/Eigen/src/Core/SolverBase.h +138 -101
- package/eigen/Eigen/src/Core/StableNorm.h +156 -160
- package/eigen/Eigen/src/Core/StlIterators.h +619 -0
- package/eigen/Eigen/src/Core/Stride.h +91 -88
- package/eigen/Eigen/src/Core/Swap.h +70 -38
- package/eigen/Eigen/src/Core/Transpose.h +295 -273
- package/eigen/Eigen/src/Core/Transpositions.h +272 -317
- package/eigen/Eigen/src/Core/TriangularMatrix.h +670 -755
- package/eigen/Eigen/src/Core/VectorBlock.h +59 -72
- package/eigen/Eigen/src/Core/VectorwiseOp.h +668 -630
- package/eigen/Eigen/src/Core/Visitor.h +480 -216
- package/eigen/Eigen/src/Core/arch/AVX/Complex.h +407 -293
- package/eigen/Eigen/src/Core/arch/AVX/MathFunctions.h +79 -388
- package/eigen/Eigen/src/Core/arch/AVX/PacketMath.h +2935 -491
- package/eigen/Eigen/src/Core/arch/AVX/Reductions.h +353 -0
- package/eigen/Eigen/src/Core/arch/AVX/TypeCasting.h +279 -22
- package/eigen/Eigen/src/Core/arch/AVX512/Complex.h +472 -0
- package/eigen/Eigen/src/Core/arch/AVX512/GemmKernel.h +1245 -0
- package/eigen/Eigen/src/Core/arch/AVX512/MathFunctions.h +85 -333
- package/eigen/Eigen/src/Core/arch/AVX512/MathFunctionsFP16.h +75 -0
- package/eigen/Eigen/src/Core/arch/AVX512/PacketMath.h +2490 -649
- 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 +277 -0
- package/eigen/Eigen/src/Core/arch/AVX512/TypeCastingFP16.h +130 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/Complex.h +521 -298
- package/eigen/Eigen/src/Core/arch/AltiVec/MathFunctions.h +39 -280
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProduct.h +3686 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductCommon.h +205 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductMMA.h +901 -0
- 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 +3391 -723
- package/eigen/Eigen/src/Core/arch/AltiVec/TypeCasting.h +153 -0
- package/eigen/Eigen/src/Core/arch/Default/BFloat16.h +866 -0
- package/eigen/Eigen/src/Core/arch/Default/ConjHelper.h +113 -14
- package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h +2634 -0
- package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctionsFwd.h +227 -0
- package/eigen/Eigen/src/Core/arch/Default/Half.h +1091 -0
- package/eigen/Eigen/src/Core/arch/Default/Settings.h +11 -13
- package/eigen/Eigen/src/Core/arch/GPU/Complex.h +244 -0
- package/eigen/Eigen/src/Core/arch/GPU/MathFunctions.h +104 -0
- package/eigen/Eigen/src/Core/arch/GPU/PacketMath.h +1712 -0
- package/eigen/Eigen/src/Core/arch/GPU/Tuple.h +268 -0
- package/eigen/Eigen/src/Core/arch/GPU/TypeCasting.h +77 -0
- package/eigen/Eigen/src/Core/arch/HIP/hcc/math_constants.h +23 -0
- 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 +620 -0
- package/eigen/Eigen/src/Core/arch/MSA/MathFunctions.h +379 -0
- package/eigen/Eigen/src/Core/arch/MSA/PacketMath.h +1237 -0
- package/eigen/Eigen/src/Core/arch/NEON/Complex.h +531 -289
- package/eigen/Eigen/src/Core/arch/NEON/GeneralBlockPanelKernel.h +243 -0
- package/eigen/Eigen/src/Core/arch/NEON/MathFunctions.h +50 -73
- package/eigen/Eigen/src/Core/arch/NEON/PacketMath.h +5915 -579
- package/eigen/Eigen/src/Core/arch/NEON/TypeCasting.h +1642 -0
- package/eigen/Eigen/src/Core/arch/NEON/UnaryFunctors.h +57 -0
- package/eigen/Eigen/src/Core/arch/SSE/Complex.h +366 -334
- package/eigen/Eigen/src/Core/arch/SSE/MathFunctions.h +40 -514
- package/eigen/Eigen/src/Core/arch/SSE/PacketMath.h +2164 -675
- package/eigen/Eigen/src/Core/arch/SSE/Reductions.h +324 -0
- package/eigen/Eigen/src/Core/arch/SSE/TypeCasting.h +188 -35
- package/eigen/Eigen/src/Core/arch/SVE/MathFunctions.h +48 -0
- package/eigen/Eigen/src/Core/arch/SVE/PacketMath.h +674 -0
- package/eigen/Eigen/src/Core/arch/SVE/TypeCasting.h +52 -0
- package/eigen/Eigen/src/Core/arch/SYCL/InteropHeaders.h +227 -0
- package/eigen/Eigen/src/Core/arch/SYCL/MathFunctions.h +303 -0
- package/eigen/Eigen/src/Core/arch/SYCL/PacketMath.h +576 -0
- package/eigen/Eigen/src/Core/arch/SYCL/TypeCasting.h +83 -0
- package/eigen/Eigen/src/Core/arch/ZVector/Complex.h +434 -261
- package/eigen/Eigen/src/Core/arch/ZVector/MathFunctions.h +160 -53
- package/eigen/Eigen/src/Core/arch/ZVector/PacketMath.h +1073 -605
- package/eigen/Eigen/src/Core/functors/AssignmentFunctors.h +123 -117
- package/eigen/Eigen/src/Core/functors/BinaryFunctors.h +594 -322
- package/eigen/Eigen/src/Core/functors/NullaryFunctors.h +204 -118
- package/eigen/Eigen/src/Core/functors/StlFunctors.h +110 -97
- package/eigen/Eigen/src/Core/functors/TernaryFunctors.h +34 -7
- package/eigen/Eigen/src/Core/functors/UnaryFunctors.h +1158 -530
- package/eigen/Eigen/src/Core/products/GeneralBlockPanelKernel.h +2329 -1333
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrix.h +328 -364
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h +191 -178
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_BLAS.h +85 -82
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrix_BLAS.h +154 -73
- package/eigen/Eigen/src/Core/products/GeneralMatrixVector.h +396 -542
- package/eigen/Eigen/src/Core/products/GeneralMatrixVector_BLAS.h +80 -77
- package/eigen/Eigen/src/Core/products/Parallelizer.h +208 -92
- package/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix.h +331 -375
- package/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix_BLAS.h +206 -224
- package/eigen/Eigen/src/Core/products/SelfadjointMatrixVector.h +139 -146
- 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 -46
- 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 -275
- package/eigen/Eigen/src/Core/products/TriangularSolverMatrix_BLAS.h +108 -109
- package/eigen/Eigen/src/Core/products/TriangularSolverVector.h +70 -93
- package/eigen/Eigen/src/Core/util/Assert.h +158 -0
- package/eigen/Eigen/src/Core/util/BlasUtil.h +413 -290
- package/eigen/Eigen/src/Core/util/ConfigureVectorization.h +543 -0
- package/eigen/Eigen/src/Core/util/Constants.h +314 -263
- package/eigen/Eigen/src/Core/util/DisableStupidWarnings.h +130 -78
- package/eigen/Eigen/src/Core/util/EmulateArray.h +270 -0
- package/eigen/Eigen/src/Core/util/ForwardDeclarations.h +450 -224
- 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 +487 -0
- package/eigen/Eigen/src/Core/util/IntegralConstant.h +279 -0
- package/eigen/Eigen/src/Core/util/MKL_support.h +39 -30
- package/eigen/Eigen/src/Core/util/Macros.h +939 -646
- package/eigen/Eigen/src/Core/util/MaxSizeVector.h +139 -0
- package/eigen/Eigen/src/Core/util/Memory.h +1042 -650
- package/eigen/Eigen/src/Core/util/Meta.h +618 -426
- 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 +51 -0
- package/eigen/Eigen/src/Core/util/Serializer.h +209 -0
- package/eigen/Eigen/src/Core/util/StaticAssert.h +51 -164
- package/eigen/Eigen/src/Core/util/SymbolicIndex.h +445 -0
- package/eigen/Eigen/src/Core/util/XprHelper.h +793 -538
- 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 +91 -107
- package/eigen/Eigen/src/Eigenvalues/RealQZ.h +539 -606
- package/eigen/Eigen/src/Eigenvalues/RealSchur.h +348 -382
- package/eigen/Eigen/src/Eigenvalues/RealSchur_LAPACKE.h +41 -35
- package/eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h +579 -600
- package/eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver_LAPACKE.h +47 -44
- package/eigen/Eigen/src/Eigenvalues/Tridiagonalization.h +434 -461
- package/eigen/Eigen/src/Geometry/AlignedBox.h +307 -214
- package/eigen/Eigen/src/Geometry/AngleAxis.h +135 -137
- package/eigen/Eigen/src/Geometry/EulerAngles.h +163 -74
- package/eigen/Eigen/src/Geometry/Homogeneous.h +289 -333
- package/eigen/Eigen/src/Geometry/Hyperplane.h +152 -161
- package/eigen/Eigen/src/Geometry/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Geometry/OrthoMethods.h +168 -145
- package/eigen/Eigen/src/Geometry/ParametrizedLine.h +141 -104
- package/eigen/Eigen/src/Geometry/Quaternion.h +595 -497
- package/eigen/Eigen/src/Geometry/Rotation2D.h +110 -108
- package/eigen/Eigen/src/Geometry/RotationBase.h +148 -145
- package/eigen/Eigen/src/Geometry/Scaling.h +115 -90
- package/eigen/Eigen/src/Geometry/Transform.h +896 -953
- package/eigen/Eigen/src/Geometry/Translation.h +100 -98
- package/eigen/Eigen/src/Geometry/Umeyama.h +79 -84
- package/eigen/Eigen/src/Geometry/arch/Geometry_SIMD.h +154 -0
- package/eigen/Eigen/src/Householder/BlockHouseholder.h +54 -42
- package/eigen/Eigen/src/Householder/Householder.h +104 -122
- package/eigen/Eigen/src/Householder/HouseholderSequence.h +416 -382
- package/eigen/Eigen/src/Householder/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h +153 -166
- package/eigen/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h +127 -138
- package/eigen/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h +95 -124
- package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h +269 -267
- package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h +246 -259
- package/eigen/Eigen/src/IterativeLinearSolvers/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h +218 -217
- package/eigen/Eigen/src/IterativeLinearSolvers/LeastSquareConjugateGradient.h +80 -103
- package/eigen/Eigen/src/IterativeLinearSolvers/SolveWithGuess.h +59 -63
- package/eigen/Eigen/src/Jacobi/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Jacobi/Jacobi.h +256 -291
- package/eigen/Eigen/src/KLUSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/KLUSupport/KLUSupport.h +339 -0
- package/eigen/Eigen/src/LU/Determinant.h +60 -63
- package/eigen/Eigen/src/LU/FullPivLU.h +561 -626
- package/eigen/Eigen/src/LU/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/LU/InverseImpl.h +213 -275
- package/eigen/Eigen/src/LU/PartialPivLU.h +407 -435
- package/eigen/Eigen/src/LU/PartialPivLU_LAPACKE.h +54 -40
- package/eigen/Eigen/src/LU/arch/InverseSize4.h +353 -0
- 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 +250 -282
- package/eigen/Eigen/src/OrderingMethods/Eigen_Colamd.h +950 -1103
- package/eigen/Eigen/src/OrderingMethods/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/OrderingMethods/Ordering.h +111 -122
- 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 -429
- package/eigen/Eigen/src/QR/ColPivHouseholderQR.h +494 -473
- package/eigen/Eigen/src/QR/ColPivHouseholderQR_LAPACKE.h +120 -56
- package/eigen/Eigen/src/QR/CompleteOrthogonalDecomposition.h +223 -137
- package/eigen/Eigen/src/QR/FullPivHouseholderQR.h +517 -460
- package/eigen/Eigen/src/QR/HouseholderQR.h +412 -278
- 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 +263 -261
- package/eigen/Eigen/src/SVD/BDCSVD.h +872 -679
- 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 +585 -543
- package/eigen/Eigen/src/SVD/JacobiSVD_LAPACKE.h +85 -49
- package/eigen/Eigen/src/SVD/SVDBase.h +281 -160
- package/eigen/Eigen/src/SVD/UpperBidiagonalization.h +202 -237
- package/eigen/Eigen/src/SparseCholesky/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky.h +769 -590
- package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h +318 -129
- package/eigen/Eigen/src/SparseCore/AmbiVector.h +202 -251
- package/eigen/Eigen/src/SparseCore/CompressedStorage.h +184 -236
- package/eigen/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h +140 -184
- package/eigen/Eigen/src/SparseCore/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SparseCore/SparseAssign.h +174 -111
- package/eigen/Eigen/src/SparseCore/SparseBlock.h +408 -477
- package/eigen/Eigen/src/SparseCore/SparseColEtree.h +100 -112
- package/eigen/Eigen/src/SparseCore/SparseCompressedBase.h +531 -280
- package/eigen/Eigen/src/SparseCore/SparseCwiseBinaryOp.h +559 -347
- package/eigen/Eigen/src/SparseCore/SparseCwiseUnaryOp.h +100 -108
- package/eigen/Eigen/src/SparseCore/SparseDenseProduct.h +185 -191
- 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 +1614 -1142
- package/eigen/Eigen/src/SparseCore/SparseMatrixBase.h +403 -357
- package/eigen/Eigen/src/SparseCore/SparsePermutation.h +186 -115
- package/eigen/Eigen/src/SparseCore/SparseProduct.h +100 -91
- 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 +371 -414
- 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 +146 -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 +814 -618
- 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 +273 -255
- 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 +90 -101
- 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 +125 -133
- 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 +451 -490
- package/eigen/Eigen/src/StlSupport/StdDeque.h +28 -105
- 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 -732
- 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 +480 -380
- 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 +9976 -16182
- 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.inc +1370 -0
- package/eigen/Eigen/src/plugins/CommonCwiseBinaryOps.inc +116 -0
- package/eigen/Eigen/src/plugins/CommonCwiseUnaryOps.inc +167 -0
- 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/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/BooleanRedux.h +0 -164
- package/eigen/Eigen/src/Core/arch/CUDA/Complex.h +0 -103
- package/eigen/Eigen/src/Core/arch/CUDA/Half.h +0 -675
- package/eigen/Eigen/src/Core/arch/CUDA/MathFunctions.h +0 -91
- 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/Core/util/NonMPL2.h +0 -3
- package/eigen/Eigen/src/Geometry/arch/Geometry_SSE.h +0 -161
- package/eigen/Eigen/src/LU/arch/Inverse_SSE.h +0 -338
- 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 -332
- package/eigen/Eigen/src/plugins/ArrayCwiseUnaryOps.h +0 -552
- package/eigen/Eigen/src/plugins/BlockMethods.h +0 -1058
- package/eigen/Eigen/src/plugins/CommonCwiseBinaryOps.h +0 -115
- package/eigen/Eigen/src/plugins/CommonCwiseUnaryOps.h +0 -163
- package/eigen/Eigen/src/plugins/MatrixCwiseBinaryOps.h +0 -152
- package/eigen/Eigen/src/plugins/MatrixCwiseUnaryOps.h +0 -85
- package/lib/eigen.d.ts +0 -2
- package/lib/eigen.js +0 -15
|
@@ -11,76 +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_> {
|
|
22
|
+
typedef MatrixXpr XprKind;
|
|
23
|
+
typedef SolverStorage StorageKind;
|
|
24
|
+
typedef PermutationIndex_ PermutationIndex;
|
|
20
25
|
enum { Flags = 0 };
|
|
21
26
|
};
|
|
22
27
|
|
|
23
|
-
}
|
|
28
|
+
} // end namespace internal
|
|
24
29
|
|
|
25
30
|
/** \ingroup QR_Module
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
template<typename
|
|
49
|
-
{
|
|
50
|
-
|
|
51
|
-
|
|
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
|
-
|
|
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()
|
|
84
96
|
: m_qr(),
|
|
85
97
|
m_hCoeffs(),
|
|
86
98
|
m_colsPermutation(),
|
|
@@ -91,398 +103,390 @@ template<typename _MatrixType> class ColPivHouseholderQR
|
|
|
91
103
|
m_isInitialized(false),
|
|
92
104
|
m_usePrescribedThreshold(false) {}
|
|
93
105
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
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
|
+
}
|
|
110
131
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
template<typename InputType>
|
|
124
|
-
explicit ColPivHouseholderQR(const EigenBase<InputType>& matrix)
|
|
125
|
-
: m_qr(matrix.rows(), matrix.cols()),
|
|
126
|
-
m_hCoeffs((std::min)(matrix.rows(),matrix.cols())),
|
|
127
|
-
m_colsPermutation(PermIndexType(matrix.cols())),
|
|
128
|
-
m_colsTranspositions(matrix.cols()),
|
|
129
|
-
m_temp(matrix.cols()),
|
|
130
|
-
m_colNormsUpdated(matrix.cols()),
|
|
131
|
-
m_colNormsDirect(matrix.cols()),
|
|
132
|
-
m_isInitialized(false),
|
|
133
|
-
m_usePrescribedThreshold(false)
|
|
134
|
-
{
|
|
135
|
-
compute(matrix.derived());
|
|
136
|
-
}
|
|
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
|
+
}
|
|
137
144
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
computeInPlace();
|
|
157
|
-
}
|
|
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
|
|
158
163
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
*
|
|
162
|
-
* \param b the right-hand-side of the equation to solve.
|
|
163
|
-
*
|
|
164
|
-
* \returns a solution.
|
|
165
|
-
*
|
|
166
|
-
* \note_about_checking_solutions
|
|
167
|
-
*
|
|
168
|
-
* \note_about_arbitrary_choice_of_solution
|
|
169
|
-
*
|
|
170
|
-
* Example: \include ColPivHouseholderQR_solve.cpp
|
|
171
|
-
* Output: \verbinclude ColPivHouseholderQR_solve.out
|
|
172
|
-
*/
|
|
173
|
-
template<typename Rhs>
|
|
174
|
-
inline const Solve<ColPivHouseholderQR, Rhs>
|
|
175
|
-
solve(const MatrixBase<Rhs>& b) const
|
|
176
|
-
{
|
|
177
|
-
eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
|
|
178
|
-
return Solve<ColPivHouseholderQR, Rhs>(*this, b.derived());
|
|
179
|
-
}
|
|
164
|
+
HouseholderSequenceType householderQ() const;
|
|
165
|
+
HouseholderSequenceType matrixQ() const { return householderQ(); }
|
|
180
166
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
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
|
+
}
|
|
186
173
|
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
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
|
+
}
|
|
194
187
|
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
* Only the upper triangular part should be referenced. To get it, use
|
|
198
|
-
* \code matrixR().template triangularView<Upper>() \endcode
|
|
199
|
-
* For rank-deficient matrices, use
|
|
200
|
-
* \code
|
|
201
|
-
* matrixR().topLeftCorner(rank(), rank()).template triangularView<Upper>()
|
|
202
|
-
* \endcode
|
|
203
|
-
*/
|
|
204
|
-
const MatrixType& matrixR() const
|
|
205
|
-
{
|
|
206
|
-
eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
|
|
207
|
-
return m_qr;
|
|
208
|
-
}
|
|
188
|
+
template <typename InputType>
|
|
189
|
+
ColPivHouseholderQR& compute(const EigenBase<InputType>& matrix);
|
|
209
190
|
|
|
210
|
-
|
|
211
|
-
|
|
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
|
+
}
|
|
212
196
|
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
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
|
+
}
|
|
219
269
|
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
*
|
|
231
|
-
* \sa logAbsDeterminant(), MatrixBase::determinant()
|
|
232
|
-
*/
|
|
233
|
-
typename MatrixType::RealScalar absDeterminant() const;
|
|
234
|
-
|
|
235
|
-
/** \returns the natural log of the absolute value of the determinant of the matrix of which
|
|
236
|
-
* *this is the QR decomposition. It has only linear complexity
|
|
237
|
-
* (that is, O(n) where n is the dimension of the square matrix)
|
|
238
|
-
* as the QR decomposition has already been computed.
|
|
239
|
-
*
|
|
240
|
-
* \note This is only for square matrices.
|
|
241
|
-
*
|
|
242
|
-
* \note This method is useful to work around the risk of overflow/underflow that's inherent
|
|
243
|
-
* to determinant computation.
|
|
244
|
-
*
|
|
245
|
-
* \sa absDeterminant(), MatrixBase::determinant()
|
|
246
|
-
*/
|
|
247
|
-
typename MatrixType::RealScalar logAbsDeterminant() const;
|
|
248
|
-
|
|
249
|
-
/** \returns the rank of the matrix of which *this is the QR decomposition.
|
|
250
|
-
*
|
|
251
|
-
* \note This method has to determine which pivots should be considered nonzero.
|
|
252
|
-
* For that, it uses the threshold value that you can control by calling
|
|
253
|
-
* setThreshold(const RealScalar&).
|
|
254
|
-
*/
|
|
255
|
-
inline Index rank() const
|
|
256
|
-
{
|
|
257
|
-
using std::abs;
|
|
258
|
-
eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
|
|
259
|
-
RealScalar premultiplied_threshold = abs(m_maxpivot) * threshold();
|
|
260
|
-
Index result = 0;
|
|
261
|
-
for(Index i = 0; i < m_nonzero_pivots; ++i)
|
|
262
|
-
result += (abs(m_qr.coeff(i,i)) > premultiplied_threshold);
|
|
263
|
-
return result;
|
|
264
|
-
}
|
|
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
|
+
}
|
|
265
280
|
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
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
|
+
}
|
|
277
292
|
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
}
|
|
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
|
+
}
|
|
290
304
|
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
return rank() == rows();
|
|
302
|
-
}
|
|
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
|
+
}
|
|
303
315
|
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
return isInjective() && isSurjective();
|
|
314
|
-
}
|
|
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
|
+
}
|
|
315
325
|
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
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
|
+
}
|
|
326
357
|
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
*
|
|
340
|
-
* When it needs to get the threshold value, Eigen calls threshold(). By default, this
|
|
341
|
-
* uses a formula to automatically determine a reasonable threshold.
|
|
342
|
-
* Once you have called the present method setThreshold(const RealScalar&),
|
|
343
|
-
* your value is used instead.
|
|
344
|
-
*
|
|
345
|
-
* \param threshold The new value to use as the threshold.
|
|
346
|
-
*
|
|
347
|
-
* A pivot will be considered nonzero if its absolute value is strictly greater than
|
|
348
|
-
* \f$ \vert pivot \vert \leqslant threshold \times \vert maxpivot \vert \f$
|
|
349
|
-
* where maxpivot is the biggest pivot.
|
|
350
|
-
*
|
|
351
|
-
* If you want to come back to the default behavior, call setThreshold(Default_t)
|
|
352
|
-
*/
|
|
353
|
-
ColPivHouseholderQR& setThreshold(const RealScalar& threshold)
|
|
354
|
-
{
|
|
355
|
-
m_usePrescribedThreshold = true;
|
|
356
|
-
m_prescribedThreshold = threshold;
|
|
357
|
-
return *this;
|
|
358
|
-
}
|
|
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
|
+
}
|
|
359
370
|
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
return *this;
|
|
372
|
-
}
|
|
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
|
+
}
|
|
373
382
|
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
}
|
|
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
|
+
}
|
|
386
394
|
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
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
|
+
}
|
|
399
410
|
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
RealScalar maxPivot() const { return m_maxpivot; }
|
|
404
|
-
|
|
405
|
-
/** \brief Reports whether the QR factorization was succesful.
|
|
406
|
-
*
|
|
407
|
-
* \note This function always returns \c Success. It is provided for compatibility
|
|
408
|
-
* with other factorization routines.
|
|
409
|
-
* \returns \c Success
|
|
410
|
-
*/
|
|
411
|
-
ComputationInfo info() const
|
|
412
|
-
{
|
|
413
|
-
eigen_assert(m_isInitialized && "Decomposition is not initialized.");
|
|
414
|
-
return Success;
|
|
415
|
-
}
|
|
411
|
+
#ifndef EIGEN_PARSED_BY_DOXYGEN
|
|
412
|
+
template <typename RhsType, typename DstType>
|
|
413
|
+
void _solve_impl(const RhsType& rhs, DstType& dst) const;
|
|
416
414
|
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
void _solve_impl(const RhsType &rhs, DstType &dst) const;
|
|
421
|
-
#endif
|
|
415
|
+
template <bool Conjugate, typename RhsType, typename DstType>
|
|
416
|
+
void _solve_impl_transposed(const RhsType& rhs, DstType& dst) const;
|
|
417
|
+
#endif
|
|
422
418
|
|
|
423
|
-
|
|
419
|
+
protected:
|
|
420
|
+
friend class CompleteOrthogonalDecomposition<MatrixType, PermutationIndex>;
|
|
424
421
|
|
|
425
|
-
|
|
422
|
+
EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
|
|
426
423
|
|
|
427
|
-
|
|
428
|
-
{
|
|
429
|
-
EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar);
|
|
430
|
-
}
|
|
424
|
+
void computeInPlace();
|
|
431
425
|
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
Index m_nonzero_pivots;
|
|
444
|
-
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;
|
|
445
437
|
};
|
|
446
438
|
|
|
447
|
-
template<typename MatrixType>
|
|
448
|
-
typename MatrixType::
|
|
449
|
-
|
|
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 {
|
|
450
450
|
using std::abs;
|
|
451
451
|
eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
|
|
452
452
|
eigen_assert(m_qr.rows() == m_qr.cols() && "You can't take the determinant of a non-square matrix!");
|
|
453
|
-
return abs(m_qr.diagonal().prod());
|
|
453
|
+
return isInjective() ? abs(m_qr.diagonal().prod()) : RealScalar(0);
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
template <typename MatrixType, typename PermutationIndex>
|
|
457
|
+
typename MatrixType::RealScalar ColPivHouseholderQR<MatrixType, PermutationIndex>::logAbsDeterminant() const {
|
|
458
|
+
eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
|
|
459
|
+
eigen_assert(m_qr.rows() == m_qr.cols() && "You can't take the determinant of a non-square matrix!");
|
|
460
|
+
return isInjective() ? m_qr.diagonal().cwiseAbs().array().log().sum() : -NumTraits<RealScalar>::infinity();
|
|
454
461
|
}
|
|
455
462
|
|
|
456
|
-
template<typename MatrixType>
|
|
457
|
-
typename MatrixType::
|
|
458
|
-
{
|
|
463
|
+
template <typename MatrixType, typename PermutationIndex>
|
|
464
|
+
typename MatrixType::Scalar ColPivHouseholderQR<MatrixType, PermutationIndex>::signDeterminant() const {
|
|
459
465
|
eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
|
|
460
466
|
eigen_assert(m_qr.rows() == m_qr.cols() && "You can't take the determinant of a non-square matrix!");
|
|
461
|
-
|
|
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);
|
|
462
470
|
}
|
|
463
471
|
|
|
464
472
|
/** Performs the QR factorization of the given matrix \a matrix. The result of
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
template<typename MatrixType>
|
|
471
|
-
template<typename InputType>
|
|
472
|
-
ColPivHouseholderQR<MatrixType>& ColPivHouseholderQR<MatrixType>::compute(
|
|
473
|
-
{
|
|
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) {
|
|
474
482
|
m_qr = matrix.derived();
|
|
475
483
|
computeInPlace();
|
|
476
484
|
return *this;
|
|
477
485
|
}
|
|
478
486
|
|
|
479
|
-
template<typename MatrixType>
|
|
480
|
-
void ColPivHouseholderQR<MatrixType>::computeInPlace()
|
|
481
|
-
|
|
482
|
-
check_template_parameters();
|
|
483
|
-
|
|
484
|
-
// the column permutation is stored as int indices, so just to be sure:
|
|
485
|
-
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());
|
|
486
490
|
|
|
487
491
|
using std::abs;
|
|
488
492
|
|
|
@@ -506,27 +510,26 @@ void ColPivHouseholderQR<MatrixType>::computeInPlace()
|
|
|
506
510
|
m_colNormsUpdated.coeffRef(k) = m_colNormsDirect.coeffRef(k);
|
|
507
511
|
}
|
|
508
512
|
|
|
509
|
-
RealScalar threshold_helper =
|
|
513
|
+
RealScalar threshold_helper =
|
|
514
|
+
numext::abs2<RealScalar>(m_colNormsUpdated.maxCoeff() * NumTraits<RealScalar>::epsilon()) / RealScalar(rows);
|
|
510
515
|
RealScalar norm_downdate_threshold = numext::sqrt(NumTraits<RealScalar>::epsilon());
|
|
511
516
|
|
|
512
|
-
m_nonzero_pivots = size;
|
|
517
|
+
m_nonzero_pivots = size; // the generic case is that in which all pivots are nonzero (invertible case)
|
|
513
518
|
m_maxpivot = RealScalar(0);
|
|
514
519
|
|
|
515
|
-
for(Index k = 0; k < size; ++k)
|
|
516
|
-
{
|
|
520
|
+
for (Index k = 0; k < size; ++k) {
|
|
517
521
|
// first, we look up in our table m_colNormsUpdated which column has the biggest norm
|
|
518
522
|
Index biggest_col_index;
|
|
519
|
-
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));
|
|
520
524
|
biggest_col_index += k;
|
|
521
525
|
|
|
522
526
|
// Track the number of meaningful pivots but do not stop the decomposition to make
|
|
523
527
|
// sure that the initial matrix is properly reproduced. See bug 941.
|
|
524
|
-
if(m_nonzero_pivots==size && biggest_col_sq_norm < threshold_helper * RealScalar(rows-k))
|
|
525
|
-
m_nonzero_pivots = k;
|
|
528
|
+
if (m_nonzero_pivots == size && biggest_col_sq_norm < threshold_helper * RealScalar(rows - k)) m_nonzero_pivots = k;
|
|
526
529
|
|
|
527
530
|
// apply the transposition to the columns
|
|
528
|
-
m_colsTranspositions.coeffRef(k) = biggest_col_index;
|
|
529
|
-
if(k != biggest_col_index) {
|
|
531
|
+
m_colsTranspositions.coeffRef(k) = static_cast<PermutationIndex>(biggest_col_index);
|
|
532
|
+
if (k != biggest_col_index) {
|
|
530
533
|
m_qr.col(k).swap(m_qr.col(biggest_col_index));
|
|
531
534
|
std::swap(m_colNormsUpdated.coeffRef(k), m_colNormsUpdated.coeffRef(biggest_col_index));
|
|
532
535
|
std::swap(m_colNormsDirect.coeffRef(k), m_colNormsDirect.coeffRef(biggest_col_index));
|
|
@@ -535,17 +538,17 @@ void ColPivHouseholderQR<MatrixType>::computeInPlace()
|
|
|
535
538
|
|
|
536
539
|
// generate the householder vector, store it below the diagonal
|
|
537
540
|
RealScalar beta;
|
|
538
|
-
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);
|
|
539
542
|
|
|
540
543
|
// apply the householder transformation to the diagonal coefficient
|
|
541
|
-
m_qr.coeffRef(k,k) = beta;
|
|
544
|
+
m_qr.coeffRef(k, k) = beta;
|
|
542
545
|
|
|
543
546
|
// remember the maximum absolute value of diagonal coefficients
|
|
544
|
-
if(abs(beta) > m_maxpivot) m_maxpivot = abs(beta);
|
|
547
|
+
if (abs(beta) > m_maxpivot) m_maxpivot = abs(beta);
|
|
545
548
|
|
|
546
549
|
// apply the householder transformation
|
|
547
|
-
m_qr.bottomRightCorner(rows-k, cols-k-1)
|
|
548
|
-
.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));
|
|
549
552
|
|
|
550
553
|
// update our table of norms of the columns
|
|
551
554
|
for (Index j = k + 1; j < cols; ++j) {
|
|
@@ -553,12 +556,12 @@ void ColPivHouseholderQR<MatrixType>::computeInPlace()
|
|
|
553
556
|
// http://www.netlib.org/lapack/lawnspdf/lawn176.pdf
|
|
554
557
|
// and used in LAPACK routines xGEQPF and xGEQP3.
|
|
555
558
|
// See lines 278-297 in http://www.netlib.org/lapack/explore-html/dc/df4/sgeqpf_8f_source.html
|
|
556
|
-
if (m_colNormsUpdated.coeffRef(j)
|
|
559
|
+
if (!numext::is_exactly_zero(m_colNormsUpdated.coeffRef(j))) {
|
|
557
560
|
RealScalar temp = abs(m_qr.coeffRef(k, j)) / m_colNormsUpdated.coeffRef(j);
|
|
558
561
|
temp = (RealScalar(1) + temp) * (RealScalar(1) - temp);
|
|
559
|
-
temp = temp <
|
|
560
|
-
RealScalar temp2 =
|
|
561
|
-
|
|
562
|
+
temp = temp < RealScalar(0) ? RealScalar(0) : temp;
|
|
563
|
+
RealScalar temp2 =
|
|
564
|
+
temp * numext::abs2<RealScalar>(m_colNormsUpdated.coeffRef(j) / m_colNormsDirect.coeffRef(j));
|
|
562
565
|
if (temp2 <= norm_downdate_threshold) {
|
|
563
566
|
// The updated norm has become too inaccurate so re-compute the column
|
|
564
567
|
// norm directly.
|
|
@@ -571,83 +574,101 @@ void ColPivHouseholderQR<MatrixType>::computeInPlace()
|
|
|
571
574
|
}
|
|
572
575
|
}
|
|
573
576
|
|
|
574
|
-
m_colsPermutation.setIdentity(
|
|
575
|
-
for(
|
|
576
|
-
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)));
|
|
577
580
|
|
|
578
|
-
|
|
581
|
+
m_det_p = (number_of_transpositions % 2) ? -1 : 1;
|
|
579
582
|
m_isInitialized = true;
|
|
580
583
|
}
|
|
581
584
|
|
|
582
585
|
#ifndef EIGEN_PARSED_BY_DOXYGEN
|
|
583
|
-
template<typename
|
|
584
|
-
template<typename RhsType, typename DstType>
|
|
585
|
-
void ColPivHouseholderQR<
|
|
586
|
-
{
|
|
587
|
-
eigen_assert(rhs.rows() == rows());
|
|
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
|
-
|
|
600
|
-
c.applyOnTheLeft(householderSequence(m_qr, m_hCoeffs)
|
|
601
|
-
.setLength(nonzero_pivots)
|
|
602
|
-
.transpose()
|
|
603
|
-
);
|
|
598
|
+
c.applyOnTheLeft(householderQ().setLength(nonzero_pivots).adjoint());
|
|
604
599
|
|
|
605
600
|
m_qr.topLeftCorner(nonzero_pivots, nonzero_pivots)
|
|
606
601
|
.template triangularView<Upper>()
|
|
607
602
|
.solveInPlace(c.topRows(nonzero_pivots));
|
|
608
603
|
|
|
609
|
-
for(Index i = 0; i < nonzero_pivots; ++i) dst.row(m_colsPermutation.indices().coeff(i)) = c.row(i);
|
|
610
|
-
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();
|
|
606
|
+
}
|
|
607
|
+
|
|
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 {
|
|
612
|
+
const Index nonzero_pivots = nonzeroPivots();
|
|
613
|
+
|
|
614
|
+
if (nonzero_pivots == 0) {
|
|
615
|
+
dst.setZero();
|
|
616
|
+
return;
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
typename RhsType::PlainObject c(m_colsPermutation.transpose() * rhs);
|
|
620
|
+
|
|
621
|
+
m_qr.topLeftCorner(nonzero_pivots, nonzero_pivots)
|
|
622
|
+
.template triangularView<Upper>()
|
|
623
|
+
.transpose()
|
|
624
|
+
.template conjugateIf<Conjugate>()
|
|
625
|
+
.solveInPlace(c.topRows(nonzero_pivots));
|
|
626
|
+
|
|
627
|
+
dst.topRows(nonzero_pivots) = c.topRows(nonzero_pivots);
|
|
628
|
+
dst.bottomRows(rows() - nonzero_pivots).setZero();
|
|
629
|
+
|
|
630
|
+
dst.applyOnTheLeft(householderQ().setLength(nonzero_pivots).template conjugateIf<!Conjugate>());
|
|
611
631
|
}
|
|
612
632
|
#endif
|
|
613
633
|
|
|
614
634
|
namespace internal {
|
|
615
635
|
|
|
616
|
-
template<typename DstXprType, typename MatrixType>
|
|
617
|
-
struct Assignment<DstXprType, Inverse<ColPivHouseholderQR<MatrixType
|
|
618
|
-
|
|
619
|
-
|
|
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;
|
|
620
642
|
typedef Inverse<QrType> SrcXprType;
|
|
621
|
-
static void run(DstXprType
|
|
622
|
-
|
|
643
|
+
static void run(DstXprType& dst, const SrcXprType& src,
|
|
644
|
+
const internal::assign_op<typename DstXprType::Scalar, typename QrType::Scalar>&) {
|
|
623
645
|
dst = src.nestedExpression().solve(MatrixType::Identity(src.rows(), src.cols()));
|
|
624
646
|
}
|
|
625
647
|
};
|
|
626
648
|
|
|
627
|
-
}
|
|
649
|
+
} // end namespace internal
|
|
628
650
|
|
|
629
651
|
/** \returns the matrix Q as a sequence of householder transformations.
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
template<typename MatrixType>
|
|
633
|
-
typename ColPivHouseholderQR<MatrixType>::HouseholderSequenceType
|
|
634
|
-
|
|
635
|
-
{
|
|
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 {
|
|
636
657
|
eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
|
|
637
658
|
return HouseholderSequenceType(m_qr, m_hCoeffs.conjugate());
|
|
638
659
|
}
|
|
639
660
|
|
|
640
661
|
/** \return the column-pivoting Householder QR decomposition of \c *this.
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
template<typename Derived>
|
|
645
|
-
|
|
646
|
-
MatrixBase<Derived>::
|
|
647
|
-
{
|
|
648
|
-
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());
|
|
649
670
|
}
|
|
650
671
|
|
|
651
|
-
}
|
|
672
|
+
} // end namespace Eigen
|
|
652
673
|
|
|
653
|
-
#endif
|
|
674
|
+
#endif // EIGEN_COLPIVOTINGHOUSEHOLDERQR_H
|