@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,82 +11,94 @@
|
|
|
11
11
|
#ifndef EIGEN_FULLPIVOTINGHOUSEHOLDERQR_H
|
|
12
12
|
#define EIGEN_FULLPIVOTINGHOUSEHOLDERQR_H
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
// IWYU pragma: private
|
|
15
|
+
#include "./InternalHeaderCheck.h"
|
|
16
|
+
|
|
17
|
+
namespace Eigen {
|
|
15
18
|
|
|
16
19
|
namespace internal {
|
|
17
20
|
|
|
18
|
-
template<typename
|
|
19
|
-
: traits<
|
|
20
|
-
{
|
|
21
|
+
template <typename MatrixType_, typename PermutationIndex_>
|
|
22
|
+
struct traits<FullPivHouseholderQR<MatrixType_, PermutationIndex_> > : traits<MatrixType_> {
|
|
21
23
|
typedef MatrixXpr XprKind;
|
|
22
24
|
typedef SolverStorage StorageKind;
|
|
23
|
-
typedef
|
|
25
|
+
typedef PermutationIndex_ PermutationIndex;
|
|
24
26
|
enum { Flags = 0 };
|
|
25
27
|
};
|
|
26
28
|
|
|
27
|
-
template<typename MatrixType
|
|
29
|
+
template <typename MatrixType, typename PermutationIndex>
|
|
30
|
+
struct FullPivHouseholderQRMatrixQReturnType;
|
|
28
31
|
|
|
29
|
-
template<typename MatrixType>
|
|
30
|
-
struct traits<FullPivHouseholderQRMatrixQReturnType<MatrixType> >
|
|
31
|
-
{
|
|
32
|
+
template <typename MatrixType, typename PermutationIndex>
|
|
33
|
+
struct traits<FullPivHouseholderQRMatrixQReturnType<MatrixType, PermutationIndex> > {
|
|
32
34
|
typedef typename MatrixType::PlainObject ReturnType;
|
|
33
35
|
};
|
|
34
36
|
|
|
35
|
-
}
|
|
37
|
+
} // end namespace internal
|
|
36
38
|
|
|
37
39
|
/** \ingroup QR_Module
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
template<typename
|
|
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
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
40
|
+
*
|
|
41
|
+
* \class FullPivHouseholderQR
|
|
42
|
+
*
|
|
43
|
+
* \brief Householder rank-revealing QR decomposition of a matrix with full pivoting
|
|
44
|
+
*
|
|
45
|
+
* \tparam MatrixType_ the type of the matrix of which we are computing the QR decomposition
|
|
46
|
+
*
|
|
47
|
+
* This class performs a rank-revealing QR decomposition of a matrix \b A into matrices \b P, \b P', \b Q and \b R
|
|
48
|
+
* such that
|
|
49
|
+
* \f[
|
|
50
|
+
* \mathbf{P} \, \mathbf{A} \, \mathbf{P}' = \mathbf{Q} \, \mathbf{R}
|
|
51
|
+
* \f]
|
|
52
|
+
* by using Householder transformations. Here, \b P and \b P' are permutation matrices, \b Q a unitary matrix
|
|
53
|
+
* and \b R an upper triangular matrix.
|
|
54
|
+
*
|
|
55
|
+
* This decomposition performs a very prudent full pivoting in order to be rank-revealing and achieve optimal
|
|
56
|
+
* numerical stability. The trade-off is that it is slower than HouseholderQR and ColPivHouseholderQR.
|
|
57
|
+
*
|
|
58
|
+
* This class supports the \link InplaceDecomposition inplace decomposition \endlink mechanism.
|
|
59
|
+
*
|
|
60
|
+
* \sa MatrixBase::fullPivHouseholderQr()
|
|
61
|
+
*/
|
|
62
|
+
template <typename MatrixType_, typename PermutationIndex_>
|
|
63
|
+
class FullPivHouseholderQR : public SolverBase<FullPivHouseholderQR<MatrixType_, PermutationIndex_> > {
|
|
64
|
+
public:
|
|
65
|
+
typedef MatrixType_ MatrixType;
|
|
66
|
+
typedef SolverBase<FullPivHouseholderQR> Base;
|
|
67
|
+
friend class SolverBase<FullPivHouseholderQR>;
|
|
68
|
+
typedef PermutationIndex_ PermutationIndex;
|
|
69
|
+
EIGEN_GENERIC_PUBLIC_INTERFACE(FullPivHouseholderQR)
|
|
70
|
+
|
|
71
|
+
enum {
|
|
72
|
+
MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
|
|
73
|
+
MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
|
|
74
|
+
};
|
|
75
|
+
typedef internal::FullPivHouseholderQRMatrixQReturnType<MatrixType, PermutationIndex> MatrixQReturnType;
|
|
76
|
+
typedef typename internal::plain_diag_type<MatrixType>::type HCoeffsType;
|
|
77
|
+
typedef Matrix<PermutationIndex, 1, internal::min_size_prefer_dynamic(ColsAtCompileTime, RowsAtCompileTime), RowMajor,
|
|
78
|
+
1, internal::min_size_prefer_fixed(MaxColsAtCompileTime, MaxRowsAtCompileTime)>
|
|
79
|
+
IntDiagSizeVectorType;
|
|
80
|
+
typedef PermutationMatrix<ColsAtCompileTime, MaxColsAtCompileTime, PermutationIndex> PermutationType;
|
|
81
|
+
typedef typename internal::plain_row_type<MatrixType>::type RowVectorType;
|
|
82
|
+
typedef typename internal::plain_col_type<MatrixType>::type ColVectorType;
|
|
83
|
+
typedef typename MatrixType::PlainObject PlainObject;
|
|
84
|
+
|
|
85
|
+
/** \brief Reports whether the QR factorization was successful.
|
|
86
|
+
*
|
|
87
|
+
* \note This function always returns \c Success. It is provided for compatibility
|
|
88
|
+
* with other factorization routines.
|
|
89
|
+
* \returns \c Success
|
|
90
|
+
*/
|
|
91
|
+
ComputationInfo info() const {
|
|
92
|
+
eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
|
|
93
|
+
return Success;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/** \brief Default Constructor.
|
|
97
|
+
*
|
|
98
|
+
* The default constructor is useful in cases in which the user intends to
|
|
99
|
+
* perform decompositions via FullPivHouseholderQR::compute(const MatrixType&).
|
|
100
|
+
*/
|
|
101
|
+
FullPivHouseholderQR()
|
|
90
102
|
: m_qr(),
|
|
91
103
|
m_hCoeffs(),
|
|
92
104
|
m_rows_transpositions(),
|
|
@@ -96,36 +108,36 @@ template<typename _MatrixType> class FullPivHouseholderQR
|
|
|
96
108
|
m_isInitialized(false),
|
|
97
109
|
m_usePrescribedThreshold(false) {}
|
|
98
110
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
111
|
+
/** \brief Default Constructor with memory preallocation
|
|
112
|
+
*
|
|
113
|
+
* Like the default constructor but with preallocation of the internal data
|
|
114
|
+
* according to the specified problem \a size.
|
|
115
|
+
* \sa FullPivHouseholderQR()
|
|
116
|
+
*/
|
|
117
|
+
FullPivHouseholderQR(Index rows, Index cols)
|
|
106
118
|
: m_qr(rows, cols),
|
|
107
|
-
m_hCoeffs((std::min)(rows,cols)),
|
|
108
|
-
m_rows_transpositions((std::min)(rows,cols)),
|
|
109
|
-
m_cols_transpositions((std::min)(rows,cols)),
|
|
119
|
+
m_hCoeffs((std::min)(rows, cols)),
|
|
120
|
+
m_rows_transpositions((std::min)(rows, cols)),
|
|
121
|
+
m_cols_transpositions((std::min)(rows, cols)),
|
|
110
122
|
m_cols_permutation(cols),
|
|
111
123
|
m_temp(cols),
|
|
112
124
|
m_isInitialized(false),
|
|
113
125
|
m_usePrescribedThreshold(false) {}
|
|
114
126
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
127
|
+
/** \brief Constructs a QR factorization from a given matrix
|
|
128
|
+
*
|
|
129
|
+
* This constructor computes the QR factorization of the matrix \a matrix by calling
|
|
130
|
+
* the method compute(). It is a short cut for:
|
|
131
|
+
*
|
|
132
|
+
* \code
|
|
133
|
+
* FullPivHouseholderQR<MatrixType> qr(matrix.rows(), matrix.cols());
|
|
134
|
+
* qr.compute(matrix);
|
|
135
|
+
* \endcode
|
|
136
|
+
*
|
|
137
|
+
* \sa compute()
|
|
138
|
+
*/
|
|
139
|
+
template <typename InputType>
|
|
140
|
+
explicit FullPivHouseholderQR(const EigenBase<InputType>& matrix)
|
|
129
141
|
: m_qr(matrix.rows(), matrix.cols()),
|
|
130
142
|
m_hCoeffs((std::min)(matrix.rows(), matrix.cols())),
|
|
131
143
|
m_rows_transpositions((std::min)(matrix.rows(), matrix.cols())),
|
|
@@ -133,19 +145,19 @@ template<typename _MatrixType> class FullPivHouseholderQR
|
|
|
133
145
|
m_cols_permutation(matrix.cols()),
|
|
134
146
|
m_temp(matrix.cols()),
|
|
135
147
|
m_isInitialized(false),
|
|
136
|
-
m_usePrescribedThreshold(false)
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
}
|
|
148
|
+
m_usePrescribedThreshold(false) {
|
|
149
|
+
compute(matrix.derived());
|
|
150
|
+
}
|
|
140
151
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
152
|
+
/** \brief Constructs a QR factorization from a given matrix
|
|
153
|
+
*
|
|
154
|
+
* This overloaded constructor is provided for \link InplaceDecomposition inplace decomposition \endlink when \c
|
|
155
|
+
* MatrixType is a Eigen::Ref.
|
|
156
|
+
*
|
|
157
|
+
* \sa FullPivHouseholderQR(const EigenBase&)
|
|
158
|
+
*/
|
|
159
|
+
template <typename InputType>
|
|
160
|
+
explicit FullPivHouseholderQR(EigenBase<InputType>& matrix)
|
|
149
161
|
: m_qr(matrix.derived()),
|
|
150
162
|
m_hCoeffs((std::min)(matrix.rows(), matrix.cols())),
|
|
151
163
|
m_rows_transpositions((std::min)(matrix.rows(), matrix.cols())),
|
|
@@ -153,319 +165,341 @@ template<typename _MatrixType> class FullPivHouseholderQR
|
|
|
153
165
|
m_cols_permutation(matrix.cols()),
|
|
154
166
|
m_temp(matrix.cols()),
|
|
155
167
|
m_isInitialized(false),
|
|
156
|
-
m_usePrescribedThreshold(false)
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
}
|
|
168
|
+
m_usePrescribedThreshold(false) {
|
|
169
|
+
computeInPlace();
|
|
170
|
+
}
|
|
160
171
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
#endif
|
|
181
|
-
|
|
182
|
-
/** \returns Expression object representing the matrix Q
|
|
183
|
-
*/
|
|
184
|
-
MatrixQReturnType matrixQ(void) const;
|
|
185
|
-
|
|
186
|
-
/** \returns a reference to the matrix where the Householder QR decomposition is stored
|
|
187
|
-
*/
|
|
188
|
-
const MatrixType& matrixQR() const
|
|
189
|
-
{
|
|
190
|
-
eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
|
|
191
|
-
return m_qr;
|
|
192
|
-
}
|
|
172
|
+
#ifdef EIGEN_PARSED_BY_DOXYGEN
|
|
173
|
+
/** This method finds a solution x to the equation Ax=b, where A is the matrix of which
|
|
174
|
+
* \c *this is the QR decomposition.
|
|
175
|
+
*
|
|
176
|
+
* \param b the right-hand-side of the equation to solve.
|
|
177
|
+
*
|
|
178
|
+
* \returns the exact or least-square solution if the rank is greater or equal to the number of columns of A,
|
|
179
|
+
* and an arbitrary solution otherwise.
|
|
180
|
+
*
|
|
181
|
+
* \note_about_checking_solutions
|
|
182
|
+
*
|
|
183
|
+
* \note_about_arbitrary_choice_of_solution
|
|
184
|
+
*
|
|
185
|
+
* Example: \include FullPivHouseholderQR_solve.cpp
|
|
186
|
+
* Output: \verbinclude FullPivHouseholderQR_solve.out
|
|
187
|
+
*/
|
|
188
|
+
template <typename Rhs>
|
|
189
|
+
inline const Solve<FullPivHouseholderQR, Rhs> solve(const MatrixBase<Rhs>& b) const;
|
|
190
|
+
#endif
|
|
193
191
|
|
|
194
|
-
|
|
195
|
-
|
|
192
|
+
/** \returns Expression object representing the matrix Q
|
|
193
|
+
*/
|
|
194
|
+
MatrixQReturnType matrixQ(void) const;
|
|
196
195
|
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
196
|
+
/** \returns a reference to the matrix where the Householder QR decomposition is stored
|
|
197
|
+
*/
|
|
198
|
+
const MatrixType& matrixQR() const {
|
|
199
|
+
eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
|
|
200
|
+
return m_qr;
|
|
201
|
+
}
|
|
203
202
|
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
{
|
|
207
|
-
eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
|
|
208
|
-
return m_rows_transpositions;
|
|
209
|
-
}
|
|
203
|
+
template <typename InputType>
|
|
204
|
+
FullPivHouseholderQR& compute(const EigenBase<InputType>& matrix);
|
|
210
205
|
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
* \note This is only for square matrices.
|
|
217
|
-
*
|
|
218
|
-
* \warning a determinant can be very big or small, so for matrices
|
|
219
|
-
* of large enough dimension, there is a risk of overflow/underflow.
|
|
220
|
-
* One way to work around that is to use logAbsDeterminant() instead.
|
|
221
|
-
*
|
|
222
|
-
* \sa logAbsDeterminant(), MatrixBase::determinant()
|
|
223
|
-
*/
|
|
224
|
-
typename MatrixType::RealScalar absDeterminant() const;
|
|
225
|
-
|
|
226
|
-
/** \returns the natural log of the absolute value of the determinant of the matrix of which
|
|
227
|
-
* *this is the QR decomposition. It has only linear complexity
|
|
228
|
-
* (that is, O(n) where n is the dimension of the square matrix)
|
|
229
|
-
* as the QR decomposition has already been computed.
|
|
230
|
-
*
|
|
231
|
-
* \note This is only for square matrices.
|
|
232
|
-
*
|
|
233
|
-
* \note This method is useful to work around the risk of overflow/underflow that's inherent
|
|
234
|
-
* to determinant computation.
|
|
235
|
-
*
|
|
236
|
-
* \sa absDeterminant(), MatrixBase::determinant()
|
|
237
|
-
*/
|
|
238
|
-
typename MatrixType::RealScalar logAbsDeterminant() const;
|
|
239
|
-
|
|
240
|
-
/** \returns the rank of the matrix of which *this is the QR decomposition.
|
|
241
|
-
*
|
|
242
|
-
* \note This method has to determine which pivots should be considered nonzero.
|
|
243
|
-
* For that, it uses the threshold value that you can control by calling
|
|
244
|
-
* setThreshold(const RealScalar&).
|
|
245
|
-
*/
|
|
246
|
-
inline Index rank() const
|
|
247
|
-
{
|
|
248
|
-
using std::abs;
|
|
249
|
-
eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
|
|
250
|
-
RealScalar premultiplied_threshold = abs(m_maxpivot) * threshold();
|
|
251
|
-
Index result = 0;
|
|
252
|
-
for(Index i = 0; i < m_nonzero_pivots; ++i)
|
|
253
|
-
result += (abs(m_qr.coeff(i,i)) > premultiplied_threshold);
|
|
254
|
-
return result;
|
|
255
|
-
}
|
|
206
|
+
/** \returns a const reference to the column permutation matrix */
|
|
207
|
+
const PermutationType& colsPermutation() const {
|
|
208
|
+
eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
|
|
209
|
+
return m_cols_permutation;
|
|
210
|
+
}
|
|
256
211
|
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
*/
|
|
263
|
-
inline Index dimensionOfKernel() const
|
|
264
|
-
{
|
|
265
|
-
eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
|
|
266
|
-
return cols() - rank();
|
|
267
|
-
}
|
|
212
|
+
/** \returns a const reference to the vector of indices representing the rows transpositions */
|
|
213
|
+
const IntDiagSizeVectorType& rowsTranspositions() const {
|
|
214
|
+
eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
|
|
215
|
+
return m_rows_transpositions;
|
|
216
|
+
}
|
|
268
217
|
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
218
|
+
/** \returns the determinant of the matrix of which
|
|
219
|
+
* *this is the QR decomposition. It has only linear complexity
|
|
220
|
+
* (that is, O(n) where n is the dimension of the square matrix)
|
|
221
|
+
* as the QR decomposition has already been computed.
|
|
222
|
+
*
|
|
223
|
+
* \note This is only for square matrices.
|
|
224
|
+
*
|
|
225
|
+
* \warning a determinant can be very big or small, so for matrices
|
|
226
|
+
* of large enough dimension, there is a risk of overflow/underflow.
|
|
227
|
+
* One way to work around that is to use logAbsDeterminant() instead.
|
|
228
|
+
*
|
|
229
|
+
* \sa absDeterminant(), logAbsDeterminant(), MatrixBase::determinant()
|
|
230
|
+
*/
|
|
231
|
+
typename MatrixType::Scalar determinant() const;
|
|
232
|
+
|
|
233
|
+
/** \returns the absolute value of the determinant of the matrix of which
|
|
234
|
+
* *this is the QR decomposition. It has only linear complexity
|
|
235
|
+
* (that is, O(n) where n is the dimension of the square matrix)
|
|
236
|
+
* as the QR decomposition has already been computed.
|
|
237
|
+
*
|
|
238
|
+
* \note This is only for square matrices.
|
|
239
|
+
*
|
|
240
|
+
* \warning a determinant can be very big or small, so for matrices
|
|
241
|
+
* of large enough dimension, there is a risk of overflow/underflow.
|
|
242
|
+
* One way to work around that is to use logAbsDeterminant() instead.
|
|
243
|
+
*
|
|
244
|
+
* \sa determinant(), logAbsDeterminant(), MatrixBase::determinant()
|
|
245
|
+
*/
|
|
246
|
+
typename MatrixType::RealScalar absDeterminant() const;
|
|
247
|
+
|
|
248
|
+
/** \returns the natural log of the absolute value of the determinant of the matrix of which
|
|
249
|
+
* *this is the QR decomposition. It has only linear complexity
|
|
250
|
+
* (that is, O(n) where n is the dimension of the square matrix)
|
|
251
|
+
* as the QR decomposition has already been computed.
|
|
252
|
+
*
|
|
253
|
+
* \note This is only for square matrices.
|
|
254
|
+
*
|
|
255
|
+
* \note This method is useful to work around the risk of overflow/underflow that's inherent
|
|
256
|
+
* to determinant computation.
|
|
257
|
+
*
|
|
258
|
+
* \sa determinant(), absDeterminant(), MatrixBase::determinant()
|
|
259
|
+
*/
|
|
260
|
+
typename MatrixType::RealScalar logAbsDeterminant() const;
|
|
261
|
+
|
|
262
|
+
/** \returns the sign of the determinant of the matrix of which
|
|
263
|
+
* *this is the QR decomposition. It has only linear complexity
|
|
264
|
+
* (that is, O(n) where n is the dimension of the square matrix)
|
|
265
|
+
* as the QR decomposition has already been computed.
|
|
266
|
+
*
|
|
267
|
+
* \note This is only for square matrices.
|
|
268
|
+
*
|
|
269
|
+
* \note This method is useful to work around the risk of overflow/underflow that's inherent
|
|
270
|
+
* to determinant computation.
|
|
271
|
+
*
|
|
272
|
+
* \sa determinant(), absDeterminant(), logAbsDeterminant(), MatrixBase::determinant()
|
|
273
|
+
*/
|
|
274
|
+
typename MatrixType::Scalar signDeterminant() const;
|
|
275
|
+
|
|
276
|
+
/** \returns the rank of the matrix of which *this is the QR decomposition.
|
|
277
|
+
*
|
|
278
|
+
* \note This method has to determine which pivots should be considered nonzero.
|
|
279
|
+
* For that, it uses the threshold value that you can control by calling
|
|
280
|
+
* setThreshold(const RealScalar&).
|
|
281
|
+
*/
|
|
282
|
+
inline Index rank() const {
|
|
283
|
+
using std::abs;
|
|
284
|
+
eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
|
|
285
|
+
RealScalar premultiplied_threshold = abs(m_maxpivot) * threshold();
|
|
286
|
+
Index result = 0;
|
|
287
|
+
for (Index i = 0; i < m_nonzero_pivots; ++i) result += (abs(m_qr.coeff(i, i)) > premultiplied_threshold);
|
|
288
|
+
return result;
|
|
289
|
+
}
|
|
281
290
|
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
return rank() == rows();
|
|
293
|
-
}
|
|
291
|
+
/** \returns the dimension of the kernel of the matrix of which *this is the QR decomposition.
|
|
292
|
+
*
|
|
293
|
+
* \note This method has to determine which pivots should be considered nonzero.
|
|
294
|
+
* For that, it uses the threshold value that you can control by calling
|
|
295
|
+
* setThreshold(const RealScalar&).
|
|
296
|
+
*/
|
|
297
|
+
inline Index dimensionOfKernel() const {
|
|
298
|
+
eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
|
|
299
|
+
return cols() - rank();
|
|
300
|
+
}
|
|
294
301
|
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
302
|
+
/** \returns true if the matrix of which *this is the QR decomposition represents an injective
|
|
303
|
+
* linear map, i.e. has trivial kernel; false otherwise.
|
|
304
|
+
*
|
|
305
|
+
* \note This method has to determine which pivots should be considered nonzero.
|
|
306
|
+
* For that, it uses the threshold value that you can control by calling
|
|
307
|
+
* setThreshold(const RealScalar&).
|
|
308
|
+
*/
|
|
309
|
+
inline bool isInjective() const {
|
|
310
|
+
eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
|
|
311
|
+
return rank() == cols();
|
|
312
|
+
}
|
|
306
313
|
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
314
|
+
/** \returns true if the matrix of which *this is the QR decomposition represents a surjective
|
|
315
|
+
* linear map; false otherwise.
|
|
316
|
+
*
|
|
317
|
+
* \note This method has to determine which pivots should be considered nonzero.
|
|
318
|
+
* For that, it uses the threshold value that you can control by calling
|
|
319
|
+
* setThreshold(const RealScalar&).
|
|
320
|
+
*/
|
|
321
|
+
inline bool isSurjective() const {
|
|
322
|
+
eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
|
|
323
|
+
return rank() == rows();
|
|
324
|
+
}
|
|
317
325
|
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
* who need to determine when pivots are to be considered nonzero. This is not used for the
|
|
329
|
-
* QR decomposition itself.
|
|
330
|
-
*
|
|
331
|
-
* When it needs to get the threshold value, Eigen calls threshold(). By default, this
|
|
332
|
-
* uses a formula to automatically determine a reasonable threshold.
|
|
333
|
-
* Once you have called the present method setThreshold(const RealScalar&),
|
|
334
|
-
* your value is used instead.
|
|
335
|
-
*
|
|
336
|
-
* \param threshold The new value to use as the threshold.
|
|
337
|
-
*
|
|
338
|
-
* A pivot will be considered nonzero if its absolute value is strictly greater than
|
|
339
|
-
* \f$ \vert pivot \vert \leqslant threshold \times \vert maxpivot \vert \f$
|
|
340
|
-
* where maxpivot is the biggest pivot.
|
|
341
|
-
*
|
|
342
|
-
* If you want to come back to the default behavior, call setThreshold(Default_t)
|
|
343
|
-
*/
|
|
344
|
-
FullPivHouseholderQR& setThreshold(const RealScalar& threshold)
|
|
345
|
-
{
|
|
346
|
-
m_usePrescribedThreshold = true;
|
|
347
|
-
m_prescribedThreshold = threshold;
|
|
348
|
-
return *this;
|
|
349
|
-
}
|
|
326
|
+
/** \returns true if the matrix of which *this is the QR decomposition is invertible.
|
|
327
|
+
*
|
|
328
|
+
* \note This method has to determine which pivots should be considered nonzero.
|
|
329
|
+
* For that, it uses the threshold value that you can control by calling
|
|
330
|
+
* setThreshold(const RealScalar&).
|
|
331
|
+
*/
|
|
332
|
+
inline bool isInvertible() const {
|
|
333
|
+
eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
|
|
334
|
+
return isInjective() && isSurjective();
|
|
335
|
+
}
|
|
350
336
|
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
{
|
|
361
|
-
m_usePrescribedThreshold = false;
|
|
362
|
-
return *this;
|
|
363
|
-
}
|
|
337
|
+
/** \returns the inverse of the matrix of which *this is the QR decomposition.
|
|
338
|
+
*
|
|
339
|
+
* \note If this matrix is not invertible, the returned matrix has undefined coefficients.
|
|
340
|
+
* Use isInvertible() to first determine whether this matrix is invertible.
|
|
341
|
+
*/
|
|
342
|
+
inline const Inverse<FullPivHouseholderQR> inverse() const {
|
|
343
|
+
eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
|
|
344
|
+
return Inverse<FullPivHouseholderQR>(*this);
|
|
345
|
+
}
|
|
364
346
|
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
347
|
+
inline Index rows() const { return m_qr.rows(); }
|
|
348
|
+
inline Index cols() const { return m_qr.cols(); }
|
|
349
|
+
|
|
350
|
+
/** \returns a const reference to the vector of Householder coefficients used to represent the factor \c Q.
|
|
351
|
+
*
|
|
352
|
+
* For advanced uses only.
|
|
353
|
+
*/
|
|
354
|
+
const HCoeffsType& hCoeffs() const { return m_hCoeffs; }
|
|
355
|
+
|
|
356
|
+
/** Allows to prescribe a threshold to be used by certain methods, such as rank(),
|
|
357
|
+
* who need to determine when pivots are to be considered nonzero. This is not used for the
|
|
358
|
+
* QR decomposition itself.
|
|
359
|
+
*
|
|
360
|
+
* When it needs to get the threshold value, Eigen calls threshold(). By default, this
|
|
361
|
+
* uses a formula to automatically determine a reasonable threshold.
|
|
362
|
+
* Once you have called the present method setThreshold(const RealScalar&),
|
|
363
|
+
* your value is used instead.
|
|
364
|
+
*
|
|
365
|
+
* \param threshold The new value to use as the threshold.
|
|
366
|
+
*
|
|
367
|
+
* A pivot will be considered nonzero if its absolute value is strictly greater than
|
|
368
|
+
* \f$ \vert pivot \vert \leqslant threshold \times \vert maxpivot \vert \f$
|
|
369
|
+
* where maxpivot is the biggest pivot.
|
|
370
|
+
*
|
|
371
|
+
* If you want to come back to the default behavior, call setThreshold(Default_t)
|
|
372
|
+
*/
|
|
373
|
+
FullPivHouseholderQR& setThreshold(const RealScalar& threshold) {
|
|
374
|
+
m_usePrescribedThreshold = true;
|
|
375
|
+
m_prescribedThreshold = threshold;
|
|
376
|
+
return *this;
|
|
377
|
+
}
|
|
377
378
|
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
379
|
+
/** Allows to come back to the default behavior, letting Eigen use its default formula for
|
|
380
|
+
* determining the threshold.
|
|
381
|
+
*
|
|
382
|
+
* You should pass the special object Eigen::Default as parameter here.
|
|
383
|
+
* \code qr.setThreshold(Eigen::Default); \endcode
|
|
384
|
+
*
|
|
385
|
+
* See the documentation of setThreshold(const RealScalar&).
|
|
386
|
+
*/
|
|
387
|
+
FullPivHouseholderQR& setThreshold(Default_t) {
|
|
388
|
+
m_usePrescribedThreshold = false;
|
|
389
|
+
return *this;
|
|
390
|
+
}
|
|
390
391
|
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
392
|
+
/** Returns the threshold that will be used by certain methods such as rank().
|
|
393
|
+
*
|
|
394
|
+
* See the documentation of setThreshold(const RealScalar&).
|
|
395
|
+
*/
|
|
396
|
+
RealScalar threshold() const {
|
|
397
|
+
eigen_assert(m_isInitialized || m_usePrescribedThreshold);
|
|
398
|
+
return m_usePrescribedThreshold ? m_prescribedThreshold
|
|
399
|
+
// this formula comes from experimenting (see "LU precision tuning" thread on the
|
|
400
|
+
// list) and turns out to be identical to Higham's formula used already in LDLt.
|
|
401
|
+
: NumTraits<Scalar>::epsilon() * RealScalar(m_qr.diagonalSize());
|
|
402
|
+
}
|
|
395
403
|
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
404
|
+
/** \returns the number of nonzero pivots in the QR decomposition.
|
|
405
|
+
* Here nonzero is meant in the exact sense, not in a fuzzy sense.
|
|
406
|
+
* So that notion isn't really intrinsically interesting, but it is
|
|
407
|
+
* still useful when implementing algorithms.
|
|
408
|
+
*
|
|
409
|
+
* \sa rank()
|
|
410
|
+
*/
|
|
411
|
+
inline Index nonzeroPivots() const {
|
|
412
|
+
eigen_assert(m_isInitialized && "LU is not initialized.");
|
|
413
|
+
return m_nonzero_pivots;
|
|
414
|
+
}
|
|
399
415
|
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
416
|
+
/** \returns the absolute value of the biggest pivot, i.e. the biggest
|
|
417
|
+
* diagonal coefficient of U.
|
|
418
|
+
*/
|
|
419
|
+
RealScalar maxPivot() const { return m_maxpivot; }
|
|
403
420
|
|
|
404
|
-
|
|
421
|
+
#ifndef EIGEN_PARSED_BY_DOXYGEN
|
|
422
|
+
template <typename RhsType, typename DstType>
|
|
423
|
+
void _solve_impl(const RhsType& rhs, DstType& dst) const;
|
|
405
424
|
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
}
|
|
425
|
+
template <bool Conjugate, typename RhsType, typename DstType>
|
|
426
|
+
void _solve_impl_transposed(const RhsType& rhs, DstType& dst) const;
|
|
427
|
+
#endif
|
|
410
428
|
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
429
|
+
protected:
|
|
430
|
+
EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
|
|
431
|
+
|
|
432
|
+
void computeInPlace();
|
|
433
|
+
|
|
434
|
+
MatrixType m_qr;
|
|
435
|
+
HCoeffsType m_hCoeffs;
|
|
436
|
+
IntDiagSizeVectorType m_rows_transpositions;
|
|
437
|
+
IntDiagSizeVectorType m_cols_transpositions;
|
|
438
|
+
PermutationType m_cols_permutation;
|
|
439
|
+
RowVectorType m_temp;
|
|
440
|
+
bool m_isInitialized, m_usePrescribedThreshold;
|
|
441
|
+
RealScalar m_prescribedThreshold, m_maxpivot;
|
|
442
|
+
Index m_nonzero_pivots;
|
|
443
|
+
RealScalar m_precision;
|
|
444
|
+
Index m_det_p;
|
|
424
445
|
};
|
|
425
446
|
|
|
426
|
-
template<typename MatrixType>
|
|
427
|
-
typename MatrixType::
|
|
428
|
-
|
|
447
|
+
template <typename MatrixType, typename PermutationIndex>
|
|
448
|
+
typename MatrixType::Scalar FullPivHouseholderQR<MatrixType, PermutationIndex>::determinant() const {
|
|
449
|
+
eigen_assert(m_isInitialized && "HouseholderQR is not initialized.");
|
|
450
|
+
eigen_assert(m_qr.rows() == m_qr.cols() && "You can't take the determinant of a non-square matrix!");
|
|
451
|
+
Scalar detQ;
|
|
452
|
+
internal::householder_determinant<HCoeffsType, Scalar, NumTraits<Scalar>::IsComplex>::run(m_hCoeffs, detQ);
|
|
453
|
+
return isInjective() ? (detQ * Scalar(m_det_p)) * m_qr.diagonal().prod() : Scalar(0);
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
template <typename MatrixType, typename PermutationIndex>
|
|
457
|
+
typename MatrixType::RealScalar FullPivHouseholderQR<MatrixType, PermutationIndex>::absDeterminant() const {
|
|
429
458
|
using std::abs;
|
|
430
459
|
eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
|
|
431
460
|
eigen_assert(m_qr.rows() == m_qr.cols() && "You can't take the determinant of a non-square matrix!");
|
|
432
|
-
return abs(m_qr.diagonal().prod());
|
|
461
|
+
return isInjective() ? abs(m_qr.diagonal().prod()) : RealScalar(0);
|
|
433
462
|
}
|
|
434
463
|
|
|
435
|
-
template<typename MatrixType>
|
|
436
|
-
typename MatrixType::RealScalar FullPivHouseholderQR<MatrixType>::logAbsDeterminant() const
|
|
437
|
-
{
|
|
464
|
+
template <typename MatrixType, typename PermutationIndex>
|
|
465
|
+
typename MatrixType::RealScalar FullPivHouseholderQR<MatrixType, PermutationIndex>::logAbsDeterminant() const {
|
|
438
466
|
eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
|
|
439
467
|
eigen_assert(m_qr.rows() == m_qr.cols() && "You can't take the determinant of a non-square matrix!");
|
|
440
|
-
return m_qr.diagonal().cwiseAbs().array().log().sum();
|
|
468
|
+
return isInjective() ? m_qr.diagonal().cwiseAbs().array().log().sum() : -NumTraits<RealScalar>::infinity();
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
template <typename MatrixType, typename PermutationIndex>
|
|
472
|
+
typename MatrixType::Scalar FullPivHouseholderQR<MatrixType, PermutationIndex>::signDeterminant() const {
|
|
473
|
+
eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
|
|
474
|
+
eigen_assert(m_qr.rows() == m_qr.cols() && "You can't take the determinant of a non-square matrix!");
|
|
475
|
+
Scalar detQ;
|
|
476
|
+
internal::householder_determinant<HCoeffsType, Scalar, NumTraits<Scalar>::IsComplex>::run(m_hCoeffs, detQ);
|
|
477
|
+
return isInjective() ? (detQ * Scalar(m_det_p)) * m_qr.diagonal().array().sign().prod() : Scalar(0);
|
|
441
478
|
}
|
|
442
479
|
|
|
443
480
|
/** Performs the QR factorization of the given matrix \a matrix. The result of
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
template<typename MatrixType>
|
|
450
|
-
template<typename InputType>
|
|
451
|
-
FullPivHouseholderQR<MatrixType>& FullPivHouseholderQR<MatrixType>::compute(
|
|
452
|
-
{
|
|
481
|
+
* the factorization is stored into \c *this, and a reference to \c *this
|
|
482
|
+
* is returned.
|
|
483
|
+
*
|
|
484
|
+
* \sa class FullPivHouseholderQR, FullPivHouseholderQR(const MatrixType&)
|
|
485
|
+
*/
|
|
486
|
+
template <typename MatrixType, typename PermutationIndex>
|
|
487
|
+
template <typename InputType>
|
|
488
|
+
FullPivHouseholderQR<MatrixType, PermutationIndex>& FullPivHouseholderQR<MatrixType, PermutationIndex>::compute(
|
|
489
|
+
const EigenBase<InputType>& matrix) {
|
|
453
490
|
m_qr = matrix.derived();
|
|
454
491
|
computeInPlace();
|
|
455
492
|
return *this;
|
|
456
493
|
}
|
|
457
494
|
|
|
458
|
-
template<typename MatrixType>
|
|
459
|
-
void FullPivHouseholderQR<MatrixType>::computeInPlace()
|
|
460
|
-
|
|
461
|
-
check_template_parameters();
|
|
462
|
-
|
|
495
|
+
template <typename MatrixType, typename PermutationIndex>
|
|
496
|
+
void FullPivHouseholderQR<MatrixType, PermutationIndex>::computeInPlace() {
|
|
497
|
+
eigen_assert(m_qr.cols() <= NumTraits<PermutationIndex>::highest());
|
|
463
498
|
using std::abs;
|
|
464
499
|
Index rows = m_qr.rows();
|
|
465
500
|
Index cols = m_qr.cols();
|
|
466
|
-
Index size = (std::min)(rows,cols);
|
|
501
|
+
Index size = (std::min)(rows, cols);
|
|
467
502
|
|
|
468
|
-
|
|
469
503
|
m_hCoeffs.resize(size);
|
|
470
504
|
|
|
471
505
|
m_temp.resize(cols);
|
|
@@ -478,132 +512,122 @@ void FullPivHouseholderQR<MatrixType>::computeInPlace()
|
|
|
478
512
|
|
|
479
513
|
RealScalar biggest(0);
|
|
480
514
|
|
|
481
|
-
m_nonzero_pivots = size;
|
|
515
|
+
m_nonzero_pivots = size; // the generic case is that in which all pivots are nonzero (invertible case)
|
|
482
516
|
m_maxpivot = RealScalar(0);
|
|
483
517
|
|
|
484
|
-
for (Index k = 0; k < size; ++k)
|
|
485
|
-
{
|
|
518
|
+
for (Index k = 0; k < size; ++k) {
|
|
486
519
|
Index row_of_biggest_in_corner, col_of_biggest_in_corner;
|
|
487
520
|
typedef internal::scalar_score_coeff_op<Scalar> Scoring;
|
|
488
521
|
typedef typename Scoring::result_type Score;
|
|
489
522
|
|
|
490
|
-
Score score = m_qr.bottomRightCorner(rows-k, cols-k)
|
|
523
|
+
Score score = m_qr.bottomRightCorner(rows - k, cols - k)
|
|
491
524
|
.unaryExpr(Scoring())
|
|
492
525
|
.maxCoeff(&row_of_biggest_in_corner, &col_of_biggest_in_corner);
|
|
493
526
|
row_of_biggest_in_corner += k;
|
|
494
527
|
col_of_biggest_in_corner += k;
|
|
495
|
-
RealScalar biggest_in_corner =
|
|
496
|
-
|
|
528
|
+
RealScalar biggest_in_corner =
|
|
529
|
+
internal::abs_knowing_score<Scalar>()(m_qr(row_of_biggest_in_corner, col_of_biggest_in_corner), score);
|
|
530
|
+
if (k == 0) biggest = biggest_in_corner;
|
|
497
531
|
|
|
498
532
|
// if the corner is negligible, then we have less than full rank, and we can finish early
|
|
499
|
-
if(internal::isMuchSmallerThan(biggest_in_corner, biggest, m_precision))
|
|
500
|
-
{
|
|
533
|
+
if (internal::isMuchSmallerThan(biggest_in_corner, biggest, m_precision)) {
|
|
501
534
|
m_nonzero_pivots = k;
|
|
502
|
-
for(Index i = k; i < size; i++)
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
m_cols_transpositions.coeffRef(i) = internal::convert_index<StorageIndex>(i);
|
|
535
|
+
for (Index i = k; i < size; i++) {
|
|
536
|
+
m_rows_transpositions.coeffRef(i) = internal::convert_index<PermutationIndex>(i);
|
|
537
|
+
m_cols_transpositions.coeffRef(i) = internal::convert_index<PermutationIndex>(i);
|
|
506
538
|
m_hCoeffs.coeffRef(i) = Scalar(0);
|
|
507
539
|
}
|
|
508
540
|
break;
|
|
509
541
|
}
|
|
510
542
|
|
|
511
|
-
m_rows_transpositions.coeffRef(k) = internal::convert_index<
|
|
512
|
-
m_cols_transpositions.coeffRef(k) = internal::convert_index<
|
|
513
|
-
if(k != row_of_biggest_in_corner) {
|
|
514
|
-
m_qr.row(k).tail(cols-k).swap(m_qr.row(row_of_biggest_in_corner).tail(cols-k));
|
|
543
|
+
m_rows_transpositions.coeffRef(k) = internal::convert_index<PermutationIndex>(row_of_biggest_in_corner);
|
|
544
|
+
m_cols_transpositions.coeffRef(k) = internal::convert_index<PermutationIndex>(col_of_biggest_in_corner);
|
|
545
|
+
if (k != row_of_biggest_in_corner) {
|
|
546
|
+
m_qr.row(k).tail(cols - k).swap(m_qr.row(row_of_biggest_in_corner).tail(cols - k));
|
|
515
547
|
++number_of_transpositions;
|
|
516
548
|
}
|
|
517
|
-
if(k != col_of_biggest_in_corner) {
|
|
549
|
+
if (k != col_of_biggest_in_corner) {
|
|
518
550
|
m_qr.col(k).swap(m_qr.col(col_of_biggest_in_corner));
|
|
519
551
|
++number_of_transpositions;
|
|
520
552
|
}
|
|
521
553
|
|
|
522
554
|
RealScalar beta;
|
|
523
|
-
m_qr.col(k).tail(rows-k).makeHouseholderInPlace(m_hCoeffs.coeffRef(k), beta);
|
|
524
|
-
m_qr.coeffRef(k,k) = beta;
|
|
555
|
+
m_qr.col(k).tail(rows - k).makeHouseholderInPlace(m_hCoeffs.coeffRef(k), beta);
|
|
556
|
+
m_qr.coeffRef(k, k) = beta;
|
|
525
557
|
|
|
526
558
|
// remember the maximum absolute value of diagonal coefficients
|
|
527
|
-
if(abs(beta) > m_maxpivot) m_maxpivot = abs(beta);
|
|
559
|
+
if (abs(beta) > m_maxpivot) m_maxpivot = abs(beta);
|
|
528
560
|
|
|
529
|
-
m_qr.bottomRightCorner(rows-k, cols-k-1)
|
|
530
|
-
.applyHouseholderOnTheLeft(m_qr.col(k).tail(rows-k-1), m_hCoeffs.coeffRef(k), &m_temp.coeffRef(k+1));
|
|
561
|
+
m_qr.bottomRightCorner(rows - k, cols - k - 1)
|
|
562
|
+
.applyHouseholderOnTheLeft(m_qr.col(k).tail(rows - k - 1), m_hCoeffs.coeffRef(k), &m_temp.coeffRef(k + 1));
|
|
531
563
|
}
|
|
532
564
|
|
|
533
565
|
m_cols_permutation.setIdentity(cols);
|
|
534
|
-
for(Index k = 0; k < size; ++k)
|
|
535
|
-
m_cols_permutation.applyTranspositionOnTheRight(k, m_cols_transpositions.coeff(k));
|
|
566
|
+
for (Index k = 0; k < size; ++k) m_cols_permutation.applyTranspositionOnTheRight(k, m_cols_transpositions.coeff(k));
|
|
536
567
|
|
|
537
|
-
|
|
568
|
+
m_det_p = (number_of_transpositions % 2) ? -1 : 1;
|
|
538
569
|
m_isInitialized = true;
|
|
539
570
|
}
|
|
540
571
|
|
|
541
572
|
#ifndef EIGEN_PARSED_BY_DOXYGEN
|
|
542
|
-
template<typename
|
|
543
|
-
template<typename RhsType, typename DstType>
|
|
544
|
-
void FullPivHouseholderQR<
|
|
545
|
-
{
|
|
573
|
+
template <typename MatrixType_, typename PermutationIndex_>
|
|
574
|
+
template <typename RhsType, typename DstType>
|
|
575
|
+
void FullPivHouseholderQR<MatrixType_, PermutationIndex_>::_solve_impl(const RhsType& rhs, DstType& dst) const {
|
|
546
576
|
const Index l_rank = rank();
|
|
547
577
|
|
|
548
578
|
// FIXME introduce nonzeroPivots() and use it here. and more generally,
|
|
549
579
|
// make the same improvements in this dec as in FullPivLU.
|
|
550
|
-
if(l_rank==0)
|
|
551
|
-
{
|
|
580
|
+
if (l_rank == 0) {
|
|
552
581
|
dst.setZero();
|
|
553
582
|
return;
|
|
554
583
|
}
|
|
555
584
|
|
|
556
585
|
typename RhsType::PlainObject c(rhs);
|
|
557
586
|
|
|
558
|
-
Matrix<typename RhsType::Scalar,1,RhsType::ColsAtCompileTime> temp(rhs.cols());
|
|
559
|
-
for (Index k = 0; k < l_rank; ++k)
|
|
560
|
-
|
|
561
|
-
Index remainingSize = rows()-k;
|
|
587
|
+
Matrix<typename RhsType::Scalar, 1, RhsType::ColsAtCompileTime> temp(rhs.cols());
|
|
588
|
+
for (Index k = 0; k < l_rank; ++k) {
|
|
589
|
+
Index remainingSize = rows() - k;
|
|
562
590
|
c.row(k).swap(c.row(m_rows_transpositions.coeff(k)));
|
|
563
591
|
c.bottomRightCorner(remainingSize, rhs.cols())
|
|
564
|
-
|
|
565
|
-
m_hCoeffs.coeff(k), &temp.coeffRef(0));
|
|
592
|
+
.applyHouseholderOnTheLeft(m_qr.col(k).tail(remainingSize - 1), m_hCoeffs.coeff(k), &temp.coeffRef(0));
|
|
566
593
|
}
|
|
567
594
|
|
|
568
|
-
m_qr.topLeftCorner(l_rank, l_rank)
|
|
569
|
-
.template triangularView<Upper>()
|
|
570
|
-
.solveInPlace(c.topRows(l_rank));
|
|
595
|
+
m_qr.topLeftCorner(l_rank, l_rank).template triangularView<Upper>().solveInPlace(c.topRows(l_rank));
|
|
571
596
|
|
|
572
|
-
for(Index i = 0; i < l_rank; ++i) dst.row(m_cols_permutation.indices().coeff(i)) = c.row(i);
|
|
573
|
-
for(Index i = l_rank; i < cols(); ++i) dst.row(m_cols_permutation.indices().coeff(i)).setZero();
|
|
597
|
+
for (Index i = 0; i < l_rank; ++i) dst.row(m_cols_permutation.indices().coeff(i)) = c.row(i);
|
|
598
|
+
for (Index i = l_rank; i < cols(); ++i) dst.row(m_cols_permutation.indices().coeff(i)).setZero();
|
|
574
599
|
}
|
|
575
600
|
|
|
576
|
-
template<typename
|
|
577
|
-
template<bool Conjugate, typename RhsType, typename DstType>
|
|
578
|
-
void FullPivHouseholderQR<
|
|
579
|
-
{
|
|
601
|
+
template <typename MatrixType_, typename PermutationIndex_>
|
|
602
|
+
template <bool Conjugate, typename RhsType, typename DstType>
|
|
603
|
+
void FullPivHouseholderQR<MatrixType_, PermutationIndex_>::_solve_impl_transposed(const RhsType& rhs,
|
|
604
|
+
DstType& dst) const {
|
|
580
605
|
const Index l_rank = rank();
|
|
581
606
|
|
|
582
|
-
if(l_rank == 0)
|
|
583
|
-
{
|
|
607
|
+
if (l_rank == 0) {
|
|
584
608
|
dst.setZero();
|
|
585
609
|
return;
|
|
586
610
|
}
|
|
587
611
|
|
|
588
|
-
typename RhsType::PlainObject c(m_cols_permutation.transpose()*rhs);
|
|
612
|
+
typename RhsType::PlainObject c(m_cols_permutation.transpose() * rhs);
|
|
589
613
|
|
|
590
614
|
m_qr.topLeftCorner(l_rank, l_rank)
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
615
|
+
.template triangularView<Upper>()
|
|
616
|
+
.transpose()
|
|
617
|
+
.template conjugateIf<Conjugate>()
|
|
618
|
+
.solveInPlace(c.topRows(l_rank));
|
|
594
619
|
|
|
595
620
|
dst.topRows(l_rank) = c.topRows(l_rank);
|
|
596
|
-
dst.bottomRows(rows()-l_rank).setZero();
|
|
621
|
+
dst.bottomRows(rows() - l_rank).setZero();
|
|
597
622
|
|
|
598
623
|
Matrix<Scalar, 1, DstType::ColsAtCompileTime> temp(dst.cols());
|
|
599
624
|
const Index size = (std::min)(rows(), cols());
|
|
600
|
-
for (Index k = size-1; k >= 0; --k)
|
|
601
|
-
|
|
602
|
-
Index remainingSize = rows()-k;
|
|
625
|
+
for (Index k = size - 1; k >= 0; --k) {
|
|
626
|
+
Index remainingSize = rows() - k;
|
|
603
627
|
|
|
604
628
|
dst.bottomRightCorner(remainingSize, dst.cols())
|
|
605
|
-
|
|
606
|
-
|
|
629
|
+
.applyHouseholderOnTheLeft(m_qr.col(k).tail(remainingSize - 1).template conjugateIf<!Conjugate>(),
|
|
630
|
+
m_hCoeffs.template conjugateIf<Conjugate>().coeff(k), &temp.coeffRef(0));
|
|
607
631
|
|
|
608
632
|
dst.row(k).swap(dst.row(m_rows_transpositions.coeff(k)));
|
|
609
633
|
}
|
|
@@ -611,52 +635,49 @@ void FullPivHouseholderQR<_MatrixType>::_solve_impl_transposed(const RhsType &rh
|
|
|
611
635
|
#endif
|
|
612
636
|
|
|
613
637
|
namespace internal {
|
|
614
|
-
|
|
615
|
-
template<typename DstXprType, typename MatrixType>
|
|
616
|
-
struct Assignment<DstXprType, Inverse<FullPivHouseholderQR<MatrixType> >,
|
|
617
|
-
|
|
618
|
-
|
|
638
|
+
|
|
639
|
+
template <typename DstXprType, typename MatrixType, typename PermutationIndex>
|
|
640
|
+
struct Assignment<DstXprType, Inverse<FullPivHouseholderQR<MatrixType, PermutationIndex> >,
|
|
641
|
+
internal::assign_op<typename DstXprType::Scalar,
|
|
642
|
+
typename FullPivHouseholderQR<MatrixType, PermutationIndex>::Scalar>,
|
|
643
|
+
Dense2Dense> {
|
|
644
|
+
typedef FullPivHouseholderQR<MatrixType, PermutationIndex> QrType;
|
|
619
645
|
typedef Inverse<QrType> SrcXprType;
|
|
620
|
-
static void run(DstXprType
|
|
621
|
-
|
|
646
|
+
static void run(DstXprType& dst, const SrcXprType& src,
|
|
647
|
+
const internal::assign_op<typename DstXprType::Scalar, typename QrType::Scalar>&) {
|
|
622
648
|
dst = src.nestedExpression().solve(MatrixType::Identity(src.rows(), src.cols()));
|
|
623
649
|
}
|
|
624
650
|
};
|
|
625
651
|
|
|
626
652
|
/** \ingroup QR_Module
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
template<typename MatrixType
|
|
633
|
-
|
|
634
|
-
{
|
|
635
|
-
public:
|
|
636
|
-
typedef typename FullPivHouseholderQR<MatrixType>::IntDiagSizeVectorType IntDiagSizeVectorType;
|
|
653
|
+
*
|
|
654
|
+
* \brief Expression type for return value of FullPivHouseholderQR::matrixQ()
|
|
655
|
+
*
|
|
656
|
+
* \tparam MatrixType type of underlying dense matrix
|
|
657
|
+
*/
|
|
658
|
+
template <typename MatrixType, typename PermutationIndex>
|
|
659
|
+
struct FullPivHouseholderQRMatrixQReturnType
|
|
660
|
+
: public ReturnByValue<FullPivHouseholderQRMatrixQReturnType<MatrixType, PermutationIndex> > {
|
|
661
|
+
public:
|
|
662
|
+
typedef typename FullPivHouseholderQR<MatrixType, PermutationIndex>::IntDiagSizeVectorType IntDiagSizeVectorType;
|
|
637
663
|
typedef typename internal::plain_diag_type<MatrixType>::type HCoeffsType;
|
|
638
664
|
typedef Matrix<typename MatrixType::Scalar, 1, MatrixType::RowsAtCompileTime, RowMajor, 1,
|
|
639
|
-
MatrixType::MaxRowsAtCompileTime>
|
|
665
|
+
MatrixType::MaxRowsAtCompileTime>
|
|
666
|
+
WorkVectorType;
|
|
640
667
|
|
|
641
|
-
FullPivHouseholderQRMatrixQReturnType(const MatrixType&
|
|
642
|
-
const HCoeffsType& hCoeffs,
|
|
668
|
+
FullPivHouseholderQRMatrixQReturnType(const MatrixType& qr, const HCoeffsType& hCoeffs,
|
|
643
669
|
const IntDiagSizeVectorType& rowsTranspositions)
|
|
644
|
-
|
|
645
|
-
m_hCoeffs(hCoeffs),
|
|
646
|
-
m_rowsTranspositions(rowsTranspositions)
|
|
647
|
-
{}
|
|
670
|
+
: m_qr(qr), m_hCoeffs(hCoeffs), m_rowsTranspositions(rowsTranspositions) {}
|
|
648
671
|
|
|
649
672
|
template <typename ResultType>
|
|
650
|
-
void evalTo(ResultType& result) const
|
|
651
|
-
{
|
|
673
|
+
void evalTo(ResultType& result) const {
|
|
652
674
|
const Index rows = m_qr.rows();
|
|
653
675
|
WorkVectorType workspace(rows);
|
|
654
676
|
evalTo(result, workspace);
|
|
655
677
|
}
|
|
656
678
|
|
|
657
679
|
template <typename ResultType>
|
|
658
|
-
void evalTo(ResultType& result, WorkVectorType& workspace) const
|
|
659
|
-
{
|
|
680
|
+
void evalTo(ResultType& result, WorkVectorType& workspace) const {
|
|
660
681
|
using numext::conj;
|
|
661
682
|
// compute the product H'_0 H'_1 ... H'_n-1,
|
|
662
683
|
// where H_k is the k-th Householder transformation I - h_k v_k v_k'
|
|
@@ -666,10 +687,9 @@ public:
|
|
|
666
687
|
const Index size = (std::min)(rows, cols);
|
|
667
688
|
workspace.resize(rows);
|
|
668
689
|
result.setIdentity(rows, rows);
|
|
669
|
-
for (Index k = size-1; k >= 0; k--)
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
.applyHouseholderOnTheLeft(m_qr.col(k).tail(rows-k-1), conj(m_hCoeffs.coeff(k)), &workspace.coeffRef(k));
|
|
690
|
+
for (Index k = size - 1; k >= 0; k--) {
|
|
691
|
+
result.block(k, k, rows - k, rows - k)
|
|
692
|
+
.applyHouseholderOnTheLeft(m_qr.col(k).tail(rows - k - 1), conj(m_hCoeffs.coeff(k)), &workspace.coeffRef(k));
|
|
673
693
|
result.row(k).swap(result.row(m_rowsTranspositions.coeff(k)));
|
|
674
694
|
}
|
|
675
695
|
}
|
|
@@ -677,7 +697,7 @@ public:
|
|
|
677
697
|
Index rows() const { return m_qr.rows(); }
|
|
678
698
|
Index cols() const { return m_qr.rows(); }
|
|
679
699
|
|
|
680
|
-
protected:
|
|
700
|
+
protected:
|
|
681
701
|
typename MatrixType::Nested m_qr;
|
|
682
702
|
typename HCoeffsType::Nested m_hCoeffs;
|
|
683
703
|
typename IntDiagSizeVectorType::Nested m_rowsTranspositions;
|
|
@@ -688,26 +708,26 @@ protected:
|
|
|
688
708
|
// : public evaluator<ReturnByValue<FullPivHouseholderQRMatrixQReturnType<MatrixType> > >
|
|
689
709
|
// {};
|
|
690
710
|
|
|
691
|
-
}
|
|
711
|
+
} // end namespace internal
|
|
692
712
|
|
|
693
|
-
template<typename MatrixType>
|
|
694
|
-
inline typename FullPivHouseholderQR<MatrixType>::MatrixQReturnType
|
|
695
|
-
{
|
|
713
|
+
template <typename MatrixType, typename PermutationIndex>
|
|
714
|
+
inline typename FullPivHouseholderQR<MatrixType, PermutationIndex>::MatrixQReturnType
|
|
715
|
+
FullPivHouseholderQR<MatrixType, PermutationIndex>::matrixQ() const {
|
|
696
716
|
eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
|
|
697
717
|
return MatrixQReturnType(m_qr, m_hCoeffs, m_rows_transpositions);
|
|
698
718
|
}
|
|
699
719
|
|
|
700
720
|
/** \return the full-pivoting Householder QR decomposition of \c *this.
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
template<typename Derived>
|
|
705
|
-
|
|
706
|
-
MatrixBase<Derived>::
|
|
707
|
-
{
|
|
708
|
-
return FullPivHouseholderQR<PlainObject>(eval());
|
|
721
|
+
*
|
|
722
|
+
* \sa class FullPivHouseholderQR
|
|
723
|
+
*/
|
|
724
|
+
template <typename Derived>
|
|
725
|
+
template <typename PermutationIndex>
|
|
726
|
+
const FullPivHouseholderQR<typename MatrixBase<Derived>::PlainObject, PermutationIndex>
|
|
727
|
+
MatrixBase<Derived>::fullPivHouseholderQr() const {
|
|
728
|
+
return FullPivHouseholderQR<PlainObject, PermutationIndex>(eval());
|
|
709
729
|
}
|
|
710
730
|
|
|
711
|
-
}
|
|
731
|
+
} // end namespace Eigen
|
|
712
732
|
|
|
713
|
-
#endif
|
|
733
|
+
#endif // EIGEN_FULLPIVOTINGHOUSEHOLDERQR_H
|