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.
Files changed (293) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +22 -0
  3. data/README.md +21 -0
  4. data/ext/eigen/eigen3/COPYING.BSD +26 -0
  5. data/ext/eigen/eigen3/COPYING.MPL2 +373 -0
  6. data/ext/eigen/eigen3/COPYING.README +18 -0
  7. data/ext/eigen/eigen3/Eigen/Array +11 -0
  8. data/ext/eigen/eigen3/Eigen/Cholesky +32 -0
  9. data/ext/eigen/eigen3/Eigen/CholmodSupport +45 -0
  10. data/ext/eigen/eigen3/Eigen/Core +376 -0
  11. data/ext/eigen/eigen3/Eigen/Dense +7 -0
  12. data/ext/eigen/eigen3/Eigen/Eigen +2 -0
  13. data/ext/eigen/eigen3/Eigen/Eigen2Support +95 -0
  14. data/ext/eigen/eigen3/Eigen/Eigenvalues +48 -0
  15. data/ext/eigen/eigen3/Eigen/Geometry +63 -0
  16. data/ext/eigen/eigen3/Eigen/Householder +23 -0
  17. data/ext/eigen/eigen3/Eigen/IterativeLinearSolvers +40 -0
  18. data/ext/eigen/eigen3/Eigen/Jacobi +26 -0
  19. data/ext/eigen/eigen3/Eigen/LU +41 -0
  20. data/ext/eigen/eigen3/Eigen/LeastSquares +32 -0
  21. data/ext/eigen/eigen3/Eigen/MetisSupport +28 -0
  22. data/ext/eigen/eigen3/Eigen/PaStiXSupport +46 -0
  23. data/ext/eigen/eigen3/Eigen/PardisoSupport +30 -0
  24. data/ext/eigen/eigen3/Eigen/QR +45 -0
  25. data/ext/eigen/eigen3/Eigen/QtAlignedMalloc +34 -0
  26. data/ext/eigen/eigen3/Eigen/SPQRSupport +29 -0
  27. data/ext/eigen/eigen3/Eigen/SVD +37 -0
  28. data/ext/eigen/eigen3/Eigen/Sparse +27 -0
  29. data/ext/eigen/eigen3/Eigen/SparseCore +64 -0
  30. data/ext/eigen/eigen3/Eigen/SparseLU +49 -0
  31. data/ext/eigen/eigen3/Eigen/SparseQR +33 -0
  32. data/ext/eigen/eigen3/Eigen/StdDeque +27 -0
  33. data/ext/eigen/eigen3/Eigen/StdList +26 -0
  34. data/ext/eigen/eigen3/Eigen/StdVector +27 -0
  35. data/ext/eigen/eigen3/Eigen/SuperLUSupport +59 -0
  36. data/ext/eigen/eigen3/Eigen/UmfPackSupport +36 -0
  37. data/ext/eigen/eigen3/Eigen/src/Cholesky/LDLT.h +611 -0
  38. data/ext/eigen/eigen3/Eigen/src/Cholesky/LLT.h +498 -0
  39. data/ext/eigen/eigen3/Eigen/src/Cholesky/LLT_MKL.h +102 -0
  40. data/ext/eigen/eigen3/Eigen/src/CholmodSupport/CholmodSupport.h +607 -0
  41. data/ext/eigen/eigen3/Eigen/src/Core/Array.h +323 -0
  42. data/ext/eigen/eigen3/Eigen/src/Core/ArrayBase.h +226 -0
  43. data/ext/eigen/eigen3/Eigen/src/Core/ArrayWrapper.h +264 -0
  44. data/ext/eigen/eigen3/Eigen/src/Core/Assign.h +590 -0
  45. data/ext/eigen/eigen3/Eigen/src/Core/Assign_MKL.h +224 -0
  46. data/ext/eigen/eigen3/Eigen/src/Core/BandMatrix.h +334 -0
  47. data/ext/eigen/eigen3/Eigen/src/Core/Block.h +406 -0
  48. data/ext/eigen/eigen3/Eigen/src/Core/BooleanRedux.h +154 -0
  49. data/ext/eigen/eigen3/Eigen/src/Core/CommaInitializer.h +154 -0
  50. data/ext/eigen/eigen3/Eigen/src/Core/CoreIterators.h +61 -0
  51. data/ext/eigen/eigen3/Eigen/src/Core/CwiseBinaryOp.h +230 -0
  52. data/ext/eigen/eigen3/Eigen/src/Core/CwiseNullaryOp.h +864 -0
  53. data/ext/eigen/eigen3/Eigen/src/Core/CwiseUnaryOp.h +126 -0
  54. data/ext/eigen/eigen3/Eigen/src/Core/CwiseUnaryView.h +139 -0
  55. data/ext/eigen/eigen3/Eigen/src/Core/DenseBase.h +521 -0
  56. data/ext/eigen/eigen3/Eigen/src/Core/DenseCoeffsBase.h +754 -0
  57. data/ext/eigen/eigen3/Eigen/src/Core/DenseStorage.h +434 -0
  58. data/ext/eigen/eigen3/Eigen/src/Core/Diagonal.h +237 -0
  59. data/ext/eigen/eigen3/Eigen/src/Core/DiagonalMatrix.h +313 -0
  60. data/ext/eigen/eigen3/Eigen/src/Core/DiagonalProduct.h +131 -0
  61. data/ext/eigen/eigen3/Eigen/src/Core/Dot.h +263 -0
  62. data/ext/eigen/eigen3/Eigen/src/Core/EigenBase.h +131 -0
  63. data/ext/eigen/eigen3/Eigen/src/Core/Flagged.h +140 -0
  64. data/ext/eigen/eigen3/Eigen/src/Core/ForceAlignedAccess.h +146 -0
  65. data/ext/eigen/eigen3/Eigen/src/Core/Functors.h +1026 -0
  66. data/ext/eigen/eigen3/Eigen/src/Core/Fuzzy.h +150 -0
  67. data/ext/eigen/eigen3/Eigen/src/Core/GeneralProduct.h +635 -0
  68. data/ext/eigen/eigen3/Eigen/src/Core/GenericPacketMath.h +350 -0
  69. data/ext/eigen/eigen3/Eigen/src/Core/GlobalFunctions.h +92 -0
  70. data/ext/eigen/eigen3/Eigen/src/Core/IO.h +250 -0
  71. data/ext/eigen/eigen3/Eigen/src/Core/Map.h +192 -0
  72. data/ext/eigen/eigen3/Eigen/src/Core/MapBase.h +247 -0
  73. data/ext/eigen/eigen3/Eigen/src/Core/MathFunctions.h +768 -0
  74. data/ext/eigen/eigen3/Eigen/src/Core/Matrix.h +420 -0
  75. data/ext/eigen/eigen3/Eigen/src/Core/MatrixBase.h +563 -0
  76. data/ext/eigen/eigen3/Eigen/src/Core/NestByValue.h +111 -0
  77. data/ext/eigen/eigen3/Eigen/src/Core/NoAlias.h +134 -0
  78. data/ext/eigen/eigen3/Eigen/src/Core/NumTraits.h +150 -0
  79. data/ext/eigen/eigen3/Eigen/src/Core/PermutationMatrix.h +721 -0
  80. data/ext/eigen/eigen3/Eigen/src/Core/PlainObjectBase.h +822 -0
  81. data/ext/eigen/eigen3/Eigen/src/Core/ProductBase.h +290 -0
  82. data/ext/eigen/eigen3/Eigen/src/Core/Random.h +152 -0
  83. data/ext/eigen/eigen3/Eigen/src/Core/Redux.h +409 -0
  84. data/ext/eigen/eigen3/Eigen/src/Core/Ref.h +278 -0
  85. data/ext/eigen/eigen3/Eigen/src/Core/Replicate.h +177 -0
  86. data/ext/eigen/eigen3/Eigen/src/Core/ReturnByValue.h +99 -0
  87. data/ext/eigen/eigen3/Eigen/src/Core/Reverse.h +224 -0
  88. data/ext/eigen/eigen3/Eigen/src/Core/Select.h +162 -0
  89. data/ext/eigen/eigen3/Eigen/src/Core/SelfAdjointView.h +314 -0
  90. data/ext/eigen/eigen3/Eigen/src/Core/SelfCwiseBinaryOp.h +191 -0
  91. data/ext/eigen/eigen3/Eigen/src/Core/SolveTriangular.h +260 -0
  92. data/ext/eigen/eigen3/Eigen/src/Core/StableNorm.h +203 -0
  93. data/ext/eigen/eigen3/Eigen/src/Core/Stride.h +108 -0
  94. data/ext/eigen/eigen3/Eigen/src/Core/Swap.h +126 -0
  95. data/ext/eigen/eigen3/Eigen/src/Core/Transpose.h +419 -0
  96. data/ext/eigen/eigen3/Eigen/src/Core/Transpositions.h +436 -0
  97. data/ext/eigen/eigen3/Eigen/src/Core/TriangularMatrix.h +839 -0
  98. data/ext/eigen/eigen3/Eigen/src/Core/VectorBlock.h +95 -0
  99. data/ext/eigen/eigen3/Eigen/src/Core/VectorwiseOp.h +642 -0
  100. data/ext/eigen/eigen3/Eigen/src/Core/Visitor.h +237 -0
  101. data/ext/eigen/eigen3/Eigen/src/Core/arch/AltiVec/Complex.h +217 -0
  102. data/ext/eigen/eigen3/Eigen/src/Core/arch/AltiVec/PacketMath.h +501 -0
  103. data/ext/eigen/eigen3/Eigen/src/Core/arch/Default/Settings.h +49 -0
  104. data/ext/eigen/eigen3/Eigen/src/Core/arch/NEON/Complex.h +253 -0
  105. data/ext/eigen/eigen3/Eigen/src/Core/arch/NEON/PacketMath.h +420 -0
  106. data/ext/eigen/eigen3/Eigen/src/Core/arch/SSE/Complex.h +442 -0
  107. data/ext/eigen/eigen3/Eigen/src/Core/arch/SSE/MathFunctions.h +475 -0
  108. data/ext/eigen/eigen3/Eigen/src/Core/arch/SSE/PacketMath.h +649 -0
  109. data/ext/eigen/eigen3/Eigen/src/Core/products/CoeffBasedProduct.h +476 -0
  110. data/ext/eigen/eigen3/Eigen/src/Core/products/GeneralBlockPanelKernel.h +1341 -0
  111. data/ext/eigen/eigen3/Eigen/src/Core/products/GeneralMatrixMatrix.h +427 -0
  112. data/ext/eigen/eigen3/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h +278 -0
  113. data/ext/eigen/eigen3/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_MKL.h +146 -0
  114. data/ext/eigen/eigen3/Eigen/src/Core/products/GeneralMatrixMatrix_MKL.h +118 -0
  115. data/ext/eigen/eigen3/Eigen/src/Core/products/GeneralMatrixVector.h +566 -0
  116. data/ext/eigen/eigen3/Eigen/src/Core/products/GeneralMatrixVector_MKL.h +131 -0
  117. data/ext/eigen/eigen3/Eigen/src/Core/products/Parallelizer.h +162 -0
  118. data/ext/eigen/eigen3/Eigen/src/Core/products/SelfadjointMatrixMatrix.h +436 -0
  119. data/ext/eigen/eigen3/Eigen/src/Core/products/SelfadjointMatrixMatrix_MKL.h +295 -0
  120. data/ext/eigen/eigen3/Eigen/src/Core/products/SelfadjointMatrixVector.h +281 -0
  121. data/ext/eigen/eigen3/Eigen/src/Core/products/SelfadjointMatrixVector_MKL.h +114 -0
  122. data/ext/eigen/eigen3/Eigen/src/Core/products/SelfadjointProduct.h +123 -0
  123. data/ext/eigen/eigen3/Eigen/src/Core/products/SelfadjointRank2Update.h +93 -0
  124. data/ext/eigen/eigen3/Eigen/src/Core/products/TriangularMatrixMatrix.h +427 -0
  125. data/ext/eigen/eigen3/Eigen/src/Core/products/TriangularMatrixMatrix_MKL.h +309 -0
  126. data/ext/eigen/eigen3/Eigen/src/Core/products/TriangularMatrixVector.h +348 -0
  127. data/ext/eigen/eigen3/Eigen/src/Core/products/TriangularMatrixVector_MKL.h +247 -0
  128. data/ext/eigen/eigen3/Eigen/src/Core/products/TriangularSolverMatrix.h +332 -0
  129. data/ext/eigen/eigen3/Eigen/src/Core/products/TriangularSolverMatrix_MKL.h +155 -0
  130. data/ext/eigen/eigen3/Eigen/src/Core/products/TriangularSolverVector.h +139 -0
  131. data/ext/eigen/eigen3/Eigen/src/Core/util/BlasUtil.h +264 -0
  132. data/ext/eigen/eigen3/Eigen/src/Core/util/Constants.h +451 -0
  133. data/ext/eigen/eigen3/Eigen/src/Core/util/DisableStupidWarnings.h +40 -0
  134. data/ext/eigen/eigen3/Eigen/src/Core/util/ForwardDeclarations.h +302 -0
  135. data/ext/eigen/eigen3/Eigen/src/Core/util/MKL_support.h +158 -0
  136. data/ext/eigen/eigen3/Eigen/src/Core/util/Macros.h +451 -0
  137. data/ext/eigen/eigen3/Eigen/src/Core/util/Memory.h +977 -0
  138. data/ext/eigen/eigen3/Eigen/src/Core/util/Meta.h +243 -0
  139. data/ext/eigen/eigen3/Eigen/src/Core/util/NonMPL2.h +3 -0
  140. data/ext/eigen/eigen3/Eigen/src/Core/util/ReenableStupidWarnings.h +14 -0
  141. data/ext/eigen/eigen3/Eigen/src/Core/util/StaticAssert.h +208 -0
  142. data/ext/eigen/eigen3/Eigen/src/Core/util/XprHelper.h +469 -0
  143. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Block.h +126 -0
  144. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Cwise.h +192 -0
  145. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/CwiseOperators.h +298 -0
  146. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/AlignedBox.h +159 -0
  147. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/All.h +115 -0
  148. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/AngleAxis.h +214 -0
  149. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/Hyperplane.h +254 -0
  150. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/ParametrizedLine.h +141 -0
  151. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/Quaternion.h +495 -0
  152. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/Rotation2D.h +145 -0
  153. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/RotationBase.h +123 -0
  154. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/Scaling.h +167 -0
  155. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/Transform.h +786 -0
  156. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/Translation.h +184 -0
  157. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/LU.h +120 -0
  158. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Lazy.h +71 -0
  159. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/LeastSquares.h +169 -0
  160. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Macros.h +20 -0
  161. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/MathFunctions.h +57 -0
  162. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Memory.h +45 -0
  163. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Meta.h +75 -0
  164. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Minor.h +117 -0
  165. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/QR.h +67 -0
  166. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/SVD.h +637 -0
  167. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/TriangularSolver.h +42 -0
  168. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/VectorBlock.h +94 -0
  169. data/ext/eigen/eigen3/Eigen/src/Eigenvalues/ComplexEigenSolver.h +341 -0
  170. data/ext/eigen/eigen3/Eigen/src/Eigenvalues/ComplexSchur.h +456 -0
  171. data/ext/eigen/eigen3/Eigen/src/Eigenvalues/ComplexSchur_MKL.h +94 -0
  172. data/ext/eigen/eigen3/Eigen/src/Eigenvalues/EigenSolver.h +607 -0
  173. data/ext/eigen/eigen3/Eigen/src/Eigenvalues/GeneralizedEigenSolver.h +350 -0
  174. data/ext/eigen/eigen3/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h +227 -0
  175. data/ext/eigen/eigen3/Eigen/src/Eigenvalues/HessenbergDecomposition.h +373 -0
  176. data/ext/eigen/eigen3/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h +160 -0
  177. data/ext/eigen/eigen3/Eigen/src/Eigenvalues/RealQZ.h +624 -0
  178. data/ext/eigen/eigen3/Eigen/src/Eigenvalues/RealSchur.h +525 -0
  179. data/ext/eigen/eigen3/Eigen/src/Eigenvalues/RealSchur_MKL.h +83 -0
  180. data/ext/eigen/eigen3/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h +801 -0
  181. data/ext/eigen/eigen3/Eigen/src/Eigenvalues/SelfAdjointEigenSolver_MKL.h +92 -0
  182. data/ext/eigen/eigen3/Eigen/src/Eigenvalues/Tridiagonalization.h +557 -0
  183. data/ext/eigen/eigen3/Eigen/src/Geometry/AlignedBox.h +392 -0
  184. data/ext/eigen/eigen3/Eigen/src/Geometry/AngleAxis.h +233 -0
  185. data/ext/eigen/eigen3/Eigen/src/Geometry/EulerAngles.h +104 -0
  186. data/ext/eigen/eigen3/Eigen/src/Geometry/Homogeneous.h +307 -0
  187. data/ext/eigen/eigen3/Eigen/src/Geometry/Hyperplane.h +280 -0
  188. data/ext/eigen/eigen3/Eigen/src/Geometry/OrthoMethods.h +218 -0
  189. data/ext/eigen/eigen3/Eigen/src/Geometry/ParametrizedLine.h +195 -0
  190. data/ext/eigen/eigen3/Eigen/src/Geometry/Quaternion.h +776 -0
  191. data/ext/eigen/eigen3/Eigen/src/Geometry/Rotation2D.h +160 -0
  192. data/ext/eigen/eigen3/Eigen/src/Geometry/RotationBase.h +206 -0
  193. data/ext/eigen/eigen3/Eigen/src/Geometry/Scaling.h +166 -0
  194. data/ext/eigen/eigen3/Eigen/src/Geometry/Transform.h +1455 -0
  195. data/ext/eigen/eigen3/Eigen/src/Geometry/Translation.h +206 -0
  196. data/ext/eigen/eigen3/Eigen/src/Geometry/Umeyama.h +177 -0
  197. data/ext/eigen/eigen3/Eigen/src/Geometry/arch/Geometry_SSE.h +115 -0
  198. data/ext/eigen/eigen3/Eigen/src/Householder/BlockHouseholder.h +68 -0
  199. data/ext/eigen/eigen3/Eigen/src/Householder/Householder.h +171 -0
  200. data/ext/eigen/eigen3/Eigen/src/Householder/HouseholderSequence.h +441 -0
  201. data/ext/eigen/eigen3/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h +149 -0
  202. data/ext/eigen/eigen3/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h +263 -0
  203. data/ext/eigen/eigen3/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h +256 -0
  204. data/ext/eigen/eigen3/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h +282 -0
  205. data/ext/eigen/eigen3/Eigen/src/Jacobi/Jacobi.h +433 -0
  206. data/ext/eigen/eigen3/Eigen/src/LU/Determinant.h +101 -0
  207. data/ext/eigen/eigen3/Eigen/src/LU/FullPivLU.h +751 -0
  208. data/ext/eigen/eigen3/Eigen/src/LU/Inverse.h +400 -0
  209. data/ext/eigen/eigen3/Eigen/src/LU/PartialPivLU.h +509 -0
  210. data/ext/eigen/eigen3/Eigen/src/LU/PartialPivLU_MKL.h +85 -0
  211. data/ext/eigen/eigen3/Eigen/src/LU/arch/Inverse_SSE.h +329 -0
  212. data/ext/eigen/eigen3/Eigen/src/MetisSupport/MetisSupport.h +137 -0
  213. data/ext/eigen/eigen3/Eigen/src/OrderingMethods/Amd.h +444 -0
  214. data/ext/eigen/eigen3/Eigen/src/OrderingMethods/Eigen_Colamd.h +1850 -0
  215. data/ext/eigen/eigen3/Eigen/src/PaStiXSupport/PaStiXSupport.h +721 -0
  216. data/ext/eigen/eigen3/Eigen/src/PardisoSupport/PardisoSupport.h +592 -0
  217. data/ext/eigen/eigen3/Eigen/src/QR/ColPivHouseholderQR.h +580 -0
  218. data/ext/eigen/eigen3/Eigen/src/QR/ColPivHouseholderQR_MKL.h +99 -0
  219. data/ext/eigen/eigen3/Eigen/src/QR/FullPivHouseholderQR.h +622 -0
  220. data/ext/eigen/eigen3/Eigen/src/QR/HouseholderQR.h +388 -0
  221. data/ext/eigen/eigen3/Eigen/src/QR/HouseholderQR_MKL.h +71 -0
  222. data/ext/eigen/eigen3/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h +338 -0
  223. data/ext/eigen/eigen3/Eigen/src/SVD/JacobiSVD.h +976 -0
  224. data/ext/eigen/eigen3/Eigen/src/SVD/JacobiSVD_MKL.h +92 -0
  225. data/ext/eigen/eigen3/Eigen/src/SVD/UpperBidiagonalization.h +148 -0
  226. data/ext/eigen/eigen3/Eigen/src/SparseCholesky/SimplicialCholesky.h +671 -0
  227. data/ext/eigen/eigen3/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h +199 -0
  228. data/ext/eigen/eigen3/Eigen/src/SparseCore/AmbiVector.h +373 -0
  229. data/ext/eigen/eigen3/Eigen/src/SparseCore/CompressedStorage.h +233 -0
  230. data/ext/eigen/eigen3/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h +245 -0
  231. data/ext/eigen/eigen3/Eigen/src/SparseCore/MappedSparseMatrix.h +181 -0
  232. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseBlock.h +537 -0
  233. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseColEtree.h +206 -0
  234. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseCwiseBinaryOp.h +325 -0
  235. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseCwiseUnaryOp.h +163 -0
  236. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseDenseProduct.h +311 -0
  237. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseDiagonalProduct.h +196 -0
  238. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseDot.h +101 -0
  239. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseFuzzy.h +26 -0
  240. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseMatrix.h +1262 -0
  241. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseMatrixBase.h +461 -0
  242. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparsePermutation.h +148 -0
  243. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseProduct.h +188 -0
  244. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseRedux.h +45 -0
  245. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseSelfAdjointView.h +507 -0
  246. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseSparseProductWithPruning.h +150 -0
  247. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseTranspose.h +63 -0
  248. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseTriangularView.h +179 -0
  249. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseUtil.h +172 -0
  250. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseVector.h +448 -0
  251. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseView.h +99 -0
  252. data/ext/eigen/eigen3/Eigen/src/SparseCore/TriangularSolver.h +334 -0
  253. data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU.h +806 -0
  254. data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLUImpl.h +66 -0
  255. data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_Memory.h +227 -0
  256. data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_Structs.h +111 -0
  257. data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h +298 -0
  258. data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_Utils.h +80 -0
  259. data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_column_bmod.h +180 -0
  260. data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_column_dfs.h +177 -0
  261. data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_copy_to_ucol.h +106 -0
  262. data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_gemm_kernel.h +279 -0
  263. data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_heap_relax_snode.h +127 -0
  264. data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_kernel_bmod.h +130 -0
  265. data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_panel_bmod.h +223 -0
  266. data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_panel_dfs.h +258 -0
  267. data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_pivotL.h +137 -0
  268. data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_pruneL.h +135 -0
  269. data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_relax_snode.h +83 -0
  270. data/ext/eigen/eigen3/Eigen/src/SparseQR/SparseQR.h +714 -0
  271. data/ext/eigen/eigen3/Eigen/src/StlSupport/StdDeque.h +134 -0
  272. data/ext/eigen/eigen3/Eigen/src/StlSupport/StdList.h +114 -0
  273. data/ext/eigen/eigen3/Eigen/src/StlSupport/StdVector.h +126 -0
  274. data/ext/eigen/eigen3/Eigen/src/StlSupport/details.h +84 -0
  275. data/ext/eigen/eigen3/Eigen/src/SuperLUSupport/SuperLUSupport.h +1026 -0
  276. data/ext/eigen/eigen3/Eigen/src/UmfPackSupport/UmfPackSupport.h +474 -0
  277. data/ext/eigen/eigen3/Eigen/src/misc/Image.h +84 -0
  278. data/ext/eigen/eigen3/Eigen/src/misc/Kernel.h +81 -0
  279. data/ext/eigen/eigen3/Eigen/src/misc/Solve.h +76 -0
  280. data/ext/eigen/eigen3/Eigen/src/misc/SparseSolve.h +128 -0
  281. data/ext/eigen/eigen3/Eigen/src/misc/blas.h +658 -0
  282. data/ext/eigen/eigen3/Eigen/src/plugins/ArrayCwiseBinaryOps.h +253 -0
  283. data/ext/eigen/eigen3/Eigen/src/plugins/ArrayCwiseUnaryOps.h +187 -0
  284. data/ext/eigen/eigen3/Eigen/src/plugins/BlockMethods.h +935 -0
  285. data/ext/eigen/eigen3/Eigen/src/plugins/CommonCwiseBinaryOps.h +46 -0
  286. data/ext/eigen/eigen3/Eigen/src/plugins/CommonCwiseUnaryOps.h +172 -0
  287. data/ext/eigen/eigen3/Eigen/src/plugins/MatrixCwiseBinaryOps.h +143 -0
  288. data/ext/eigen/eigen3/Eigen/src/plugins/MatrixCwiseUnaryOps.h +52 -0
  289. data/ext/eigen/eigen3/signature_of_eigen3_matrix_library +1 -0
  290. data/ext/eigen/eigen_wrap.cxx +19420 -10396
  291. data/ext/eigen/extconf.rb +37 -2
  292. data/lib/eigen.rb +146 -3
  293. 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