Macaulay2 Engine
Loading...
Searching...
No Matches

◆ SVD_divide_conquer() [4/4]

bool EigenM2::SVD_divide_conquer ( const LMatrixRRR * A,
LMatrixRRR * Sigma,
LMatrixRRR * U,
LMatrixRRR * VT )

Definition at line 398 of file eigen.cpp.

403{
404 auto old_prec = Real::get_default_prec();
405 Real::set_default_prec(A->ring().get_precision());
406
407 MatrixXmpRRR AXmp(A->numRows(), A->numColumns());
408 fill_to_MatrixXmp(*A, AXmp);
409
410 Eigen::BDCSVD<MatrixXmpRRR> svd(AXmp, Eigen::ComputeThinU | Eigen::ComputeThinV);
411
412 fill_from_MatrixXmp(svd.matrixU(), *U);
413 fill_from_MatrixXmp(svd.matrixV().adjoint(), *VT);
414 fill_from_MatrixXmp(svd.singularValues(), *Sigma);
415
416 Real::set_default_prec(old_prec);
417 return true;
418}
size_t numRows() const
Definition dmat.hpp:144
const ACoeffRing & ring() const
Definition dmat.hpp:143
size_t numColumns() const
Definition dmat.hpp:145
unsigned long get_precision() const
Definition aring-RRR.hpp:82
Eigen::Matrix< Real, Eigen::Dynamic, Eigen::Dynamic > MatrixXmpRRR
Definition eigen.cpp:25
void fill_to_MatrixXmp(const LMatrixRRR &orig, MatrixXmpRRR &result)
Definition eigen.cpp:313
void fill_from_MatrixXmp(const MatrixXmpRRR &orig, LMatrixRRR &result)
Definition eigen.cpp:327

References fill_from_MatrixXmp(), fill_to_MatrixXmp(), M2::ARingRRR::get_precision(), DMat< ACoeffRing >::numColumns(), DMat< ACoeffRing >::numRows(), and DMat< ACoeffRing >::ring().

Referenced by MatrixOps::SVD(), MatrixOps::SVD(), MatrixOps::SVD(), and MatrixOps::SVD().