ruby-eigen 0.0.9 → 0.0.10.pre1
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.
- checksums.yaml +4 -4
- data/LICENSE +22 -0
- data/README.md +21 -0
- data/ext/eigen/eigen3/COPYING.BSD +26 -0
- data/ext/eigen/eigen3/COPYING.MPL2 +373 -0
- data/ext/eigen/eigen3/COPYING.README +18 -0
- data/ext/eigen/eigen3/Eigen/Array +11 -0
- data/ext/eigen/eigen3/Eigen/Cholesky +32 -0
- data/ext/eigen/eigen3/Eigen/CholmodSupport +45 -0
- data/ext/eigen/eigen3/Eigen/Core +376 -0
- data/ext/eigen/eigen3/Eigen/Dense +7 -0
- data/ext/eigen/eigen3/Eigen/Eigen +2 -0
- data/ext/eigen/eigen3/Eigen/Eigen2Support +95 -0
- data/ext/eigen/eigen3/Eigen/Eigenvalues +48 -0
- data/ext/eigen/eigen3/Eigen/Geometry +63 -0
- data/ext/eigen/eigen3/Eigen/Householder +23 -0
- data/ext/eigen/eigen3/Eigen/IterativeLinearSolvers +40 -0
- data/ext/eigen/eigen3/Eigen/Jacobi +26 -0
- data/ext/eigen/eigen3/Eigen/LU +41 -0
- data/ext/eigen/eigen3/Eigen/LeastSquares +32 -0
- data/ext/eigen/eigen3/Eigen/MetisSupport +28 -0
- data/ext/eigen/eigen3/Eigen/PaStiXSupport +46 -0
- data/ext/eigen/eigen3/Eigen/PardisoSupport +30 -0
- data/ext/eigen/eigen3/Eigen/QR +45 -0
- data/ext/eigen/eigen3/Eigen/QtAlignedMalloc +34 -0
- data/ext/eigen/eigen3/Eigen/SPQRSupport +29 -0
- data/ext/eigen/eigen3/Eigen/SVD +37 -0
- data/ext/eigen/eigen3/Eigen/Sparse +27 -0
- data/ext/eigen/eigen3/Eigen/SparseCore +64 -0
- data/ext/eigen/eigen3/Eigen/SparseLU +49 -0
- data/ext/eigen/eigen3/Eigen/SparseQR +33 -0
- data/ext/eigen/eigen3/Eigen/StdDeque +27 -0
- data/ext/eigen/eigen3/Eigen/StdList +26 -0
- data/ext/eigen/eigen3/Eigen/StdVector +27 -0
- data/ext/eigen/eigen3/Eigen/SuperLUSupport +59 -0
- data/ext/eigen/eigen3/Eigen/UmfPackSupport +36 -0
- data/ext/eigen/eigen3/Eigen/src/Cholesky/LDLT.h +611 -0
- data/ext/eigen/eigen3/Eigen/src/Cholesky/LLT.h +498 -0
- data/ext/eigen/eigen3/Eigen/src/Cholesky/LLT_MKL.h +102 -0
- data/ext/eigen/eigen3/Eigen/src/CholmodSupport/CholmodSupport.h +607 -0
- data/ext/eigen/eigen3/Eigen/src/Core/Array.h +323 -0
- data/ext/eigen/eigen3/Eigen/src/Core/ArrayBase.h +226 -0
- data/ext/eigen/eigen3/Eigen/src/Core/ArrayWrapper.h +264 -0
- data/ext/eigen/eigen3/Eigen/src/Core/Assign.h +590 -0
- data/ext/eigen/eigen3/Eigen/src/Core/Assign_MKL.h +224 -0
- data/ext/eigen/eigen3/Eigen/src/Core/BandMatrix.h +334 -0
- data/ext/eigen/eigen3/Eigen/src/Core/Block.h +406 -0
- data/ext/eigen/eigen3/Eigen/src/Core/BooleanRedux.h +154 -0
- data/ext/eigen/eigen3/Eigen/src/Core/CommaInitializer.h +154 -0
- data/ext/eigen/eigen3/Eigen/src/Core/CoreIterators.h +61 -0
- data/ext/eigen/eigen3/Eigen/src/Core/CwiseBinaryOp.h +230 -0
- data/ext/eigen/eigen3/Eigen/src/Core/CwiseNullaryOp.h +864 -0
- data/ext/eigen/eigen3/Eigen/src/Core/CwiseUnaryOp.h +126 -0
- data/ext/eigen/eigen3/Eigen/src/Core/CwiseUnaryView.h +139 -0
- data/ext/eigen/eigen3/Eigen/src/Core/DenseBase.h +521 -0
- data/ext/eigen/eigen3/Eigen/src/Core/DenseCoeffsBase.h +754 -0
- data/ext/eigen/eigen3/Eigen/src/Core/DenseStorage.h +434 -0
- data/ext/eigen/eigen3/Eigen/src/Core/Diagonal.h +237 -0
- data/ext/eigen/eigen3/Eigen/src/Core/DiagonalMatrix.h +313 -0
- data/ext/eigen/eigen3/Eigen/src/Core/DiagonalProduct.h +131 -0
- data/ext/eigen/eigen3/Eigen/src/Core/Dot.h +263 -0
- data/ext/eigen/eigen3/Eigen/src/Core/EigenBase.h +131 -0
- data/ext/eigen/eigen3/Eigen/src/Core/Flagged.h +140 -0
- data/ext/eigen/eigen3/Eigen/src/Core/ForceAlignedAccess.h +146 -0
- data/ext/eigen/eigen3/Eigen/src/Core/Functors.h +1026 -0
- data/ext/eigen/eigen3/Eigen/src/Core/Fuzzy.h +150 -0
- data/ext/eigen/eigen3/Eigen/src/Core/GeneralProduct.h +635 -0
- data/ext/eigen/eigen3/Eigen/src/Core/GenericPacketMath.h +350 -0
- data/ext/eigen/eigen3/Eigen/src/Core/GlobalFunctions.h +92 -0
- data/ext/eigen/eigen3/Eigen/src/Core/IO.h +250 -0
- data/ext/eigen/eigen3/Eigen/src/Core/Map.h +192 -0
- data/ext/eigen/eigen3/Eigen/src/Core/MapBase.h +247 -0
- data/ext/eigen/eigen3/Eigen/src/Core/MathFunctions.h +768 -0
- data/ext/eigen/eigen3/Eigen/src/Core/Matrix.h +420 -0
- data/ext/eigen/eigen3/Eigen/src/Core/MatrixBase.h +563 -0
- data/ext/eigen/eigen3/Eigen/src/Core/NestByValue.h +111 -0
- data/ext/eigen/eigen3/Eigen/src/Core/NoAlias.h +134 -0
- data/ext/eigen/eigen3/Eigen/src/Core/NumTraits.h +150 -0
- data/ext/eigen/eigen3/Eigen/src/Core/PermutationMatrix.h +721 -0
- data/ext/eigen/eigen3/Eigen/src/Core/PlainObjectBase.h +822 -0
- data/ext/eigen/eigen3/Eigen/src/Core/ProductBase.h +290 -0
- data/ext/eigen/eigen3/Eigen/src/Core/Random.h +152 -0
- data/ext/eigen/eigen3/Eigen/src/Core/Redux.h +409 -0
- data/ext/eigen/eigen3/Eigen/src/Core/Ref.h +278 -0
- data/ext/eigen/eigen3/Eigen/src/Core/Replicate.h +177 -0
- data/ext/eigen/eigen3/Eigen/src/Core/ReturnByValue.h +99 -0
- data/ext/eigen/eigen3/Eigen/src/Core/Reverse.h +224 -0
- data/ext/eigen/eigen3/Eigen/src/Core/Select.h +162 -0
- data/ext/eigen/eigen3/Eigen/src/Core/SelfAdjointView.h +314 -0
- data/ext/eigen/eigen3/Eigen/src/Core/SelfCwiseBinaryOp.h +191 -0
- data/ext/eigen/eigen3/Eigen/src/Core/SolveTriangular.h +260 -0
- data/ext/eigen/eigen3/Eigen/src/Core/StableNorm.h +203 -0
- data/ext/eigen/eigen3/Eigen/src/Core/Stride.h +108 -0
- data/ext/eigen/eigen3/Eigen/src/Core/Swap.h +126 -0
- data/ext/eigen/eigen3/Eigen/src/Core/Transpose.h +419 -0
- data/ext/eigen/eigen3/Eigen/src/Core/Transpositions.h +436 -0
- data/ext/eigen/eigen3/Eigen/src/Core/TriangularMatrix.h +839 -0
- data/ext/eigen/eigen3/Eigen/src/Core/VectorBlock.h +95 -0
- data/ext/eigen/eigen3/Eigen/src/Core/VectorwiseOp.h +642 -0
- data/ext/eigen/eigen3/Eigen/src/Core/Visitor.h +237 -0
- data/ext/eigen/eigen3/Eigen/src/Core/arch/AltiVec/Complex.h +217 -0
- data/ext/eigen/eigen3/Eigen/src/Core/arch/AltiVec/PacketMath.h +501 -0
- data/ext/eigen/eigen3/Eigen/src/Core/arch/Default/Settings.h +49 -0
- data/ext/eigen/eigen3/Eigen/src/Core/arch/NEON/Complex.h +253 -0
- data/ext/eigen/eigen3/Eigen/src/Core/arch/NEON/PacketMath.h +420 -0
- data/ext/eigen/eigen3/Eigen/src/Core/arch/SSE/Complex.h +442 -0
- data/ext/eigen/eigen3/Eigen/src/Core/arch/SSE/MathFunctions.h +475 -0
- data/ext/eigen/eigen3/Eigen/src/Core/arch/SSE/PacketMath.h +649 -0
- data/ext/eigen/eigen3/Eigen/src/Core/products/CoeffBasedProduct.h +476 -0
- data/ext/eigen/eigen3/Eigen/src/Core/products/GeneralBlockPanelKernel.h +1341 -0
- data/ext/eigen/eigen3/Eigen/src/Core/products/GeneralMatrixMatrix.h +427 -0
- data/ext/eigen/eigen3/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h +278 -0
- data/ext/eigen/eigen3/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_MKL.h +146 -0
- data/ext/eigen/eigen3/Eigen/src/Core/products/GeneralMatrixMatrix_MKL.h +118 -0
- data/ext/eigen/eigen3/Eigen/src/Core/products/GeneralMatrixVector.h +566 -0
- data/ext/eigen/eigen3/Eigen/src/Core/products/GeneralMatrixVector_MKL.h +131 -0
- data/ext/eigen/eigen3/Eigen/src/Core/products/Parallelizer.h +162 -0
- data/ext/eigen/eigen3/Eigen/src/Core/products/SelfadjointMatrixMatrix.h +436 -0
- data/ext/eigen/eigen3/Eigen/src/Core/products/SelfadjointMatrixMatrix_MKL.h +295 -0
- data/ext/eigen/eigen3/Eigen/src/Core/products/SelfadjointMatrixVector.h +281 -0
- data/ext/eigen/eigen3/Eigen/src/Core/products/SelfadjointMatrixVector_MKL.h +114 -0
- data/ext/eigen/eigen3/Eigen/src/Core/products/SelfadjointProduct.h +123 -0
- data/ext/eigen/eigen3/Eigen/src/Core/products/SelfadjointRank2Update.h +93 -0
- data/ext/eigen/eigen3/Eigen/src/Core/products/TriangularMatrixMatrix.h +427 -0
- data/ext/eigen/eigen3/Eigen/src/Core/products/TriangularMatrixMatrix_MKL.h +309 -0
- data/ext/eigen/eigen3/Eigen/src/Core/products/TriangularMatrixVector.h +348 -0
- data/ext/eigen/eigen3/Eigen/src/Core/products/TriangularMatrixVector_MKL.h +247 -0
- data/ext/eigen/eigen3/Eigen/src/Core/products/TriangularSolverMatrix.h +332 -0
- data/ext/eigen/eigen3/Eigen/src/Core/products/TriangularSolverMatrix_MKL.h +155 -0
- data/ext/eigen/eigen3/Eigen/src/Core/products/TriangularSolverVector.h +139 -0
- data/ext/eigen/eigen3/Eigen/src/Core/util/BlasUtil.h +264 -0
- data/ext/eigen/eigen3/Eigen/src/Core/util/Constants.h +451 -0
- data/ext/eigen/eigen3/Eigen/src/Core/util/DisableStupidWarnings.h +40 -0
- data/ext/eigen/eigen3/Eigen/src/Core/util/ForwardDeclarations.h +302 -0
- data/ext/eigen/eigen3/Eigen/src/Core/util/MKL_support.h +158 -0
- data/ext/eigen/eigen3/Eigen/src/Core/util/Macros.h +451 -0
- data/ext/eigen/eigen3/Eigen/src/Core/util/Memory.h +977 -0
- data/ext/eigen/eigen3/Eigen/src/Core/util/Meta.h +243 -0
- data/ext/eigen/eigen3/Eigen/src/Core/util/NonMPL2.h +3 -0
- data/ext/eigen/eigen3/Eigen/src/Core/util/ReenableStupidWarnings.h +14 -0
- data/ext/eigen/eigen3/Eigen/src/Core/util/StaticAssert.h +208 -0
- data/ext/eigen/eigen3/Eigen/src/Core/util/XprHelper.h +469 -0
- data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Block.h +126 -0
- data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Cwise.h +192 -0
- data/ext/eigen/eigen3/Eigen/src/Eigen2Support/CwiseOperators.h +298 -0
- data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/AlignedBox.h +159 -0
- data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/All.h +115 -0
- data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/AngleAxis.h +214 -0
- data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/Hyperplane.h +254 -0
- data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/ParametrizedLine.h +141 -0
- data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/Quaternion.h +495 -0
- data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/Rotation2D.h +145 -0
- data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/RotationBase.h +123 -0
- data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/Scaling.h +167 -0
- data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/Transform.h +786 -0
- data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/Translation.h +184 -0
- data/ext/eigen/eigen3/Eigen/src/Eigen2Support/LU.h +120 -0
- data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Lazy.h +71 -0
- data/ext/eigen/eigen3/Eigen/src/Eigen2Support/LeastSquares.h +169 -0
- data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Macros.h +20 -0
- data/ext/eigen/eigen3/Eigen/src/Eigen2Support/MathFunctions.h +57 -0
- data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Memory.h +45 -0
- data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Meta.h +75 -0
- data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Minor.h +117 -0
- data/ext/eigen/eigen3/Eigen/src/Eigen2Support/QR.h +67 -0
- data/ext/eigen/eigen3/Eigen/src/Eigen2Support/SVD.h +637 -0
- data/ext/eigen/eigen3/Eigen/src/Eigen2Support/TriangularSolver.h +42 -0
- data/ext/eigen/eigen3/Eigen/src/Eigen2Support/VectorBlock.h +94 -0
- data/ext/eigen/eigen3/Eigen/src/Eigenvalues/ComplexEigenSolver.h +341 -0
- data/ext/eigen/eigen3/Eigen/src/Eigenvalues/ComplexSchur.h +456 -0
- data/ext/eigen/eigen3/Eigen/src/Eigenvalues/ComplexSchur_MKL.h +94 -0
- data/ext/eigen/eigen3/Eigen/src/Eigenvalues/EigenSolver.h +607 -0
- data/ext/eigen/eigen3/Eigen/src/Eigenvalues/GeneralizedEigenSolver.h +350 -0
- data/ext/eigen/eigen3/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h +227 -0
- data/ext/eigen/eigen3/Eigen/src/Eigenvalues/HessenbergDecomposition.h +373 -0
- data/ext/eigen/eigen3/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h +160 -0
- data/ext/eigen/eigen3/Eigen/src/Eigenvalues/RealQZ.h +624 -0
- data/ext/eigen/eigen3/Eigen/src/Eigenvalues/RealSchur.h +525 -0
- data/ext/eigen/eigen3/Eigen/src/Eigenvalues/RealSchur_MKL.h +83 -0
- data/ext/eigen/eigen3/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h +801 -0
- data/ext/eigen/eigen3/Eigen/src/Eigenvalues/SelfAdjointEigenSolver_MKL.h +92 -0
- data/ext/eigen/eigen3/Eigen/src/Eigenvalues/Tridiagonalization.h +557 -0
- data/ext/eigen/eigen3/Eigen/src/Geometry/AlignedBox.h +392 -0
- data/ext/eigen/eigen3/Eigen/src/Geometry/AngleAxis.h +233 -0
- data/ext/eigen/eigen3/Eigen/src/Geometry/EulerAngles.h +104 -0
- data/ext/eigen/eigen3/Eigen/src/Geometry/Homogeneous.h +307 -0
- data/ext/eigen/eigen3/Eigen/src/Geometry/Hyperplane.h +280 -0
- data/ext/eigen/eigen3/Eigen/src/Geometry/OrthoMethods.h +218 -0
- data/ext/eigen/eigen3/Eigen/src/Geometry/ParametrizedLine.h +195 -0
- data/ext/eigen/eigen3/Eigen/src/Geometry/Quaternion.h +776 -0
- data/ext/eigen/eigen3/Eigen/src/Geometry/Rotation2D.h +160 -0
- data/ext/eigen/eigen3/Eigen/src/Geometry/RotationBase.h +206 -0
- data/ext/eigen/eigen3/Eigen/src/Geometry/Scaling.h +166 -0
- data/ext/eigen/eigen3/Eigen/src/Geometry/Transform.h +1455 -0
- data/ext/eigen/eigen3/Eigen/src/Geometry/Translation.h +206 -0
- data/ext/eigen/eigen3/Eigen/src/Geometry/Umeyama.h +177 -0
- data/ext/eigen/eigen3/Eigen/src/Geometry/arch/Geometry_SSE.h +115 -0
- data/ext/eigen/eigen3/Eigen/src/Householder/BlockHouseholder.h +68 -0
- data/ext/eigen/eigen3/Eigen/src/Householder/Householder.h +171 -0
- data/ext/eigen/eigen3/Eigen/src/Householder/HouseholderSequence.h +441 -0
- data/ext/eigen/eigen3/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h +149 -0
- data/ext/eigen/eigen3/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h +263 -0
- data/ext/eigen/eigen3/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h +256 -0
- data/ext/eigen/eigen3/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h +282 -0
- data/ext/eigen/eigen3/Eigen/src/Jacobi/Jacobi.h +433 -0
- data/ext/eigen/eigen3/Eigen/src/LU/Determinant.h +101 -0
- data/ext/eigen/eigen3/Eigen/src/LU/FullPivLU.h +751 -0
- data/ext/eigen/eigen3/Eigen/src/LU/Inverse.h +400 -0
- data/ext/eigen/eigen3/Eigen/src/LU/PartialPivLU.h +509 -0
- data/ext/eigen/eigen3/Eigen/src/LU/PartialPivLU_MKL.h +85 -0
- data/ext/eigen/eigen3/Eigen/src/LU/arch/Inverse_SSE.h +329 -0
- data/ext/eigen/eigen3/Eigen/src/MetisSupport/MetisSupport.h +137 -0
- data/ext/eigen/eigen3/Eigen/src/OrderingMethods/Amd.h +444 -0
- data/ext/eigen/eigen3/Eigen/src/OrderingMethods/Eigen_Colamd.h +1850 -0
- data/ext/eigen/eigen3/Eigen/src/PaStiXSupport/PaStiXSupport.h +721 -0
- data/ext/eigen/eigen3/Eigen/src/PardisoSupport/PardisoSupport.h +592 -0
- data/ext/eigen/eigen3/Eigen/src/QR/ColPivHouseholderQR.h +580 -0
- data/ext/eigen/eigen3/Eigen/src/QR/ColPivHouseholderQR_MKL.h +99 -0
- data/ext/eigen/eigen3/Eigen/src/QR/FullPivHouseholderQR.h +622 -0
- data/ext/eigen/eigen3/Eigen/src/QR/HouseholderQR.h +388 -0
- data/ext/eigen/eigen3/Eigen/src/QR/HouseholderQR_MKL.h +71 -0
- data/ext/eigen/eigen3/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h +338 -0
- data/ext/eigen/eigen3/Eigen/src/SVD/JacobiSVD.h +976 -0
- data/ext/eigen/eigen3/Eigen/src/SVD/JacobiSVD_MKL.h +92 -0
- data/ext/eigen/eigen3/Eigen/src/SVD/UpperBidiagonalization.h +148 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCholesky/SimplicialCholesky.h +671 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h +199 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCore/AmbiVector.h +373 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCore/CompressedStorage.h +233 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h +245 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCore/MappedSparseMatrix.h +181 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseBlock.h +537 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseColEtree.h +206 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseCwiseBinaryOp.h +325 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseCwiseUnaryOp.h +163 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseDenseProduct.h +311 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseDiagonalProduct.h +196 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseDot.h +101 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseFuzzy.h +26 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseMatrix.h +1262 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseMatrixBase.h +461 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCore/SparsePermutation.h +148 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseProduct.h +188 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseRedux.h +45 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseSelfAdjointView.h +507 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseSparseProductWithPruning.h +150 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseTranspose.h +63 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseTriangularView.h +179 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseUtil.h +172 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseVector.h +448 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseView.h +99 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCore/TriangularSolver.h +334 -0
- data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU.h +806 -0
- data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLUImpl.h +66 -0
- data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_Memory.h +227 -0
- data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_Structs.h +111 -0
- data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h +298 -0
- data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_Utils.h +80 -0
- data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_column_bmod.h +180 -0
- data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_column_dfs.h +177 -0
- data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_copy_to_ucol.h +106 -0
- data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_gemm_kernel.h +279 -0
- data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_heap_relax_snode.h +127 -0
- data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_kernel_bmod.h +130 -0
- data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_panel_bmod.h +223 -0
- data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_panel_dfs.h +258 -0
- data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_pivotL.h +137 -0
- data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_pruneL.h +135 -0
- data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_relax_snode.h +83 -0
- data/ext/eigen/eigen3/Eigen/src/SparseQR/SparseQR.h +714 -0
- data/ext/eigen/eigen3/Eigen/src/StlSupport/StdDeque.h +134 -0
- data/ext/eigen/eigen3/Eigen/src/StlSupport/StdList.h +114 -0
- data/ext/eigen/eigen3/Eigen/src/StlSupport/StdVector.h +126 -0
- data/ext/eigen/eigen3/Eigen/src/StlSupport/details.h +84 -0
- data/ext/eigen/eigen3/Eigen/src/SuperLUSupport/SuperLUSupport.h +1026 -0
- data/ext/eigen/eigen3/Eigen/src/UmfPackSupport/UmfPackSupport.h +474 -0
- data/ext/eigen/eigen3/Eigen/src/misc/Image.h +84 -0
- data/ext/eigen/eigen3/Eigen/src/misc/Kernel.h +81 -0
- data/ext/eigen/eigen3/Eigen/src/misc/Solve.h +76 -0
- data/ext/eigen/eigen3/Eigen/src/misc/SparseSolve.h +128 -0
- data/ext/eigen/eigen3/Eigen/src/misc/blas.h +658 -0
- data/ext/eigen/eigen3/Eigen/src/plugins/ArrayCwiseBinaryOps.h +253 -0
- data/ext/eigen/eigen3/Eigen/src/plugins/ArrayCwiseUnaryOps.h +187 -0
- data/ext/eigen/eigen3/Eigen/src/plugins/BlockMethods.h +935 -0
- data/ext/eigen/eigen3/Eigen/src/plugins/CommonCwiseBinaryOps.h +46 -0
- data/ext/eigen/eigen3/Eigen/src/plugins/CommonCwiseUnaryOps.h +172 -0
- data/ext/eigen/eigen3/Eigen/src/plugins/MatrixCwiseBinaryOps.h +143 -0
- data/ext/eigen/eigen3/Eigen/src/plugins/MatrixCwiseUnaryOps.h +52 -0
- data/ext/eigen/eigen3/signature_of_eigen3_matrix_library +1 -0
- data/ext/eigen/eigen_wrap.cxx +19420 -10396
- data/ext/eigen/extconf.rb +37 -2
- data/lib/eigen.rb +146 -3
- metadata +294 -7
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// This file is part of Eigen, a lightweight C++ template library
|
|
2
|
+
// for linear algebra.
|
|
3
|
+
//
|
|
4
|
+
// Copyright (C) 2011 Benoit Jacob <jacob.benoit.1@gmail.com>
|
|
5
|
+
//
|
|
6
|
+
// This Source Code Form is subject to the terms of the Mozilla
|
|
7
|
+
// Public License v. 2.0. If a copy of the MPL was not distributed
|
|
8
|
+
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
9
|
+
|
|
10
|
+
#ifndef EIGEN2_MACROS_H
|
|
11
|
+
#define EIGEN2_MACROS_H
|
|
12
|
+
|
|
13
|
+
#define ei_assert eigen_assert
|
|
14
|
+
#define ei_internal_assert eigen_internal_assert
|
|
15
|
+
|
|
16
|
+
#define EIGEN_ALIGN_128 EIGEN_ALIGN16
|
|
17
|
+
|
|
18
|
+
#define EIGEN_ARCH_WANTS_ALIGNMENT EIGEN_ALIGN_STATICALLY
|
|
19
|
+
|
|
20
|
+
#endif // EIGEN2_MACROS_H
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
// This file is part of Eigen, a lightweight C++ template library
|
|
2
|
+
// for linear algebra.
|
|
3
|
+
//
|
|
4
|
+
// Copyright (C) 2010 Gael Guennebaud <gael.guennebaud@inria.fr>
|
|
5
|
+
//
|
|
6
|
+
// This Source Code Form is subject to the terms of the Mozilla
|
|
7
|
+
// Public License v. 2.0. If a copy of the MPL was not distributed
|
|
8
|
+
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
9
|
+
|
|
10
|
+
#ifndef EIGEN2_MATH_FUNCTIONS_H
|
|
11
|
+
#define EIGEN2_MATH_FUNCTIONS_H
|
|
12
|
+
|
|
13
|
+
namespace Eigen {
|
|
14
|
+
|
|
15
|
+
template<typename T> inline typename NumTraits<T>::Real ei_real(const T& x) { return numext::real(x); }
|
|
16
|
+
template<typename T> inline typename NumTraits<T>::Real ei_imag(const T& x) { return numext::imag(x); }
|
|
17
|
+
template<typename T> inline T ei_conj(const T& x) { return numext::conj(x); }
|
|
18
|
+
template<typename T> inline typename NumTraits<T>::Real ei_abs (const T& x) { using std::abs; return abs(x); }
|
|
19
|
+
template<typename T> inline typename NumTraits<T>::Real ei_abs2(const T& x) { return numext::abs2(x); }
|
|
20
|
+
template<typename T> inline T ei_sqrt(const T& x) { using std::sqrt; return sqrt(x); }
|
|
21
|
+
template<typename T> inline T ei_exp (const T& x) { using std::exp; return exp(x); }
|
|
22
|
+
template<typename T> inline T ei_log (const T& x) { using std::log; return log(x); }
|
|
23
|
+
template<typename T> inline T ei_sin (const T& x) { using std::sin; return sin(x); }
|
|
24
|
+
template<typename T> inline T ei_cos (const T& x) { using std::cos; return cos(x); }
|
|
25
|
+
template<typename T> inline T ei_atan2(const T& x,const T& y) { using std::atan2; return atan2(x,y); }
|
|
26
|
+
template<typename T> inline T ei_pow (const T& x,const T& y) { return numext::pow(x,y); }
|
|
27
|
+
template<typename T> inline T ei_random () { return internal::random<T>(); }
|
|
28
|
+
template<typename T> inline T ei_random (const T& x, const T& y) { return internal::random(x, y); }
|
|
29
|
+
|
|
30
|
+
template<typename T> inline T precision () { return NumTraits<T>::dummy_precision(); }
|
|
31
|
+
template<typename T> inline T machine_epsilon () { return NumTraits<T>::epsilon(); }
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
template<typename Scalar, typename OtherScalar>
|
|
35
|
+
inline bool ei_isMuchSmallerThan(const Scalar& x, const OtherScalar& y,
|
|
36
|
+
typename NumTraits<Scalar>::Real precision = NumTraits<Scalar>::dummy_precision())
|
|
37
|
+
{
|
|
38
|
+
return internal::isMuchSmallerThan(x, y, precision);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
template<typename Scalar>
|
|
42
|
+
inline bool ei_isApprox(const Scalar& x, const Scalar& y,
|
|
43
|
+
typename NumTraits<Scalar>::Real precision = NumTraits<Scalar>::dummy_precision())
|
|
44
|
+
{
|
|
45
|
+
return internal::isApprox(x, y, precision);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
template<typename Scalar>
|
|
49
|
+
inline bool ei_isApproxOrLessThan(const Scalar& x, const Scalar& y,
|
|
50
|
+
typename NumTraits<Scalar>::Real precision = NumTraits<Scalar>::dummy_precision())
|
|
51
|
+
{
|
|
52
|
+
return internal::isApproxOrLessThan(x, y, precision);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
} // end namespace Eigen
|
|
56
|
+
|
|
57
|
+
#endif // EIGEN2_MATH_FUNCTIONS_H
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// This file is part of Eigen, a lightweight C++ template library
|
|
2
|
+
// for linear algebra.
|
|
3
|
+
//
|
|
4
|
+
// Copyright (C) 2011 Benoit Jacob <jacob.benoit.1@gmail.com>
|
|
5
|
+
//
|
|
6
|
+
// This Source Code Form is subject to the terms of the Mozilla
|
|
7
|
+
// Public License v. 2.0. If a copy of the MPL was not distributed
|
|
8
|
+
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
9
|
+
|
|
10
|
+
#ifndef EIGEN2_MEMORY_H
|
|
11
|
+
#define EIGEN2_MEMORY_H
|
|
12
|
+
|
|
13
|
+
namespace Eigen {
|
|
14
|
+
|
|
15
|
+
inline void* ei_aligned_malloc(size_t size) { return internal::aligned_malloc(size); }
|
|
16
|
+
inline void ei_aligned_free(void *ptr) { internal::aligned_free(ptr); }
|
|
17
|
+
inline void* ei_aligned_realloc(void *ptr, size_t new_size, size_t old_size) { return internal::aligned_realloc(ptr, new_size, old_size); }
|
|
18
|
+
inline void* ei_handmade_aligned_malloc(size_t size) { return internal::handmade_aligned_malloc(size); }
|
|
19
|
+
inline void ei_handmade_aligned_free(void *ptr) { internal::handmade_aligned_free(ptr); }
|
|
20
|
+
|
|
21
|
+
template<bool Align> inline void* ei_conditional_aligned_malloc(size_t size)
|
|
22
|
+
{
|
|
23
|
+
return internal::conditional_aligned_malloc<Align>(size);
|
|
24
|
+
}
|
|
25
|
+
template<bool Align> inline void ei_conditional_aligned_free(void *ptr)
|
|
26
|
+
{
|
|
27
|
+
internal::conditional_aligned_free<Align>(ptr);
|
|
28
|
+
}
|
|
29
|
+
template<bool Align> inline void* ei_conditional_aligned_realloc(void* ptr, size_t new_size, size_t old_size)
|
|
30
|
+
{
|
|
31
|
+
return internal::conditional_aligned_realloc<Align>(ptr, new_size, old_size);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
template<typename T> inline T* ei_aligned_new(size_t size)
|
|
35
|
+
{
|
|
36
|
+
return internal::aligned_new<T>(size);
|
|
37
|
+
}
|
|
38
|
+
template<typename T> inline void ei_aligned_delete(T *ptr, size_t size)
|
|
39
|
+
{
|
|
40
|
+
return internal::aligned_delete(ptr, size);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
} // end namespace Eigen
|
|
44
|
+
|
|
45
|
+
#endif // EIGEN2_MACROS_H
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
// This file is part of Eigen, a lightweight C++ template library
|
|
2
|
+
// for linear algebra.
|
|
3
|
+
//
|
|
4
|
+
// Copyright (C) 2011 Benoit Jacob <jacob.benoit.1@gmail.com>
|
|
5
|
+
//
|
|
6
|
+
// This Source Code Form is subject to the terms of the Mozilla
|
|
7
|
+
// Public License v. 2.0. If a copy of the MPL was not distributed
|
|
8
|
+
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
9
|
+
|
|
10
|
+
#ifndef EIGEN2_META_H
|
|
11
|
+
#define EIGEN2_META_H
|
|
12
|
+
|
|
13
|
+
namespace Eigen {
|
|
14
|
+
|
|
15
|
+
template<typename T>
|
|
16
|
+
struct ei_traits : internal::traits<T>
|
|
17
|
+
{};
|
|
18
|
+
|
|
19
|
+
struct ei_meta_true { enum { ret = 1 }; };
|
|
20
|
+
struct ei_meta_false { enum { ret = 0 }; };
|
|
21
|
+
|
|
22
|
+
template<bool Condition, typename Then, typename Else>
|
|
23
|
+
struct ei_meta_if { typedef Then ret; };
|
|
24
|
+
|
|
25
|
+
template<typename Then, typename Else>
|
|
26
|
+
struct ei_meta_if <false, Then, Else> { typedef Else ret; };
|
|
27
|
+
|
|
28
|
+
template<typename T, typename U> struct ei_is_same_type { enum { ret = 0 }; };
|
|
29
|
+
template<typename T> struct ei_is_same_type<T,T> { enum { ret = 1 }; };
|
|
30
|
+
|
|
31
|
+
template<typename T> struct ei_unref { typedef T type; };
|
|
32
|
+
template<typename T> struct ei_unref<T&> { typedef T type; };
|
|
33
|
+
|
|
34
|
+
template<typename T> struct ei_unpointer { typedef T type; };
|
|
35
|
+
template<typename T> struct ei_unpointer<T*> { typedef T type; };
|
|
36
|
+
template<typename T> struct ei_unpointer<T*const> { typedef T type; };
|
|
37
|
+
|
|
38
|
+
template<typename T> struct ei_unconst { typedef T type; };
|
|
39
|
+
template<typename T> struct ei_unconst<const T> { typedef T type; };
|
|
40
|
+
template<typename T> struct ei_unconst<T const &> { typedef T & type; };
|
|
41
|
+
template<typename T> struct ei_unconst<T const *> { typedef T * type; };
|
|
42
|
+
|
|
43
|
+
template<typename T> struct ei_cleantype { typedef T type; };
|
|
44
|
+
template<typename T> struct ei_cleantype<const T> { typedef typename ei_cleantype<T>::type type; };
|
|
45
|
+
template<typename T> struct ei_cleantype<const T&> { typedef typename ei_cleantype<T>::type type; };
|
|
46
|
+
template<typename T> struct ei_cleantype<T&> { typedef typename ei_cleantype<T>::type type; };
|
|
47
|
+
template<typename T> struct ei_cleantype<const T*> { typedef typename ei_cleantype<T>::type type; };
|
|
48
|
+
template<typename T> struct ei_cleantype<T*> { typedef typename ei_cleantype<T>::type type; };
|
|
49
|
+
|
|
50
|
+
/** \internal In short, it computes int(sqrt(\a Y)) with \a Y an integer.
|
|
51
|
+
* Usage example: \code ei_meta_sqrt<1023>::ret \endcode
|
|
52
|
+
*/
|
|
53
|
+
template<int Y,
|
|
54
|
+
int InfX = 0,
|
|
55
|
+
int SupX = ((Y==1) ? 1 : Y/2),
|
|
56
|
+
bool Done = ((SupX-InfX)<=1 ? true : ((SupX*SupX <= Y) && ((SupX+1)*(SupX+1) > Y))) >
|
|
57
|
+
// use ?: instead of || just to shut up a stupid gcc 4.3 warning
|
|
58
|
+
class ei_meta_sqrt
|
|
59
|
+
{
|
|
60
|
+
enum {
|
|
61
|
+
MidX = (InfX+SupX)/2,
|
|
62
|
+
TakeInf = MidX*MidX > Y ? 1 : 0,
|
|
63
|
+
NewInf = int(TakeInf) ? InfX : int(MidX),
|
|
64
|
+
NewSup = int(TakeInf) ? int(MidX) : SupX
|
|
65
|
+
};
|
|
66
|
+
public:
|
|
67
|
+
enum { ret = ei_meta_sqrt<Y,NewInf,NewSup>::ret };
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
template<int Y, int InfX, int SupX>
|
|
71
|
+
class ei_meta_sqrt<Y, InfX, SupX, true> { public: enum { ret = (SupX*SupX <= Y) ? SupX : InfX }; };
|
|
72
|
+
|
|
73
|
+
} // end namespace Eigen
|
|
74
|
+
|
|
75
|
+
#endif // EIGEN2_META_H
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
// This file is part of Eigen, a lightweight C++ template library
|
|
2
|
+
// for linear algebra.
|
|
3
|
+
//
|
|
4
|
+
// Copyright (C) 2006-2009 Benoit Jacob <jacob.benoit.1@gmail.com>
|
|
5
|
+
//
|
|
6
|
+
// This Source Code Form is subject to the terms of the Mozilla
|
|
7
|
+
// Public License v. 2.0. If a copy of the MPL was not distributed
|
|
8
|
+
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
9
|
+
|
|
10
|
+
#ifndef EIGEN_MINOR_H
|
|
11
|
+
#define EIGEN_MINOR_H
|
|
12
|
+
|
|
13
|
+
namespace Eigen {
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* \class Minor
|
|
17
|
+
*
|
|
18
|
+
* \brief Expression of a minor
|
|
19
|
+
*
|
|
20
|
+
* \param MatrixType the type of the object in which we are taking a minor
|
|
21
|
+
*
|
|
22
|
+
* This class represents an expression of a minor. It is the return
|
|
23
|
+
* type of MatrixBase::minor() and most of the time this is the only way it
|
|
24
|
+
* is used.
|
|
25
|
+
*
|
|
26
|
+
* \sa MatrixBase::minor()
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
namespace internal {
|
|
30
|
+
template<typename MatrixType>
|
|
31
|
+
struct traits<Minor<MatrixType> >
|
|
32
|
+
: traits<MatrixType>
|
|
33
|
+
{
|
|
34
|
+
typedef typename nested<MatrixType>::type MatrixTypeNested;
|
|
35
|
+
typedef typename remove_reference<MatrixTypeNested>::type _MatrixTypeNested;
|
|
36
|
+
typedef typename MatrixType::StorageKind StorageKind;
|
|
37
|
+
enum {
|
|
38
|
+
RowsAtCompileTime = (MatrixType::RowsAtCompileTime != Dynamic) ?
|
|
39
|
+
int(MatrixType::RowsAtCompileTime) - 1 : Dynamic,
|
|
40
|
+
ColsAtCompileTime = (MatrixType::ColsAtCompileTime != Dynamic) ?
|
|
41
|
+
int(MatrixType::ColsAtCompileTime) - 1 : Dynamic,
|
|
42
|
+
MaxRowsAtCompileTime = (MatrixType::MaxRowsAtCompileTime != Dynamic) ?
|
|
43
|
+
int(MatrixType::MaxRowsAtCompileTime) - 1 : Dynamic,
|
|
44
|
+
MaxColsAtCompileTime = (MatrixType::MaxColsAtCompileTime != Dynamic) ?
|
|
45
|
+
int(MatrixType::MaxColsAtCompileTime) - 1 : Dynamic,
|
|
46
|
+
Flags = _MatrixTypeNested::Flags & (HereditaryBits | LvalueBit),
|
|
47
|
+
CoeffReadCost = _MatrixTypeNested::CoeffReadCost // minor is used typically on tiny matrices,
|
|
48
|
+
// where loops are unrolled and the 'if' evaluates at compile time
|
|
49
|
+
};
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
template<typename MatrixType> class Minor
|
|
54
|
+
: public MatrixBase<Minor<MatrixType> >
|
|
55
|
+
{
|
|
56
|
+
public:
|
|
57
|
+
|
|
58
|
+
typedef MatrixBase<Minor> Base;
|
|
59
|
+
EIGEN_DENSE_PUBLIC_INTERFACE(Minor)
|
|
60
|
+
|
|
61
|
+
inline Minor(const MatrixType& matrix,
|
|
62
|
+
Index row, Index col)
|
|
63
|
+
: m_matrix(matrix), m_row(row), m_col(col)
|
|
64
|
+
{
|
|
65
|
+
eigen_assert(row >= 0 && row < matrix.rows()
|
|
66
|
+
&& col >= 0 && col < matrix.cols());
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Minor)
|
|
70
|
+
|
|
71
|
+
inline Index rows() const { return m_matrix.rows() - 1; }
|
|
72
|
+
inline Index cols() const { return m_matrix.cols() - 1; }
|
|
73
|
+
|
|
74
|
+
inline Scalar& coeffRef(Index row, Index col)
|
|
75
|
+
{
|
|
76
|
+
return m_matrix.const_cast_derived().coeffRef(row + (row >= m_row), col + (col >= m_col));
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
inline const Scalar coeff(Index row, Index col) const
|
|
80
|
+
{
|
|
81
|
+
return m_matrix.coeff(row + (row >= m_row), col + (col >= m_col));
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
protected:
|
|
85
|
+
const typename MatrixType::Nested m_matrix;
|
|
86
|
+
const Index m_row, m_col;
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* \return an expression of the (\a row, \a col)-minor of *this,
|
|
91
|
+
* i.e. an expression constructed from *this by removing the specified
|
|
92
|
+
* row and column.
|
|
93
|
+
*
|
|
94
|
+
* Example: \include MatrixBase_minor.cpp
|
|
95
|
+
* Output: \verbinclude MatrixBase_minor.out
|
|
96
|
+
*
|
|
97
|
+
* \sa class Minor
|
|
98
|
+
*/
|
|
99
|
+
template<typename Derived>
|
|
100
|
+
inline Minor<Derived>
|
|
101
|
+
MatrixBase<Derived>::minor(Index row, Index col)
|
|
102
|
+
{
|
|
103
|
+
return Minor<Derived>(derived(), row, col);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* This is the const version of minor(). */
|
|
108
|
+
template<typename Derived>
|
|
109
|
+
inline const Minor<Derived>
|
|
110
|
+
MatrixBase<Derived>::minor(Index row, Index col) const
|
|
111
|
+
{
|
|
112
|
+
return Minor<Derived>(derived(), row, col);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
} // end namespace Eigen
|
|
116
|
+
|
|
117
|
+
#endif // EIGEN_MINOR_H
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// This file is part of Eigen, a lightweight C++ template library
|
|
2
|
+
// for linear algebra.
|
|
3
|
+
//
|
|
4
|
+
// Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr>
|
|
5
|
+
// Copyright (C) 2011 Benoit Jacob <jacob.benoit.1@gmail.com>
|
|
6
|
+
//
|
|
7
|
+
// This Source Code Form is subject to the terms of the Mozilla
|
|
8
|
+
// Public License v. 2.0. If a copy of the MPL was not distributed
|
|
9
|
+
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
10
|
+
|
|
11
|
+
#ifndef EIGEN2_QR_H
|
|
12
|
+
#define EIGEN2_QR_H
|
|
13
|
+
|
|
14
|
+
namespace Eigen {
|
|
15
|
+
|
|
16
|
+
template<typename MatrixType>
|
|
17
|
+
class QR : public HouseholderQR<MatrixType>
|
|
18
|
+
{
|
|
19
|
+
public:
|
|
20
|
+
|
|
21
|
+
typedef HouseholderQR<MatrixType> Base;
|
|
22
|
+
typedef Block<const MatrixType, MatrixType::ColsAtCompileTime, MatrixType::ColsAtCompileTime> MatrixRBlockType;
|
|
23
|
+
|
|
24
|
+
QR() : Base() {}
|
|
25
|
+
|
|
26
|
+
template<typename T>
|
|
27
|
+
explicit QR(const T& t) : Base(t) {}
|
|
28
|
+
|
|
29
|
+
template<typename OtherDerived, typename ResultType>
|
|
30
|
+
bool solve(const MatrixBase<OtherDerived>& b, ResultType *result) const
|
|
31
|
+
{
|
|
32
|
+
*result = static_cast<const Base*>(this)->solve(b);
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
MatrixType matrixQ(void) const {
|
|
37
|
+
MatrixType ret = MatrixType::Identity(this->rows(), this->cols());
|
|
38
|
+
ret = this->householderQ() * ret;
|
|
39
|
+
return ret;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
bool isFullRank() const {
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const TriangularView<MatrixRBlockType, UpperTriangular>
|
|
47
|
+
matrixR(void) const
|
|
48
|
+
{
|
|
49
|
+
int cols = this->cols();
|
|
50
|
+
return MatrixRBlockType(this->matrixQR(), 0, 0, cols, cols).template triangularView<UpperTriangular>();
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
/** \return the QR decomposition of \c *this.
|
|
55
|
+
*
|
|
56
|
+
* \sa class QR
|
|
57
|
+
*/
|
|
58
|
+
template<typename Derived>
|
|
59
|
+
const QR<typename MatrixBase<Derived>::PlainObject>
|
|
60
|
+
MatrixBase<Derived>::qr() const
|
|
61
|
+
{
|
|
62
|
+
return QR<PlainObject>(eval());
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
} // end namespace Eigen
|
|
66
|
+
|
|
67
|
+
#endif // EIGEN2_QR_H
|
|
@@ -0,0 +1,637 @@
|
|
|
1
|
+
// This file is part of Eigen, a lightweight C++ template library
|
|
2
|
+
// for linear algebra.
|
|
3
|
+
//
|
|
4
|
+
// Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr>
|
|
5
|
+
//
|
|
6
|
+
// This Source Code Form is subject to the terms of the Mozilla
|
|
7
|
+
// Public License v. 2.0. If a copy of the MPL was not distributed
|
|
8
|
+
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
9
|
+
|
|
10
|
+
#ifndef EIGEN2_SVD_H
|
|
11
|
+
#define EIGEN2_SVD_H
|
|
12
|
+
|
|
13
|
+
namespace Eigen {
|
|
14
|
+
|
|
15
|
+
/** \ingroup SVD_Module
|
|
16
|
+
* \nonstableyet
|
|
17
|
+
*
|
|
18
|
+
* \class SVD
|
|
19
|
+
*
|
|
20
|
+
* \brief Standard SVD decomposition of a matrix and associated features
|
|
21
|
+
*
|
|
22
|
+
* \param MatrixType the type of the matrix of which we are computing the SVD decomposition
|
|
23
|
+
*
|
|
24
|
+
* This class performs a standard SVD decomposition of a real matrix A of size \c M x \c N
|
|
25
|
+
* with \c M \>= \c N.
|
|
26
|
+
*
|
|
27
|
+
*
|
|
28
|
+
* \sa MatrixBase::SVD()
|
|
29
|
+
*/
|
|
30
|
+
template<typename MatrixType> class SVD
|
|
31
|
+
{
|
|
32
|
+
private:
|
|
33
|
+
typedef typename MatrixType::Scalar Scalar;
|
|
34
|
+
typedef typename NumTraits<typename MatrixType::Scalar>::Real RealScalar;
|
|
35
|
+
|
|
36
|
+
enum {
|
|
37
|
+
PacketSize = internal::packet_traits<Scalar>::size,
|
|
38
|
+
AlignmentMask = int(PacketSize)-1,
|
|
39
|
+
MinSize = EIGEN_SIZE_MIN_PREFER_DYNAMIC(MatrixType::RowsAtCompileTime, MatrixType::ColsAtCompileTime)
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> ColVector;
|
|
43
|
+
typedef Matrix<Scalar, MatrixType::ColsAtCompileTime, 1> RowVector;
|
|
44
|
+
|
|
45
|
+
typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, MinSize> MatrixUType;
|
|
46
|
+
typedef Matrix<Scalar, MatrixType::ColsAtCompileTime, MatrixType::ColsAtCompileTime> MatrixVType;
|
|
47
|
+
typedef Matrix<Scalar, MinSize, 1> SingularValuesType;
|
|
48
|
+
|
|
49
|
+
public:
|
|
50
|
+
|
|
51
|
+
SVD() {} // a user who relied on compiler-generated default compiler reported problems with MSVC in 2.0.7
|
|
52
|
+
|
|
53
|
+
SVD(const MatrixType& matrix)
|
|
54
|
+
: m_matU(matrix.rows(), (std::min)(matrix.rows(), matrix.cols())),
|
|
55
|
+
m_matV(matrix.cols(),matrix.cols()),
|
|
56
|
+
m_sigma((std::min)(matrix.rows(),matrix.cols()))
|
|
57
|
+
{
|
|
58
|
+
compute(matrix);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
template<typename OtherDerived, typename ResultType>
|
|
62
|
+
bool solve(const MatrixBase<OtherDerived> &b, ResultType* result) const;
|
|
63
|
+
|
|
64
|
+
const MatrixUType& matrixU() const { return m_matU; }
|
|
65
|
+
const SingularValuesType& singularValues() const { return m_sigma; }
|
|
66
|
+
const MatrixVType& matrixV() const { return m_matV; }
|
|
67
|
+
|
|
68
|
+
void compute(const MatrixType& matrix);
|
|
69
|
+
SVD& sort();
|
|
70
|
+
|
|
71
|
+
template<typename UnitaryType, typename PositiveType>
|
|
72
|
+
void computeUnitaryPositive(UnitaryType *unitary, PositiveType *positive) const;
|
|
73
|
+
template<typename PositiveType, typename UnitaryType>
|
|
74
|
+
void computePositiveUnitary(PositiveType *positive, UnitaryType *unitary) const;
|
|
75
|
+
template<typename RotationType, typename ScalingType>
|
|
76
|
+
void computeRotationScaling(RotationType *unitary, ScalingType *positive) const;
|
|
77
|
+
template<typename ScalingType, typename RotationType>
|
|
78
|
+
void computeScalingRotation(ScalingType *positive, RotationType *unitary) const;
|
|
79
|
+
|
|
80
|
+
protected:
|
|
81
|
+
/** \internal */
|
|
82
|
+
MatrixUType m_matU;
|
|
83
|
+
/** \internal */
|
|
84
|
+
MatrixVType m_matV;
|
|
85
|
+
/** \internal */
|
|
86
|
+
SingularValuesType m_sigma;
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
/** Computes / recomputes the SVD decomposition A = U S V^* of \a matrix
|
|
90
|
+
*
|
|
91
|
+
* \note this code has been adapted from JAMA (public domain)
|
|
92
|
+
*/
|
|
93
|
+
template<typename MatrixType>
|
|
94
|
+
void SVD<MatrixType>::compute(const MatrixType& matrix)
|
|
95
|
+
{
|
|
96
|
+
const int m = matrix.rows();
|
|
97
|
+
const int n = matrix.cols();
|
|
98
|
+
const int nu = (std::min)(m,n);
|
|
99
|
+
ei_assert(m>=n && "In Eigen 2.0, SVD only works for MxN matrices with M>=N. Sorry!");
|
|
100
|
+
ei_assert(m>1 && "In Eigen 2.0, SVD doesn't work on 1x1 matrices");
|
|
101
|
+
|
|
102
|
+
m_matU.resize(m, nu);
|
|
103
|
+
m_matU.setZero();
|
|
104
|
+
m_sigma.resize((std::min)(m,n));
|
|
105
|
+
m_matV.resize(n,n);
|
|
106
|
+
|
|
107
|
+
RowVector e(n);
|
|
108
|
+
ColVector work(m);
|
|
109
|
+
MatrixType matA(matrix);
|
|
110
|
+
const bool wantu = true;
|
|
111
|
+
const bool wantv = true;
|
|
112
|
+
int i=0, j=0, k=0;
|
|
113
|
+
|
|
114
|
+
// Reduce A to bidiagonal form, storing the diagonal elements
|
|
115
|
+
// in s and the super-diagonal elements in e.
|
|
116
|
+
int nct = (std::min)(m-1,n);
|
|
117
|
+
int nrt = (std::max)(0,(std::min)(n-2,m));
|
|
118
|
+
for (k = 0; k < (std::max)(nct,nrt); ++k)
|
|
119
|
+
{
|
|
120
|
+
if (k < nct)
|
|
121
|
+
{
|
|
122
|
+
// Compute the transformation for the k-th column and
|
|
123
|
+
// place the k-th diagonal in m_sigma[k].
|
|
124
|
+
m_sigma[k] = matA.col(k).end(m-k).norm();
|
|
125
|
+
if (m_sigma[k] != 0.0) // FIXME
|
|
126
|
+
{
|
|
127
|
+
if (matA(k,k) < 0.0)
|
|
128
|
+
m_sigma[k] = -m_sigma[k];
|
|
129
|
+
matA.col(k).end(m-k) /= m_sigma[k];
|
|
130
|
+
matA(k,k) += 1.0;
|
|
131
|
+
}
|
|
132
|
+
m_sigma[k] = -m_sigma[k];
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
for (j = k+1; j < n; ++j)
|
|
136
|
+
{
|
|
137
|
+
if ((k < nct) && (m_sigma[k] != 0.0))
|
|
138
|
+
{
|
|
139
|
+
// Apply the transformation.
|
|
140
|
+
Scalar t = matA.col(k).end(m-k).eigen2_dot(matA.col(j).end(m-k)); // FIXME dot product or cwise prod + .sum() ??
|
|
141
|
+
t = -t/matA(k,k);
|
|
142
|
+
matA.col(j).end(m-k) += t * matA.col(k).end(m-k);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// Place the k-th row of A into e for the
|
|
146
|
+
// subsequent calculation of the row transformation.
|
|
147
|
+
e[j] = matA(k,j);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// Place the transformation in U for subsequent back multiplication.
|
|
151
|
+
if (wantu & (k < nct))
|
|
152
|
+
m_matU.col(k).end(m-k) = matA.col(k).end(m-k);
|
|
153
|
+
|
|
154
|
+
if (k < nrt)
|
|
155
|
+
{
|
|
156
|
+
// Compute the k-th row transformation and place the
|
|
157
|
+
// k-th super-diagonal in e[k].
|
|
158
|
+
e[k] = e.end(n-k-1).norm();
|
|
159
|
+
if (e[k] != 0.0)
|
|
160
|
+
{
|
|
161
|
+
if (e[k+1] < 0.0)
|
|
162
|
+
e[k] = -e[k];
|
|
163
|
+
e.end(n-k-1) /= e[k];
|
|
164
|
+
e[k+1] += 1.0;
|
|
165
|
+
}
|
|
166
|
+
e[k] = -e[k];
|
|
167
|
+
if ((k+1 < m) & (e[k] != 0.0))
|
|
168
|
+
{
|
|
169
|
+
// Apply the transformation.
|
|
170
|
+
work.end(m-k-1) = matA.corner(BottomRight,m-k-1,n-k-1) * e.end(n-k-1);
|
|
171
|
+
for (j = k+1; j < n; ++j)
|
|
172
|
+
matA.col(j).end(m-k-1) += (-e[j]/e[k+1]) * work.end(m-k-1);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// Place the transformation in V for subsequent back multiplication.
|
|
176
|
+
if (wantv)
|
|
177
|
+
m_matV.col(k).end(n-k-1) = e.end(n-k-1);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
// Set up the final bidiagonal matrix or order p.
|
|
183
|
+
int p = (std::min)(n,m+1);
|
|
184
|
+
if (nct < n)
|
|
185
|
+
m_sigma[nct] = matA(nct,nct);
|
|
186
|
+
if (m < p)
|
|
187
|
+
m_sigma[p-1] = 0.0;
|
|
188
|
+
if (nrt+1 < p)
|
|
189
|
+
e[nrt] = matA(nrt,p-1);
|
|
190
|
+
e[p-1] = 0.0;
|
|
191
|
+
|
|
192
|
+
// If required, generate U.
|
|
193
|
+
if (wantu)
|
|
194
|
+
{
|
|
195
|
+
for (j = nct; j < nu; ++j)
|
|
196
|
+
{
|
|
197
|
+
m_matU.col(j).setZero();
|
|
198
|
+
m_matU(j,j) = 1.0;
|
|
199
|
+
}
|
|
200
|
+
for (k = nct-1; k >= 0; k--)
|
|
201
|
+
{
|
|
202
|
+
if (m_sigma[k] != 0.0)
|
|
203
|
+
{
|
|
204
|
+
for (j = k+1; j < nu; ++j)
|
|
205
|
+
{
|
|
206
|
+
Scalar t = m_matU.col(k).end(m-k).eigen2_dot(m_matU.col(j).end(m-k)); // FIXME is it really a dot product we want ?
|
|
207
|
+
t = -t/m_matU(k,k);
|
|
208
|
+
m_matU.col(j).end(m-k) += t * m_matU.col(k).end(m-k);
|
|
209
|
+
}
|
|
210
|
+
m_matU.col(k).end(m-k) = - m_matU.col(k).end(m-k);
|
|
211
|
+
m_matU(k,k) = Scalar(1) + m_matU(k,k);
|
|
212
|
+
if (k-1>0)
|
|
213
|
+
m_matU.col(k).start(k-1).setZero();
|
|
214
|
+
}
|
|
215
|
+
else
|
|
216
|
+
{
|
|
217
|
+
m_matU.col(k).setZero();
|
|
218
|
+
m_matU(k,k) = 1.0;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// If required, generate V.
|
|
224
|
+
if (wantv)
|
|
225
|
+
{
|
|
226
|
+
for (k = n-1; k >= 0; k--)
|
|
227
|
+
{
|
|
228
|
+
if ((k < nrt) & (e[k] != 0.0))
|
|
229
|
+
{
|
|
230
|
+
for (j = k+1; j < nu; ++j)
|
|
231
|
+
{
|
|
232
|
+
Scalar t = m_matV.col(k).end(n-k-1).eigen2_dot(m_matV.col(j).end(n-k-1)); // FIXME is it really a dot product we want ?
|
|
233
|
+
t = -t/m_matV(k+1,k);
|
|
234
|
+
m_matV.col(j).end(n-k-1) += t * m_matV.col(k).end(n-k-1);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
m_matV.col(k).setZero();
|
|
238
|
+
m_matV(k,k) = 1.0;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// Main iteration loop for the singular values.
|
|
243
|
+
int pp = p-1;
|
|
244
|
+
int iter = 0;
|
|
245
|
+
Scalar eps = ei_pow(Scalar(2),ei_is_same_type<Scalar,float>::ret ? Scalar(-23) : Scalar(-52));
|
|
246
|
+
while (p > 0)
|
|
247
|
+
{
|
|
248
|
+
int k=0;
|
|
249
|
+
int kase=0;
|
|
250
|
+
|
|
251
|
+
// Here is where a test for too many iterations would go.
|
|
252
|
+
|
|
253
|
+
// This section of the program inspects for
|
|
254
|
+
// negligible elements in the s and e arrays. On
|
|
255
|
+
// completion the variables kase and k are set as follows.
|
|
256
|
+
|
|
257
|
+
// kase = 1 if s(p) and e[k-1] are negligible and k<p
|
|
258
|
+
// kase = 2 if s(k) is negligible and k<p
|
|
259
|
+
// kase = 3 if e[k-1] is negligible, k<p, and
|
|
260
|
+
// s(k), ..., s(p) are not negligible (qr step).
|
|
261
|
+
// kase = 4 if e(p-1) is negligible (convergence).
|
|
262
|
+
|
|
263
|
+
for (k = p-2; k >= -1; --k)
|
|
264
|
+
{
|
|
265
|
+
if (k == -1)
|
|
266
|
+
break;
|
|
267
|
+
if (ei_abs(e[k]) <= eps*(ei_abs(m_sigma[k]) + ei_abs(m_sigma[k+1])))
|
|
268
|
+
{
|
|
269
|
+
e[k] = 0.0;
|
|
270
|
+
break;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
if (k == p-2)
|
|
274
|
+
{
|
|
275
|
+
kase = 4;
|
|
276
|
+
}
|
|
277
|
+
else
|
|
278
|
+
{
|
|
279
|
+
int ks;
|
|
280
|
+
for (ks = p-1; ks >= k; --ks)
|
|
281
|
+
{
|
|
282
|
+
if (ks == k)
|
|
283
|
+
break;
|
|
284
|
+
Scalar t = (ks != p ? ei_abs(e[ks]) : Scalar(0)) + (ks != k+1 ? ei_abs(e[ks-1]) : Scalar(0));
|
|
285
|
+
if (ei_abs(m_sigma[ks]) <= eps*t)
|
|
286
|
+
{
|
|
287
|
+
m_sigma[ks] = 0.0;
|
|
288
|
+
break;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
if (ks == k)
|
|
292
|
+
{
|
|
293
|
+
kase = 3;
|
|
294
|
+
}
|
|
295
|
+
else if (ks == p-1)
|
|
296
|
+
{
|
|
297
|
+
kase = 1;
|
|
298
|
+
}
|
|
299
|
+
else
|
|
300
|
+
{
|
|
301
|
+
kase = 2;
|
|
302
|
+
k = ks;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
++k;
|
|
306
|
+
|
|
307
|
+
// Perform the task indicated by kase.
|
|
308
|
+
switch (kase)
|
|
309
|
+
{
|
|
310
|
+
|
|
311
|
+
// Deflate negligible s(p).
|
|
312
|
+
case 1:
|
|
313
|
+
{
|
|
314
|
+
Scalar f(e[p-2]);
|
|
315
|
+
e[p-2] = 0.0;
|
|
316
|
+
for (j = p-2; j >= k; --j)
|
|
317
|
+
{
|
|
318
|
+
Scalar t(numext::hypot(m_sigma[j],f));
|
|
319
|
+
Scalar cs(m_sigma[j]/t);
|
|
320
|
+
Scalar sn(f/t);
|
|
321
|
+
m_sigma[j] = t;
|
|
322
|
+
if (j != k)
|
|
323
|
+
{
|
|
324
|
+
f = -sn*e[j-1];
|
|
325
|
+
e[j-1] = cs*e[j-1];
|
|
326
|
+
}
|
|
327
|
+
if (wantv)
|
|
328
|
+
{
|
|
329
|
+
for (i = 0; i < n; ++i)
|
|
330
|
+
{
|
|
331
|
+
t = cs*m_matV(i,j) + sn*m_matV(i,p-1);
|
|
332
|
+
m_matV(i,p-1) = -sn*m_matV(i,j) + cs*m_matV(i,p-1);
|
|
333
|
+
m_matV(i,j) = t;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
break;
|
|
339
|
+
|
|
340
|
+
// Split at negligible s(k).
|
|
341
|
+
case 2:
|
|
342
|
+
{
|
|
343
|
+
Scalar f(e[k-1]);
|
|
344
|
+
e[k-1] = 0.0;
|
|
345
|
+
for (j = k; j < p; ++j)
|
|
346
|
+
{
|
|
347
|
+
Scalar t(numext::hypot(m_sigma[j],f));
|
|
348
|
+
Scalar cs( m_sigma[j]/t);
|
|
349
|
+
Scalar sn(f/t);
|
|
350
|
+
m_sigma[j] = t;
|
|
351
|
+
f = -sn*e[j];
|
|
352
|
+
e[j] = cs*e[j];
|
|
353
|
+
if (wantu)
|
|
354
|
+
{
|
|
355
|
+
for (i = 0; i < m; ++i)
|
|
356
|
+
{
|
|
357
|
+
t = cs*m_matU(i,j) + sn*m_matU(i,k-1);
|
|
358
|
+
m_matU(i,k-1) = -sn*m_matU(i,j) + cs*m_matU(i,k-1);
|
|
359
|
+
m_matU(i,j) = t;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
break;
|
|
365
|
+
|
|
366
|
+
// Perform one qr step.
|
|
367
|
+
case 3:
|
|
368
|
+
{
|
|
369
|
+
// Calculate the shift.
|
|
370
|
+
Scalar scale = (std::max)((std::max)((std::max)((std::max)(
|
|
371
|
+
ei_abs(m_sigma[p-1]),ei_abs(m_sigma[p-2])),ei_abs(e[p-2])),
|
|
372
|
+
ei_abs(m_sigma[k])),ei_abs(e[k]));
|
|
373
|
+
Scalar sp = m_sigma[p-1]/scale;
|
|
374
|
+
Scalar spm1 = m_sigma[p-2]/scale;
|
|
375
|
+
Scalar epm1 = e[p-2]/scale;
|
|
376
|
+
Scalar sk = m_sigma[k]/scale;
|
|
377
|
+
Scalar ek = e[k]/scale;
|
|
378
|
+
Scalar b = ((spm1 + sp)*(spm1 - sp) + epm1*epm1)/Scalar(2);
|
|
379
|
+
Scalar c = (sp*epm1)*(sp*epm1);
|
|
380
|
+
Scalar shift(0);
|
|
381
|
+
if ((b != 0.0) || (c != 0.0))
|
|
382
|
+
{
|
|
383
|
+
shift = ei_sqrt(b*b + c);
|
|
384
|
+
if (b < 0.0)
|
|
385
|
+
shift = -shift;
|
|
386
|
+
shift = c/(b + shift);
|
|
387
|
+
}
|
|
388
|
+
Scalar f = (sk + sp)*(sk - sp) + shift;
|
|
389
|
+
Scalar g = sk*ek;
|
|
390
|
+
|
|
391
|
+
// Chase zeros.
|
|
392
|
+
|
|
393
|
+
for (j = k; j < p-1; ++j)
|
|
394
|
+
{
|
|
395
|
+
Scalar t = numext::hypot(f,g);
|
|
396
|
+
Scalar cs = f/t;
|
|
397
|
+
Scalar sn = g/t;
|
|
398
|
+
if (j != k)
|
|
399
|
+
e[j-1] = t;
|
|
400
|
+
f = cs*m_sigma[j] + sn*e[j];
|
|
401
|
+
e[j] = cs*e[j] - sn*m_sigma[j];
|
|
402
|
+
g = sn*m_sigma[j+1];
|
|
403
|
+
m_sigma[j+1] = cs*m_sigma[j+1];
|
|
404
|
+
if (wantv)
|
|
405
|
+
{
|
|
406
|
+
for (i = 0; i < n; ++i)
|
|
407
|
+
{
|
|
408
|
+
t = cs*m_matV(i,j) + sn*m_matV(i,j+1);
|
|
409
|
+
m_matV(i,j+1) = -sn*m_matV(i,j) + cs*m_matV(i,j+1);
|
|
410
|
+
m_matV(i,j) = t;
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
t = numext::hypot(f,g);
|
|
414
|
+
cs = f/t;
|
|
415
|
+
sn = g/t;
|
|
416
|
+
m_sigma[j] = t;
|
|
417
|
+
f = cs*e[j] + sn*m_sigma[j+1];
|
|
418
|
+
m_sigma[j+1] = -sn*e[j] + cs*m_sigma[j+1];
|
|
419
|
+
g = sn*e[j+1];
|
|
420
|
+
e[j+1] = cs*e[j+1];
|
|
421
|
+
if (wantu && (j < m-1))
|
|
422
|
+
{
|
|
423
|
+
for (i = 0; i < m; ++i)
|
|
424
|
+
{
|
|
425
|
+
t = cs*m_matU(i,j) + sn*m_matU(i,j+1);
|
|
426
|
+
m_matU(i,j+1) = -sn*m_matU(i,j) + cs*m_matU(i,j+1);
|
|
427
|
+
m_matU(i,j) = t;
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
e[p-2] = f;
|
|
432
|
+
iter = iter + 1;
|
|
433
|
+
}
|
|
434
|
+
break;
|
|
435
|
+
|
|
436
|
+
// Convergence.
|
|
437
|
+
case 4:
|
|
438
|
+
{
|
|
439
|
+
// Make the singular values positive.
|
|
440
|
+
if (m_sigma[k] <= 0.0)
|
|
441
|
+
{
|
|
442
|
+
m_sigma[k] = m_sigma[k] < Scalar(0) ? -m_sigma[k] : Scalar(0);
|
|
443
|
+
if (wantv)
|
|
444
|
+
m_matV.col(k).start(pp+1) = -m_matV.col(k).start(pp+1);
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
// Order the singular values.
|
|
448
|
+
while (k < pp)
|
|
449
|
+
{
|
|
450
|
+
if (m_sigma[k] >= m_sigma[k+1])
|
|
451
|
+
break;
|
|
452
|
+
Scalar t = m_sigma[k];
|
|
453
|
+
m_sigma[k] = m_sigma[k+1];
|
|
454
|
+
m_sigma[k+1] = t;
|
|
455
|
+
if (wantv && (k < n-1))
|
|
456
|
+
m_matV.col(k).swap(m_matV.col(k+1));
|
|
457
|
+
if (wantu && (k < m-1))
|
|
458
|
+
m_matU.col(k).swap(m_matU.col(k+1));
|
|
459
|
+
++k;
|
|
460
|
+
}
|
|
461
|
+
iter = 0;
|
|
462
|
+
p--;
|
|
463
|
+
}
|
|
464
|
+
break;
|
|
465
|
+
} // end big switch
|
|
466
|
+
} // end iterations
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
template<typename MatrixType>
|
|
470
|
+
SVD<MatrixType>& SVD<MatrixType>::sort()
|
|
471
|
+
{
|
|
472
|
+
int mu = m_matU.rows();
|
|
473
|
+
int mv = m_matV.rows();
|
|
474
|
+
int n = m_matU.cols();
|
|
475
|
+
|
|
476
|
+
for (int i=0; i<n; ++i)
|
|
477
|
+
{
|
|
478
|
+
int k = i;
|
|
479
|
+
Scalar p = m_sigma.coeff(i);
|
|
480
|
+
|
|
481
|
+
for (int j=i+1; j<n; ++j)
|
|
482
|
+
{
|
|
483
|
+
if (m_sigma.coeff(j) > p)
|
|
484
|
+
{
|
|
485
|
+
k = j;
|
|
486
|
+
p = m_sigma.coeff(j);
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
if (k != i)
|
|
490
|
+
{
|
|
491
|
+
m_sigma.coeffRef(k) = m_sigma.coeff(i); // i.e.
|
|
492
|
+
m_sigma.coeffRef(i) = p; // swaps the i-th and the k-th elements
|
|
493
|
+
|
|
494
|
+
int j = mu;
|
|
495
|
+
for(int s=0; j!=0; ++s, --j)
|
|
496
|
+
std::swap(m_matU.coeffRef(s,i), m_matU.coeffRef(s,k));
|
|
497
|
+
|
|
498
|
+
j = mv;
|
|
499
|
+
for (int s=0; j!=0; ++s, --j)
|
|
500
|
+
std::swap(m_matV.coeffRef(s,i), m_matV.coeffRef(s,k));
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
return *this;
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
/** \returns the solution of \f$ A x = b \f$ using the current SVD decomposition of A.
|
|
507
|
+
* The parts of the solution corresponding to zero singular values are ignored.
|
|
508
|
+
*
|
|
509
|
+
* \sa MatrixBase::svd(), LU::solve(), LLT::solve()
|
|
510
|
+
*/
|
|
511
|
+
template<typename MatrixType>
|
|
512
|
+
template<typename OtherDerived, typename ResultType>
|
|
513
|
+
bool SVD<MatrixType>::solve(const MatrixBase<OtherDerived> &b, ResultType* result) const
|
|
514
|
+
{
|
|
515
|
+
ei_assert(b.rows() == m_matU.rows());
|
|
516
|
+
|
|
517
|
+
Scalar maxVal = m_sigma.cwise().abs().maxCoeff();
|
|
518
|
+
for (int j=0; j<b.cols(); ++j)
|
|
519
|
+
{
|
|
520
|
+
Matrix<Scalar,MatrixUType::RowsAtCompileTime,1> aux = m_matU.transpose() * b.col(j);
|
|
521
|
+
|
|
522
|
+
for (int i = 0; i <m_matU.cols(); ++i)
|
|
523
|
+
{
|
|
524
|
+
Scalar si = m_sigma.coeff(i);
|
|
525
|
+
if (ei_isMuchSmallerThan(ei_abs(si),maxVal))
|
|
526
|
+
aux.coeffRef(i) = 0;
|
|
527
|
+
else
|
|
528
|
+
aux.coeffRef(i) /= si;
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
result->col(j) = m_matV * aux;
|
|
532
|
+
}
|
|
533
|
+
return true;
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
/** Computes the polar decomposition of the matrix, as a product unitary x positive.
|
|
537
|
+
*
|
|
538
|
+
* If either pointer is zero, the corresponding computation is skipped.
|
|
539
|
+
*
|
|
540
|
+
* Only for square matrices.
|
|
541
|
+
*
|
|
542
|
+
* \sa computePositiveUnitary(), computeRotationScaling()
|
|
543
|
+
*/
|
|
544
|
+
template<typename MatrixType>
|
|
545
|
+
template<typename UnitaryType, typename PositiveType>
|
|
546
|
+
void SVD<MatrixType>::computeUnitaryPositive(UnitaryType *unitary,
|
|
547
|
+
PositiveType *positive) const
|
|
548
|
+
{
|
|
549
|
+
ei_assert(m_matU.cols() == m_matV.cols() && "Polar decomposition is only for square matrices");
|
|
550
|
+
if(unitary) *unitary = m_matU * m_matV.adjoint();
|
|
551
|
+
if(positive) *positive = m_matV * m_sigma.asDiagonal() * m_matV.adjoint();
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
/** Computes the polar decomposition of the matrix, as a product positive x unitary.
|
|
555
|
+
*
|
|
556
|
+
* If either pointer is zero, the corresponding computation is skipped.
|
|
557
|
+
*
|
|
558
|
+
* Only for square matrices.
|
|
559
|
+
*
|
|
560
|
+
* \sa computeUnitaryPositive(), computeRotationScaling()
|
|
561
|
+
*/
|
|
562
|
+
template<typename MatrixType>
|
|
563
|
+
template<typename UnitaryType, typename PositiveType>
|
|
564
|
+
void SVD<MatrixType>::computePositiveUnitary(UnitaryType *positive,
|
|
565
|
+
PositiveType *unitary) const
|
|
566
|
+
{
|
|
567
|
+
ei_assert(m_matU.rows() == m_matV.rows() && "Polar decomposition is only for square matrices");
|
|
568
|
+
if(unitary) *unitary = m_matU * m_matV.adjoint();
|
|
569
|
+
if(positive) *positive = m_matU * m_sigma.asDiagonal() * m_matU.adjoint();
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
/** decomposes the matrix as a product rotation x scaling, the scaling being
|
|
573
|
+
* not necessarily positive.
|
|
574
|
+
*
|
|
575
|
+
* If either pointer is zero, the corresponding computation is skipped.
|
|
576
|
+
*
|
|
577
|
+
* This method requires the Geometry module.
|
|
578
|
+
*
|
|
579
|
+
* \sa computeScalingRotation(), computeUnitaryPositive()
|
|
580
|
+
*/
|
|
581
|
+
template<typename MatrixType>
|
|
582
|
+
template<typename RotationType, typename ScalingType>
|
|
583
|
+
void SVD<MatrixType>::computeRotationScaling(RotationType *rotation, ScalingType *scaling) const
|
|
584
|
+
{
|
|
585
|
+
ei_assert(m_matU.rows() == m_matV.rows() && "Polar decomposition is only for square matrices");
|
|
586
|
+
Scalar x = (m_matU * m_matV.adjoint()).determinant(); // so x has absolute value 1
|
|
587
|
+
Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> sv(m_sigma);
|
|
588
|
+
sv.coeffRef(0) *= x;
|
|
589
|
+
if(scaling) scaling->lazyAssign(m_matV * sv.asDiagonal() * m_matV.adjoint());
|
|
590
|
+
if(rotation)
|
|
591
|
+
{
|
|
592
|
+
MatrixType m(m_matU);
|
|
593
|
+
m.col(0) /= x;
|
|
594
|
+
rotation->lazyAssign(m * m_matV.adjoint());
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
/** decomposes the matrix as a product scaling x rotation, the scaling being
|
|
599
|
+
* not necessarily positive.
|
|
600
|
+
*
|
|
601
|
+
* If either pointer is zero, the corresponding computation is skipped.
|
|
602
|
+
*
|
|
603
|
+
* This method requires the Geometry module.
|
|
604
|
+
*
|
|
605
|
+
* \sa computeRotationScaling(), computeUnitaryPositive()
|
|
606
|
+
*/
|
|
607
|
+
template<typename MatrixType>
|
|
608
|
+
template<typename ScalingType, typename RotationType>
|
|
609
|
+
void SVD<MatrixType>::computeScalingRotation(ScalingType *scaling, RotationType *rotation) const
|
|
610
|
+
{
|
|
611
|
+
ei_assert(m_matU.rows() == m_matV.rows() && "Polar decomposition is only for square matrices");
|
|
612
|
+
Scalar x = (m_matU * m_matV.adjoint()).determinant(); // so x has absolute value 1
|
|
613
|
+
Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> sv(m_sigma);
|
|
614
|
+
sv.coeffRef(0) *= x;
|
|
615
|
+
if(scaling) scaling->lazyAssign(m_matU * sv.asDiagonal() * m_matU.adjoint());
|
|
616
|
+
if(rotation)
|
|
617
|
+
{
|
|
618
|
+
MatrixType m(m_matU);
|
|
619
|
+
m.col(0) /= x;
|
|
620
|
+
rotation->lazyAssign(m * m_matV.adjoint());
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
|
|
625
|
+
/** \svd_module
|
|
626
|
+
* \returns the SVD decomposition of \c *this
|
|
627
|
+
*/
|
|
628
|
+
template<typename Derived>
|
|
629
|
+
inline SVD<typename MatrixBase<Derived>::PlainObject>
|
|
630
|
+
MatrixBase<Derived>::svd() const
|
|
631
|
+
{
|
|
632
|
+
return SVD<PlainObject>(derived());
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
} // end namespace Eigen
|
|
636
|
+
|
|
637
|
+
#endif // EIGEN2_SVD_H
|