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

◆ SVD_divide_conquer() [2/4]

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

Definition at line 420 of file eigen.cpp.

425{
426 auto old_prec = Real::get_default_prec();
427 Real::set_default_prec(A->ring().get_precision());
428
429 MatrixXmpCCC AXmp(A->numRows(), A->numColumns());
430 fill_to_MatrixXmp(*A, AXmp);
431
432 Eigen::BDCSVD<MatrixXmpCCC> svd(AXmp, Eigen::ComputeThinU | Eigen::ComputeThinV);
433
434 fill_from_MatrixXmp(svd.matrixU(), *U);
435 fill_from_MatrixXmp(svd.matrixV().adjoint(), *VT);
436 fill_from_MatrixXmp(svd.singularValues(), *Sigma);
437
438 Real::set_default_prec(old_prec);
439 return true;
440}
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-CCC.hpp:88
Eigen::Matrix< Complex, Eigen::Dynamic, Eigen::Dynamic > MatrixXmpCCC
Definition eigen.cpp:26
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::ARingCCC::get_precision(), DMat< ACoeffRing >::numColumns(), DMat< ACoeffRing >::numRows(), and DMat< ACoeffRing >::ring().