@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
|
@@ -13,426 +13,411 @@
|
|
|
13
13
|
|
|
14
14
|
#include "./RealSchur.h"
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
// IWYU pragma: private
|
|
17
|
+
#include "./InternalHeaderCheck.h"
|
|
18
|
+
|
|
19
|
+
namespace Eigen {
|
|
17
20
|
|
|
18
21
|
/** \eigenvalues_module \ingroup Eigenvalues_Module
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
template<typename
|
|
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
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
22
|
+
*
|
|
23
|
+
*
|
|
24
|
+
* \class EigenSolver
|
|
25
|
+
*
|
|
26
|
+
* \brief Computes eigenvalues and eigenvectors of general matrices
|
|
27
|
+
*
|
|
28
|
+
* \tparam MatrixType_ the type of the matrix of which we are computing the
|
|
29
|
+
* eigendecomposition; this is expected to be an instantiation of the Matrix
|
|
30
|
+
* class template. Currently, only real matrices are supported.
|
|
31
|
+
*
|
|
32
|
+
* The eigenvalues and eigenvectors of a matrix \f$ A \f$ are scalars
|
|
33
|
+
* \f$ \lambda \f$ and vectors \f$ v \f$ such that \f$ Av = \lambda v \f$. If
|
|
34
|
+
* \f$ D \f$ is a diagonal matrix with the eigenvalues on the diagonal, and
|
|
35
|
+
* \f$ V \f$ is a matrix with the eigenvectors as its columns, then \f$ A V =
|
|
36
|
+
* V D \f$. The matrix \f$ V \f$ is almost always invertible, in which case we
|
|
37
|
+
* have \f$ A = V D V^{-1} \f$. This is called the eigendecomposition.
|
|
38
|
+
*
|
|
39
|
+
* The eigenvalues and eigenvectors of a matrix may be complex, even when the
|
|
40
|
+
* matrix is real. However, we can choose real matrices \f$ V \f$ and \f$ D
|
|
41
|
+
* \f$ satisfying \f$ A V = V D \f$, just like the eigendecomposition, if the
|
|
42
|
+
* matrix \f$ D \f$ is not required to be diagonal, but if it is allowed to
|
|
43
|
+
* have blocks of the form
|
|
44
|
+
* \f[ \begin{bmatrix} u & v \\ -v & u \end{bmatrix} \f]
|
|
45
|
+
* (where \f$ u \f$ and \f$ v \f$ are real numbers) on the diagonal. These
|
|
46
|
+
* blocks correspond to complex eigenvalue pairs \f$ u \pm iv \f$. We call
|
|
47
|
+
* this variant of the eigendecomposition the pseudo-eigendecomposition.
|
|
48
|
+
*
|
|
49
|
+
* Call the function compute() to compute the eigenvalues and eigenvectors of
|
|
50
|
+
* a given matrix. Alternatively, you can use the
|
|
51
|
+
* EigenSolver(const MatrixType&, bool) constructor which computes the
|
|
52
|
+
* eigenvalues and eigenvectors at construction time. Once the eigenvalue and
|
|
53
|
+
* eigenvectors are computed, they can be retrieved with the eigenvalues() and
|
|
54
|
+
* eigenvectors() functions. The pseudoEigenvalueMatrix() and
|
|
55
|
+
* pseudoEigenvectors() methods allow the construction of the
|
|
56
|
+
* pseudo-eigendecomposition.
|
|
57
|
+
*
|
|
58
|
+
* The documentation for EigenSolver(const MatrixType&, bool) contains an
|
|
59
|
+
* example of the typical use of this class.
|
|
60
|
+
*
|
|
61
|
+
* \note The implementation is adapted from
|
|
62
|
+
* <a href="http://math.nist.gov/javanumerics/jama/">JAMA</a> (public domain).
|
|
63
|
+
* Their code is based on EISPACK.
|
|
64
|
+
*
|
|
65
|
+
* \sa MatrixBase::eigenvalues(), class ComplexEigenSolver, class SelfAdjointEigenSolver
|
|
66
|
+
*/
|
|
67
|
+
template <typename MatrixType_>
|
|
68
|
+
class EigenSolver {
|
|
69
|
+
public:
|
|
70
|
+
/** \brief Synonym for the template parameter \p MatrixType_. */
|
|
71
|
+
typedef MatrixType_ MatrixType;
|
|
72
|
+
|
|
73
|
+
enum {
|
|
74
|
+
RowsAtCompileTime = MatrixType::RowsAtCompileTime,
|
|
75
|
+
ColsAtCompileTime = MatrixType::ColsAtCompileTime,
|
|
76
|
+
Options = internal::traits<MatrixType>::Options,
|
|
77
|
+
MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
|
|
78
|
+
MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
/** \brief Scalar type for matrices of type #MatrixType. */
|
|
82
|
+
typedef typename MatrixType::Scalar Scalar;
|
|
83
|
+
typedef typename NumTraits<Scalar>::Real RealScalar;
|
|
84
|
+
typedef Eigen::Index Index; ///< \deprecated since Eigen 3.3
|
|
85
|
+
|
|
86
|
+
/** \brief Complex scalar type for #MatrixType.
|
|
87
|
+
*
|
|
88
|
+
* This is \c std::complex<Scalar> if #Scalar is real (e.g.,
|
|
89
|
+
* \c float or \c double) and just \c Scalar if #Scalar is
|
|
90
|
+
* complex.
|
|
91
|
+
*/
|
|
92
|
+
typedef internal::make_complex_t<Scalar> ComplexScalar;
|
|
93
|
+
|
|
94
|
+
/** \brief Type for vector of eigenvalues as returned by eigenvalues().
|
|
95
|
+
*
|
|
96
|
+
* This is a column vector with entries of type #ComplexScalar.
|
|
97
|
+
* The length of the vector is the size of #MatrixType.
|
|
98
|
+
*/
|
|
99
|
+
typedef Matrix<ComplexScalar, ColsAtCompileTime, 1, Options & ~RowMajor, MaxColsAtCompileTime, 1> EigenvalueType;
|
|
100
|
+
|
|
101
|
+
/** \brief Type for matrix of eigenvectors as returned by eigenvectors().
|
|
102
|
+
*
|
|
103
|
+
* This is a square matrix with entries of type #ComplexScalar.
|
|
104
|
+
* The size is the same as the size of #MatrixType.
|
|
105
|
+
*/
|
|
106
|
+
typedef Matrix<ComplexScalar, RowsAtCompileTime, ColsAtCompileTime, Options, MaxRowsAtCompileTime,
|
|
107
|
+
MaxColsAtCompileTime>
|
|
108
|
+
EigenvectorsType;
|
|
109
|
+
|
|
110
|
+
/** \brief Default constructor.
|
|
111
|
+
*
|
|
112
|
+
* The default constructor is useful in cases in which the user intends to
|
|
113
|
+
* perform decompositions via EigenSolver::compute(const MatrixType&, bool).
|
|
114
|
+
*
|
|
115
|
+
* \sa compute() for an example.
|
|
116
|
+
*/
|
|
117
|
+
EigenSolver()
|
|
118
|
+
: m_eivec(), m_eivalues(), m_isInitialized(false), m_eigenvectorsOk(false), m_realSchur(), m_matT(), m_tmp() {}
|
|
119
|
+
|
|
120
|
+
/** \brief Default constructor with memory preallocation
|
|
121
|
+
*
|
|
122
|
+
* Like the default constructor but with preallocation of the internal data
|
|
123
|
+
* according to the specified problem \a size.
|
|
124
|
+
* \sa EigenSolver()
|
|
125
|
+
*/
|
|
126
|
+
explicit EigenSolver(Index size)
|
|
122
127
|
: m_eivec(size, size),
|
|
123
128
|
m_eivalues(size),
|
|
124
129
|
m_isInitialized(false),
|
|
125
130
|
m_eigenvectorsOk(false),
|
|
126
131
|
m_realSchur(size),
|
|
127
|
-
m_matT(size, size),
|
|
128
|
-
m_tmp(size)
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
explicit EigenSolver(const EigenBase<InputType>& matrix, bool computeEigenvectors = true)
|
|
132
|
+
m_matT(size, size),
|
|
133
|
+
m_tmp(size) {}
|
|
134
|
+
|
|
135
|
+
/** \brief Constructor; computes eigendecomposition of given matrix.
|
|
136
|
+
*
|
|
137
|
+
* \param[in] matrix Square matrix whose eigendecomposition is to be computed.
|
|
138
|
+
* \param[in] computeEigenvectors If true, both the eigenvectors and the
|
|
139
|
+
* eigenvalues are computed; if false, only the eigenvalues are
|
|
140
|
+
* computed.
|
|
141
|
+
*
|
|
142
|
+
* This constructor calls compute() to compute the eigenvalues
|
|
143
|
+
* and eigenvectors.
|
|
144
|
+
*
|
|
145
|
+
* Example: \include EigenSolver_EigenSolver_MatrixType.cpp
|
|
146
|
+
* Output: \verbinclude EigenSolver_EigenSolver_MatrixType.out
|
|
147
|
+
*
|
|
148
|
+
* \sa compute()
|
|
149
|
+
*/
|
|
150
|
+
template <typename InputType>
|
|
151
|
+
explicit EigenSolver(const EigenBase<InputType>& matrix, bool computeEigenvectors = true)
|
|
148
152
|
: m_eivec(matrix.rows(), matrix.cols()),
|
|
149
153
|
m_eivalues(matrix.cols()),
|
|
150
154
|
m_isInitialized(false),
|
|
151
155
|
m_eigenvectorsOk(false),
|
|
152
156
|
m_realSchur(matrix.cols()),
|
|
153
|
-
m_matT(matrix.rows(), matrix.cols()),
|
|
154
|
-
m_tmp(matrix.cols())
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
}
|
|
157
|
+
m_matT(matrix.rows(), matrix.cols()),
|
|
158
|
+
m_tmp(matrix.cols()) {
|
|
159
|
+
compute(matrix.derived(), computeEigenvectors);
|
|
160
|
+
}
|
|
158
161
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
}
|
|
162
|
+
/** \brief Returns the eigenvectors of given matrix.
|
|
163
|
+
*
|
|
164
|
+
* \returns %Matrix whose columns are the (possibly complex) eigenvectors.
|
|
165
|
+
*
|
|
166
|
+
* \pre Either the constructor
|
|
167
|
+
* EigenSolver(const MatrixType&,bool) or the member function
|
|
168
|
+
* compute(const MatrixType&, bool) has been called before, and
|
|
169
|
+
* \p computeEigenvectors was set to true (the default).
|
|
170
|
+
*
|
|
171
|
+
* Column \f$ k \f$ of the returned matrix is an eigenvector corresponding
|
|
172
|
+
* to eigenvalue number \f$ k \f$ as returned by eigenvalues(). The
|
|
173
|
+
* eigenvectors are normalized to have (Euclidean) norm equal to one. The
|
|
174
|
+
* matrix returned by this function is the matrix \f$ V \f$ in the
|
|
175
|
+
* eigendecomposition \f$ A = V D V^{-1} \f$, if it exists.
|
|
176
|
+
*
|
|
177
|
+
* Example: \include EigenSolver_eigenvectors.cpp
|
|
178
|
+
* Output: \verbinclude EigenSolver_eigenvectors.out
|
|
179
|
+
*
|
|
180
|
+
* \sa eigenvalues(), pseudoEigenvectors()
|
|
181
|
+
*/
|
|
182
|
+
EigenvectorsType eigenvectors() const;
|
|
183
|
+
|
|
184
|
+
/** \brief Returns the pseudo-eigenvectors of given matrix.
|
|
185
|
+
*
|
|
186
|
+
* \returns Const reference to matrix whose columns are the pseudo-eigenvectors.
|
|
187
|
+
*
|
|
188
|
+
* \pre Either the constructor
|
|
189
|
+
* EigenSolver(const MatrixType&,bool) or the member function
|
|
190
|
+
* compute(const MatrixType&, bool) has been called before, and
|
|
191
|
+
* \p computeEigenvectors was set to true (the default).
|
|
192
|
+
*
|
|
193
|
+
* The real matrix \f$ V \f$ returned by this function and the
|
|
194
|
+
* block-diagonal matrix \f$ D \f$ returned by pseudoEigenvalueMatrix()
|
|
195
|
+
* satisfy \f$ AV = VD \f$.
|
|
196
|
+
*
|
|
197
|
+
* Example: \include EigenSolver_pseudoEigenvectors.cpp
|
|
198
|
+
* Output: \verbinclude EigenSolver_pseudoEigenvectors.out
|
|
199
|
+
*
|
|
200
|
+
* \sa pseudoEigenvalueMatrix(), eigenvectors()
|
|
201
|
+
*/
|
|
202
|
+
const MatrixType& pseudoEigenvectors() const {
|
|
203
|
+
eigen_assert(m_isInitialized && "EigenSolver is not initialized.");
|
|
204
|
+
eigen_assert(m_eigenvectorsOk && "The eigenvectors have not been computed together with the eigenvalues.");
|
|
205
|
+
return m_eivec;
|
|
206
|
+
}
|
|
205
207
|
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
}
|
|
208
|
+
/** \brief Returns the block-diagonal matrix in the pseudo-eigendecomposition.
|
|
209
|
+
*
|
|
210
|
+
* \returns A block-diagonal matrix.
|
|
211
|
+
*
|
|
212
|
+
* \pre Either the constructor
|
|
213
|
+
* EigenSolver(const MatrixType&,bool) or the member function
|
|
214
|
+
* compute(const MatrixType&, bool) has been called before.
|
|
215
|
+
*
|
|
216
|
+
* The matrix \f$ D \f$ returned by this function is real and
|
|
217
|
+
* block-diagonal. The blocks on the diagonal are either 1-by-1 or 2-by-2
|
|
218
|
+
* blocks of the form
|
|
219
|
+
* \f$ \begin{bmatrix} u & v \\ -v & u \end{bmatrix} \f$.
|
|
220
|
+
* These blocks are not sorted in any particular order.
|
|
221
|
+
* The matrix \f$ D \f$ and the matrix \f$ V \f$ returned by
|
|
222
|
+
* pseudoEigenvectors() satisfy \f$ AV = VD \f$.
|
|
223
|
+
*
|
|
224
|
+
* \sa pseudoEigenvectors() for an example, eigenvalues()
|
|
225
|
+
*/
|
|
226
|
+
MatrixType pseudoEigenvalueMatrix() const;
|
|
227
|
+
|
|
228
|
+
/** \brief Returns the eigenvalues of given matrix.
|
|
229
|
+
*
|
|
230
|
+
* \returns A const reference to the column vector containing the eigenvalues.
|
|
231
|
+
*
|
|
232
|
+
* \pre Either the constructor
|
|
233
|
+
* EigenSolver(const MatrixType&,bool) or the member function
|
|
234
|
+
* compute(const MatrixType&, bool) has been called before.
|
|
235
|
+
*
|
|
236
|
+
* The eigenvalues are repeated according to their algebraic multiplicity,
|
|
237
|
+
* so there are as many eigenvalues as rows in the matrix. The eigenvalues
|
|
238
|
+
* are not sorted in any particular order.
|
|
239
|
+
*
|
|
240
|
+
* Example: \include EigenSolver_eigenvalues.cpp
|
|
241
|
+
* Output: \verbinclude EigenSolver_eigenvalues.out
|
|
242
|
+
*
|
|
243
|
+
* \sa eigenvectors(), pseudoEigenvalueMatrix(),
|
|
244
|
+
* MatrixBase::eigenvalues()
|
|
245
|
+
*/
|
|
246
|
+
const EigenvalueType& eigenvalues() const {
|
|
247
|
+
eigen_assert(m_isInitialized && "EigenSolver is not initialized.");
|
|
248
|
+
return m_eivalues;
|
|
249
|
+
}
|
|
249
250
|
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
251
|
+
/** \brief Computes eigendecomposition of given matrix.
|
|
252
|
+
*
|
|
253
|
+
* \param[in] matrix Square matrix whose eigendecomposition is to be computed.
|
|
254
|
+
* \param[in] computeEigenvectors If true, both the eigenvectors and the
|
|
255
|
+
* eigenvalues are computed; if false, only the eigenvalues are
|
|
256
|
+
* computed.
|
|
257
|
+
* \returns Reference to \c *this
|
|
258
|
+
*
|
|
259
|
+
* This function computes the eigenvalues of the real matrix \p matrix.
|
|
260
|
+
* The eigenvalues() function can be used to retrieve them. If
|
|
261
|
+
* \p computeEigenvectors is true, then the eigenvectors are also computed
|
|
262
|
+
* and can be retrieved by calling eigenvectors().
|
|
263
|
+
*
|
|
264
|
+
* The matrix is first reduced to real Schur form using the RealSchur
|
|
265
|
+
* class. The Schur decomposition is then used to compute the eigenvalues
|
|
266
|
+
* and eigenvectors.
|
|
267
|
+
*
|
|
268
|
+
* The cost of the computation is dominated by the cost of the
|
|
269
|
+
* Schur decomposition, which is very approximately \f$ 25n^3 \f$
|
|
270
|
+
* (where \f$ n \f$ is the size of the matrix) if \p computeEigenvectors
|
|
271
|
+
* is true, and \f$ 10n^3 \f$ if \p computeEigenvectors is false.
|
|
272
|
+
*
|
|
273
|
+
* This method reuses of the allocated data in the EigenSolver object.
|
|
274
|
+
*
|
|
275
|
+
* Example: \include EigenSolver_compute.cpp
|
|
276
|
+
* Output: \verbinclude EigenSolver_compute.out
|
|
277
|
+
*/
|
|
278
|
+
template <typename InputType>
|
|
279
|
+
EigenSolver& compute(const EigenBase<InputType>& matrix, bool computeEigenvectors = true);
|
|
280
|
+
|
|
281
|
+
/** \returns NumericalIssue if the input contains INF or NaN values or overflow occurred. Returns Success otherwise.
|
|
282
|
+
*/
|
|
283
|
+
ComputationInfo info() const {
|
|
284
|
+
eigen_assert(m_isInitialized && "EigenSolver is not initialized.");
|
|
285
|
+
return m_info;
|
|
286
|
+
}
|
|
286
287
|
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
}
|
|
288
|
+
/** \brief Sets the maximum number of iterations allowed. */
|
|
289
|
+
EigenSolver& setMaxIterations(Index maxIters) {
|
|
290
|
+
m_realSchur.setMaxIterations(maxIters);
|
|
291
|
+
return *this;
|
|
292
|
+
}
|
|
293
293
|
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
{
|
|
297
|
-
return m_realSchur.getMaxIterations();
|
|
298
|
-
}
|
|
294
|
+
/** \brief Returns the maximum number of iterations. */
|
|
295
|
+
Index getMaxIterations() { return m_realSchur.getMaxIterations(); }
|
|
299
296
|
|
|
300
|
-
|
|
301
|
-
|
|
297
|
+
private:
|
|
298
|
+
void doComputeEigenvectors();
|
|
302
299
|
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
typedef Matrix<Scalar, ColsAtCompileTime, 1, Options & ~RowMajor, MaxColsAtCompileTime, 1> ColumnVectorType;
|
|
320
|
-
ColumnVectorType m_tmp;
|
|
300
|
+
protected:
|
|
301
|
+
static void check_template_parameters() {
|
|
302
|
+
EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar);
|
|
303
|
+
EIGEN_STATIC_ASSERT(!NumTraits<Scalar>::IsComplex, NUMERIC_TYPE_MUST_BE_REAL);
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
MatrixType m_eivec;
|
|
307
|
+
EigenvalueType m_eivalues;
|
|
308
|
+
bool m_isInitialized;
|
|
309
|
+
bool m_eigenvectorsOk;
|
|
310
|
+
ComputationInfo m_info;
|
|
311
|
+
RealSchur<MatrixType> m_realSchur;
|
|
312
|
+
MatrixType m_matT;
|
|
313
|
+
|
|
314
|
+
typedef Matrix<Scalar, ColsAtCompileTime, 1, Options & ~RowMajor, MaxColsAtCompileTime, 1> ColumnVectorType;
|
|
315
|
+
ColumnVectorType m_tmp;
|
|
321
316
|
};
|
|
322
317
|
|
|
323
|
-
template<typename MatrixType>
|
|
324
|
-
MatrixType EigenSolver<MatrixType>::pseudoEigenvalueMatrix() const
|
|
325
|
-
{
|
|
318
|
+
template <typename MatrixType>
|
|
319
|
+
MatrixType EigenSolver<MatrixType>::pseudoEigenvalueMatrix() const {
|
|
326
320
|
eigen_assert(m_isInitialized && "EigenSolver is not initialized.");
|
|
327
|
-
const RealScalar precision = RealScalar(2)*NumTraits<RealScalar>::epsilon();
|
|
328
|
-
Index n = m_eivalues.rows();
|
|
329
|
-
MatrixType matD = MatrixType::Zero(n,n);
|
|
330
|
-
|
|
331
|
-
{
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
{
|
|
336
|
-
matD.
|
|
337
|
-
|
|
321
|
+
const RealScalar precision = RealScalar(2) * NumTraits<RealScalar>::epsilon();
|
|
322
|
+
const Index n = m_eivalues.rows();
|
|
323
|
+
MatrixType matD = MatrixType::Zero(n, n);
|
|
324
|
+
Index i = 0;
|
|
325
|
+
for (; i < n - 1; ++i) {
|
|
326
|
+
RealScalar real = numext::real(m_eivalues.coeff(i));
|
|
327
|
+
RealScalar imag = numext::imag(m_eivalues.coeff(i));
|
|
328
|
+
matD.coeffRef(i, i) = real;
|
|
329
|
+
if (!internal::isMuchSmallerThan(imag, real, precision)) {
|
|
330
|
+
matD.coeffRef(i, i + 1) = imag;
|
|
331
|
+
matD.coeffRef(i + 1, i) = -imag;
|
|
332
|
+
matD.coeffRef(i + 1, i + 1) = real;
|
|
338
333
|
++i;
|
|
339
334
|
}
|
|
340
335
|
}
|
|
336
|
+
if (i == n - 1) {
|
|
337
|
+
matD.coeffRef(i, i) = numext::real(m_eivalues.coeff(i));
|
|
338
|
+
}
|
|
339
|
+
|
|
341
340
|
return matD;
|
|
342
341
|
}
|
|
343
342
|
|
|
344
|
-
template<typename MatrixType>
|
|
345
|
-
typename EigenSolver<MatrixType>::EigenvectorsType EigenSolver<MatrixType>::eigenvectors() const
|
|
346
|
-
{
|
|
343
|
+
template <typename MatrixType>
|
|
344
|
+
typename EigenSolver<MatrixType>::EigenvectorsType EigenSolver<MatrixType>::eigenvectors() const {
|
|
347
345
|
eigen_assert(m_isInitialized && "EigenSolver is not initialized.");
|
|
348
346
|
eigen_assert(m_eigenvectorsOk && "The eigenvectors have not been computed together with the eigenvalues.");
|
|
349
|
-
const RealScalar precision = RealScalar(2)*NumTraits<RealScalar>::epsilon();
|
|
347
|
+
const RealScalar precision = RealScalar(2) * NumTraits<RealScalar>::epsilon();
|
|
350
348
|
Index n = m_eivec.cols();
|
|
351
|
-
EigenvectorsType matV(n,n);
|
|
352
|
-
for (Index j=0; j<n; ++j)
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
{
|
|
349
|
+
EigenvectorsType matV(n, n);
|
|
350
|
+
for (Index j = 0; j < n; ++j) {
|
|
351
|
+
if (internal::isMuchSmallerThan(numext::imag(m_eivalues.coeff(j)), numext::real(m_eivalues.coeff(j)), precision) ||
|
|
352
|
+
j + 1 == n) {
|
|
356
353
|
// we have a real eigen value
|
|
357
354
|
matV.col(j) = m_eivec.col(j).template cast<ComplexScalar>();
|
|
358
355
|
matV.col(j).normalize();
|
|
359
|
-
}
|
|
360
|
-
else
|
|
361
|
-
{
|
|
356
|
+
} else {
|
|
362
357
|
// we have a pair of complex eigen values
|
|
363
|
-
for (Index i=0; i<n; ++i)
|
|
364
|
-
|
|
365
|
-
matV.coeffRef(i,j)
|
|
366
|
-
matV.coeffRef(i,j+1) = ComplexScalar(m_eivec.coeff(i,j), -m_eivec.coeff(i,j+1));
|
|
358
|
+
for (Index i = 0; i < n; ++i) {
|
|
359
|
+
matV.coeffRef(i, j) = ComplexScalar(m_eivec.coeff(i, j), m_eivec.coeff(i, j + 1));
|
|
360
|
+
matV.coeffRef(i, j + 1) = ComplexScalar(m_eivec.coeff(i, j), -m_eivec.coeff(i, j + 1));
|
|
367
361
|
}
|
|
368
362
|
matV.col(j).normalize();
|
|
369
|
-
matV.col(j+1).normalize();
|
|
363
|
+
matV.col(j + 1).normalize();
|
|
370
364
|
++j;
|
|
371
365
|
}
|
|
372
366
|
}
|
|
373
367
|
return matV;
|
|
374
368
|
}
|
|
375
369
|
|
|
376
|
-
template<typename MatrixType>
|
|
377
|
-
template<typename InputType>
|
|
378
|
-
EigenSolver<MatrixType>&
|
|
379
|
-
|
|
380
|
-
{
|
|
370
|
+
template <typename MatrixType>
|
|
371
|
+
template <typename InputType>
|
|
372
|
+
EigenSolver<MatrixType>& EigenSolver<MatrixType>::compute(const EigenBase<InputType>& matrix,
|
|
373
|
+
bool computeEigenvectors) {
|
|
381
374
|
check_template_parameters();
|
|
382
|
-
|
|
383
|
-
using std::sqrt;
|
|
384
|
-
using std::abs;
|
|
375
|
+
|
|
385
376
|
using numext::isfinite;
|
|
377
|
+
using std::abs;
|
|
378
|
+
using std::sqrt;
|
|
386
379
|
eigen_assert(matrix.cols() == matrix.rows());
|
|
387
380
|
|
|
388
381
|
// Reduce to real Schur form.
|
|
389
382
|
m_realSchur.compute(matrix.derived(), computeEigenvectors);
|
|
390
|
-
|
|
383
|
+
|
|
391
384
|
m_info = m_realSchur.info();
|
|
392
385
|
|
|
393
|
-
if (m_info == Success)
|
|
394
|
-
{
|
|
386
|
+
if (m_info == Success) {
|
|
395
387
|
m_matT = m_realSchur.matrixT();
|
|
396
|
-
if (computeEigenvectors)
|
|
397
|
-
|
|
398
|
-
|
|
388
|
+
if (computeEigenvectors) m_eivec = m_realSchur.matrixU();
|
|
389
|
+
|
|
399
390
|
// Compute eigenvalues from matT
|
|
400
391
|
m_eivalues.resize(matrix.cols());
|
|
401
392
|
Index i = 0;
|
|
402
|
-
while (i < matrix.cols())
|
|
403
|
-
|
|
404
|
-
if (i == matrix.cols() - 1 || m_matT.coeff(i+1, i) == Scalar(0))
|
|
405
|
-
{
|
|
393
|
+
while (i < matrix.cols()) {
|
|
394
|
+
if (i == matrix.cols() - 1 || m_matT.coeff(i + 1, i) == Scalar(0)) {
|
|
406
395
|
m_eivalues.coeffRef(i) = m_matT.coeff(i, i);
|
|
407
|
-
if(!(isfinite)(m_eivalues.coeffRef(i)))
|
|
408
|
-
{
|
|
396
|
+
if (!(isfinite)(m_eivalues.coeffRef(i))) {
|
|
409
397
|
m_isInitialized = true;
|
|
410
398
|
m_eigenvectorsOk = false;
|
|
411
399
|
m_info = NumericalIssue;
|
|
412
400
|
return *this;
|
|
413
401
|
}
|
|
414
402
|
++i;
|
|
415
|
-
}
|
|
416
|
-
|
|
417
|
-
{
|
|
418
|
-
Scalar p = Scalar(0.5) * (m_matT.coeff(i, i) - m_matT.coeff(i+1, i+1));
|
|
403
|
+
} else {
|
|
404
|
+
Scalar p = Scalar(0.5) * (m_matT.coeff(i, i) - m_matT.coeff(i + 1, i + 1));
|
|
419
405
|
Scalar z;
|
|
420
406
|
// Compute z = sqrt(abs(p * p + m_matT.coeff(i+1, i) * m_matT.coeff(i, i+1)));
|
|
421
407
|
// without overflow
|
|
422
408
|
{
|
|
423
|
-
Scalar t0 = m_matT.coeff(i+1, i);
|
|
424
|
-
Scalar t1 = m_matT.coeff(i, i+1);
|
|
425
|
-
Scalar maxval = numext::maxi<Scalar>(abs(p),numext::maxi<Scalar>(abs(t0),abs(t1)));
|
|
409
|
+
Scalar t0 = m_matT.coeff(i + 1, i);
|
|
410
|
+
Scalar t1 = m_matT.coeff(i, i + 1);
|
|
411
|
+
Scalar maxval = numext::maxi<Scalar>(abs(p), numext::maxi<Scalar>(abs(t0), abs(t1)));
|
|
426
412
|
t0 /= maxval;
|
|
427
413
|
t1 /= maxval;
|
|
428
|
-
Scalar p0 = p/maxval;
|
|
414
|
+
Scalar p0 = p / maxval;
|
|
429
415
|
z = maxval * sqrt(abs(p0 * p0 + t0 * t1));
|
|
430
416
|
}
|
|
431
|
-
|
|
432
|
-
m_eivalues.coeffRef(i)
|
|
433
|
-
m_eivalues.coeffRef(i+1) = ComplexScalar(m_matT.coeff(i+1, i+1) + p, -z);
|
|
434
|
-
if(!((isfinite)(m_eivalues.coeffRef(i)) && (isfinite)(m_eivalues.coeffRef(i+1))))
|
|
435
|
-
{
|
|
417
|
+
|
|
418
|
+
m_eivalues.coeffRef(i) = ComplexScalar(m_matT.coeff(i + 1, i + 1) + p, z);
|
|
419
|
+
m_eivalues.coeffRef(i + 1) = ComplexScalar(m_matT.coeff(i + 1, i + 1) + p, -z);
|
|
420
|
+
if (!((isfinite)(m_eivalues.coeffRef(i)) && (isfinite)(m_eivalues.coeffRef(i + 1)))) {
|
|
436
421
|
m_isInitialized = true;
|
|
437
422
|
m_eigenvectorsOk = false;
|
|
438
423
|
m_info = NumericalIssue;
|
|
@@ -441,10 +426,9 @@ EigenSolver<MatrixType>::compute(const EigenBase<InputType>& matrix, bool comput
|
|
|
441
426
|
i += 2;
|
|
442
427
|
}
|
|
443
428
|
}
|
|
444
|
-
|
|
429
|
+
|
|
445
430
|
// Compute eigenvectors.
|
|
446
|
-
if (computeEigenvectors)
|
|
447
|
-
doComputeEigenvectors();
|
|
431
|
+
if (computeEigenvectors) doComputeEigenvectors();
|
|
448
432
|
}
|
|
449
433
|
|
|
450
434
|
m_isInitialized = true;
|
|
@@ -453,170 +437,143 @@ EigenSolver<MatrixType>::compute(const EigenBase<InputType>& matrix, bool comput
|
|
|
453
437
|
return *this;
|
|
454
438
|
}
|
|
455
439
|
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
void EigenSolver<MatrixType>::doComputeEigenvectors()
|
|
459
|
-
{
|
|
440
|
+
template <typename MatrixType>
|
|
441
|
+
void EigenSolver<MatrixType>::doComputeEigenvectors() {
|
|
460
442
|
using std::abs;
|
|
461
443
|
const Index size = m_eivec.cols();
|
|
462
444
|
const Scalar eps = NumTraits<Scalar>::epsilon();
|
|
463
445
|
|
|
464
446
|
// inefficient! this is already computed in RealSchur
|
|
465
447
|
Scalar norm(0);
|
|
466
|
-
for (Index j = 0; j < size; ++j)
|
|
467
|
-
|
|
468
|
-
norm += m_matT.row(j).segment((std::max)(j-1,Index(0)), size-(std::max)(j-1,Index(0))).cwiseAbs().sum();
|
|
448
|
+
for (Index j = 0; j < size; ++j) {
|
|
449
|
+
norm += m_matT.row(j).segment((std::max)(j - 1, Index(0)), size - (std::max)(j - 1, Index(0))).cwiseAbs().sum();
|
|
469
450
|
}
|
|
470
|
-
|
|
451
|
+
|
|
471
452
|
// Backsubstitute to find vectors of upper triangular form
|
|
472
|
-
if (norm == Scalar(0))
|
|
473
|
-
{
|
|
453
|
+
if (norm == Scalar(0)) {
|
|
474
454
|
return;
|
|
475
455
|
}
|
|
476
456
|
|
|
477
|
-
for (Index n = size-1; n >= 0; n--)
|
|
478
|
-
{
|
|
457
|
+
for (Index n = size - 1; n >= 0; n--) {
|
|
479
458
|
Scalar p = m_eivalues.coeff(n).real();
|
|
480
459
|
Scalar q = m_eivalues.coeff(n).imag();
|
|
481
460
|
|
|
482
461
|
// Scalar vector
|
|
483
|
-
if (q == Scalar(0))
|
|
484
|
-
{
|
|
462
|
+
if (q == Scalar(0)) {
|
|
485
463
|
Scalar lastr(0), lastw(0);
|
|
486
464
|
Index l = n;
|
|
487
465
|
|
|
488
|
-
m_matT.coeffRef(n,n) = Scalar(1);
|
|
489
|
-
for (Index i = n-1; i >= 0; i--)
|
|
490
|
-
|
|
491
|
-
Scalar
|
|
492
|
-
Scalar r = m_matT.row(i).segment(l,n-l+1).dot(m_matT.col(n).segment(l, n-l+1));
|
|
466
|
+
m_matT.coeffRef(n, n) = Scalar(1);
|
|
467
|
+
for (Index i = n - 1; i >= 0; i--) {
|
|
468
|
+
Scalar w = m_matT.coeff(i, i) - p;
|
|
469
|
+
Scalar r = m_matT.row(i).segment(l, n - l + 1).dot(m_matT.col(n).segment(l, n - l + 1));
|
|
493
470
|
|
|
494
|
-
if (m_eivalues.coeff(i).imag() < Scalar(0))
|
|
495
|
-
{
|
|
471
|
+
if (m_eivalues.coeff(i).imag() < Scalar(0)) {
|
|
496
472
|
lastw = w;
|
|
497
473
|
lastr = r;
|
|
498
|
-
}
|
|
499
|
-
else
|
|
500
|
-
{
|
|
474
|
+
} else {
|
|
501
475
|
l = i;
|
|
502
|
-
if (m_eivalues.coeff(i).imag() == Scalar(0))
|
|
503
|
-
{
|
|
476
|
+
if (m_eivalues.coeff(i).imag() == Scalar(0)) {
|
|
504
477
|
if (w != Scalar(0))
|
|
505
|
-
m_matT.coeffRef(i,n) = -r / w;
|
|
478
|
+
m_matT.coeffRef(i, n) = -r / w;
|
|
506
479
|
else
|
|
507
|
-
m_matT.coeffRef(i,n) = -r / (eps * norm);
|
|
508
|
-
}
|
|
509
|
-
else // Solve real equations
|
|
480
|
+
m_matT.coeffRef(i, n) = -r / (eps * norm);
|
|
481
|
+
} else // Solve real equations
|
|
510
482
|
{
|
|
511
|
-
Scalar x = m_matT.coeff(i,i+1);
|
|
512
|
-
Scalar y = m_matT.coeff(i+1,i);
|
|
513
|
-
Scalar denom = (m_eivalues.coeff(i).real() - p) * (m_eivalues.coeff(i).real() - p) +
|
|
483
|
+
Scalar x = m_matT.coeff(i, i + 1);
|
|
484
|
+
Scalar y = m_matT.coeff(i + 1, i);
|
|
485
|
+
Scalar denom = (m_eivalues.coeff(i).real() - p) * (m_eivalues.coeff(i).real() - p) +
|
|
486
|
+
m_eivalues.coeff(i).imag() * m_eivalues.coeff(i).imag();
|
|
514
487
|
Scalar t = (x * lastr - lastw * r) / denom;
|
|
515
|
-
m_matT.coeffRef(i,n) = t;
|
|
488
|
+
m_matT.coeffRef(i, n) = t;
|
|
516
489
|
if (abs(x) > abs(lastw))
|
|
517
|
-
m_matT.coeffRef(i+1,n) = (-r - w * t) / x;
|
|
490
|
+
m_matT.coeffRef(i + 1, n) = (-r - w * t) / x;
|
|
518
491
|
else
|
|
519
|
-
m_matT.coeffRef(i+1,n) = (-lastr - y * t) / lastw;
|
|
492
|
+
m_matT.coeffRef(i + 1, n) = (-lastr - y * t) / lastw;
|
|
520
493
|
}
|
|
521
494
|
|
|
522
495
|
// Overflow control
|
|
523
|
-
Scalar t = abs(m_matT.coeff(i,n));
|
|
524
|
-
if ((eps * t) * t > Scalar(1))
|
|
525
|
-
m_matT.col(n).tail(size-i) /= t;
|
|
496
|
+
Scalar t = abs(m_matT.coeff(i, n));
|
|
497
|
+
if ((eps * t) * t > Scalar(1)) m_matT.col(n).tail(size - i) /= t;
|
|
526
498
|
}
|
|
527
499
|
}
|
|
528
|
-
}
|
|
529
|
-
else if (q < Scalar(0) && n > 0) // Complex vector
|
|
500
|
+
} else if (q < Scalar(0) && n > 0) // Complex vector
|
|
530
501
|
{
|
|
531
502
|
Scalar lastra(0), lastsa(0), lastw(0);
|
|
532
|
-
Index l = n-1;
|
|
503
|
+
Index l = n - 1;
|
|
533
504
|
|
|
534
505
|
// Last vector component imaginary so matrix is triangular
|
|
535
|
-
if (abs(m_matT.coeff(n,n-1)) > abs(m_matT.coeff(n-1,n)))
|
|
536
|
-
|
|
537
|
-
m_matT.coeffRef(n-1,n
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
m_matT.coeffRef(n-1,n-1) = numext::real(cc);
|
|
544
|
-
m_matT.coeffRef(n-1,n) = numext::imag(cc);
|
|
506
|
+
if (abs(m_matT.coeff(n, n - 1)) > abs(m_matT.coeff(n - 1, n))) {
|
|
507
|
+
m_matT.coeffRef(n - 1, n - 1) = q / m_matT.coeff(n, n - 1);
|
|
508
|
+
m_matT.coeffRef(n - 1, n) = -(m_matT.coeff(n, n) - p) / m_matT.coeff(n, n - 1);
|
|
509
|
+
} else {
|
|
510
|
+
ComplexScalar cc =
|
|
511
|
+
ComplexScalar(Scalar(0), -m_matT.coeff(n - 1, n)) / ComplexScalar(m_matT.coeff(n - 1, n - 1) - p, q);
|
|
512
|
+
m_matT.coeffRef(n - 1, n - 1) = numext::real(cc);
|
|
513
|
+
m_matT.coeffRef(n - 1, n) = numext::imag(cc);
|
|
545
514
|
}
|
|
546
|
-
m_matT.coeffRef(n,n-1) = Scalar(0);
|
|
547
|
-
m_matT.coeffRef(n,n) = Scalar(1);
|
|
548
|
-
for (Index i = n-2; i >= 0; i--)
|
|
549
|
-
|
|
550
|
-
Scalar
|
|
551
|
-
Scalar
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
if (m_eivalues.coeff(i).imag() < Scalar(0))
|
|
555
|
-
{
|
|
515
|
+
m_matT.coeffRef(n, n - 1) = Scalar(0);
|
|
516
|
+
m_matT.coeffRef(n, n) = Scalar(1);
|
|
517
|
+
for (Index i = n - 2; i >= 0; i--) {
|
|
518
|
+
Scalar ra = m_matT.row(i).segment(l, n - l + 1).dot(m_matT.col(n - 1).segment(l, n - l + 1));
|
|
519
|
+
Scalar sa = m_matT.row(i).segment(l, n - l + 1).dot(m_matT.col(n).segment(l, n - l + 1));
|
|
520
|
+
Scalar w = m_matT.coeff(i, i) - p;
|
|
521
|
+
|
|
522
|
+
if (m_eivalues.coeff(i).imag() < Scalar(0)) {
|
|
556
523
|
lastw = w;
|
|
557
524
|
lastra = ra;
|
|
558
525
|
lastsa = sa;
|
|
559
|
-
}
|
|
560
|
-
else
|
|
561
|
-
{
|
|
526
|
+
} else {
|
|
562
527
|
l = i;
|
|
563
|
-
if (m_eivalues.coeff(i).imag() == RealScalar(0))
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
m_matT.coeffRef(i,n
|
|
567
|
-
|
|
568
|
-
}
|
|
569
|
-
else
|
|
570
|
-
{
|
|
528
|
+
if (m_eivalues.coeff(i).imag() == RealScalar(0)) {
|
|
529
|
+
ComplexScalar cc = ComplexScalar(-ra, -sa) / ComplexScalar(w, q);
|
|
530
|
+
m_matT.coeffRef(i, n - 1) = numext::real(cc);
|
|
531
|
+
m_matT.coeffRef(i, n) = numext::imag(cc);
|
|
532
|
+
} else {
|
|
571
533
|
// Solve complex equations
|
|
572
|
-
Scalar x = m_matT.coeff(i,i+1);
|
|
573
|
-
Scalar y = m_matT.coeff(i+1,i);
|
|
574
|
-
Scalar vr = (m_eivalues.coeff(i).real() - p) * (m_eivalues.coeff(i).real() - p) +
|
|
534
|
+
Scalar x = m_matT.coeff(i, i + 1);
|
|
535
|
+
Scalar y = m_matT.coeff(i + 1, i);
|
|
536
|
+
Scalar vr = (m_eivalues.coeff(i).real() - p) * (m_eivalues.coeff(i).real() - p) +
|
|
537
|
+
m_eivalues.coeff(i).imag() * m_eivalues.coeff(i).imag() - q * q;
|
|
575
538
|
Scalar vi = (m_eivalues.coeff(i).real() - p) * Scalar(2) * q;
|
|
576
539
|
if ((vr == Scalar(0)) && (vi == Scalar(0)))
|
|
577
540
|
vr = eps * norm * (abs(w) + abs(q) + abs(x) + abs(y) + abs(lastw));
|
|
578
541
|
|
|
579
|
-
ComplexScalar cc = ComplexScalar(x*lastra-lastw*ra+q*sa,x*lastsa-lastw*sa-q*ra) /
|
|
580
|
-
|
|
581
|
-
m_matT.coeffRef(i,n) = numext::
|
|
582
|
-
|
|
583
|
-
{
|
|
584
|
-
m_matT.coeffRef(i+1,n-1) = (-ra - w * m_matT.coeff(i,n-1) + q * m_matT.coeff(i,n)) / x;
|
|
585
|
-
m_matT.coeffRef(i+1,n) = (-sa - w * m_matT.coeff(i,n) - q * m_matT.coeff(i,n-1)) / x;
|
|
586
|
-
}
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
m_matT.coeffRef(i+1,n
|
|
591
|
-
m_matT.coeffRef(i+1,n) = numext::imag(cc);
|
|
542
|
+
ComplexScalar cc = ComplexScalar(x * lastra - lastw * ra + q * sa, x * lastsa - lastw * sa - q * ra) /
|
|
543
|
+
ComplexScalar(vr, vi);
|
|
544
|
+
m_matT.coeffRef(i, n - 1) = numext::real(cc);
|
|
545
|
+
m_matT.coeffRef(i, n) = numext::imag(cc);
|
|
546
|
+
if (abs(x) > (abs(lastw) + abs(q))) {
|
|
547
|
+
m_matT.coeffRef(i + 1, n - 1) = (-ra - w * m_matT.coeff(i, n - 1) + q * m_matT.coeff(i, n)) / x;
|
|
548
|
+
m_matT.coeffRef(i + 1, n) = (-sa - w * m_matT.coeff(i, n) - q * m_matT.coeff(i, n - 1)) / x;
|
|
549
|
+
} else {
|
|
550
|
+
cc = ComplexScalar(-lastra - y * m_matT.coeff(i, n - 1), -lastsa - y * m_matT.coeff(i, n)) /
|
|
551
|
+
ComplexScalar(lastw, q);
|
|
552
|
+
m_matT.coeffRef(i + 1, n - 1) = numext::real(cc);
|
|
553
|
+
m_matT.coeffRef(i + 1, n) = numext::imag(cc);
|
|
592
554
|
}
|
|
593
555
|
}
|
|
594
556
|
|
|
595
557
|
// Overflow control
|
|
596
|
-
Scalar t = numext::maxi<Scalar>(abs(m_matT.coeff(i,n-1)),abs(m_matT.coeff(i,n)));
|
|
597
|
-
if ((eps * t) * t > Scalar(1))
|
|
598
|
-
m_matT.block(i, n-1, size-i, 2) /= t;
|
|
599
|
-
|
|
558
|
+
Scalar t = numext::maxi<Scalar>(abs(m_matT.coeff(i, n - 1)), abs(m_matT.coeff(i, n)));
|
|
559
|
+
if ((eps * t) * t > Scalar(1)) m_matT.block(i, n - 1, size - i, 2) /= t;
|
|
600
560
|
}
|
|
601
561
|
}
|
|
602
|
-
|
|
562
|
+
|
|
603
563
|
// We handled a pair of complex conjugate eigenvalues, so need to skip them both
|
|
604
564
|
n--;
|
|
605
|
-
}
|
|
606
|
-
|
|
607
|
-
{
|
|
608
|
-
eigen_assert(0 && "Internal bug in EigenSolver (INF or NaN has not been detected)"); // this should not happen
|
|
565
|
+
} else {
|
|
566
|
+
eigen_assert(0 && "Internal bug in EigenSolver (INF or NaN has not been detected)"); // this should not happen
|
|
609
567
|
}
|
|
610
568
|
}
|
|
611
569
|
|
|
612
570
|
// Back transformation to get eigenvectors of original matrix
|
|
613
|
-
for (Index j = size-1; j >= 0; j--)
|
|
614
|
-
|
|
615
|
-
m_tmp.noalias() = m_eivec.leftCols(j+1) * m_matT.col(j).segment(0, j+1);
|
|
571
|
+
for (Index j = size - 1; j >= 0; j--) {
|
|
572
|
+
m_tmp.noalias() = m_eivec.leftCols(j + 1) * m_matT.col(j).segment(0, j + 1);
|
|
616
573
|
m_eivec.col(j) = m_tmp;
|
|
617
574
|
}
|
|
618
575
|
}
|
|
619
576
|
|
|
620
|
-
}
|
|
577
|
+
} // end namespace Eigen
|
|
621
578
|
|
|
622
|
-
#endif
|
|
579
|
+
#endif // EIGEN_EIGENSOLVER_H
|