39#ifndef EIGEN_BDCSVD_LAPACKE_H
40#define EIGEN_BDCSVD_LAPACKE_H
46namespace lapacke_helpers {
51template <
typename MatrixType_,
int Options>
52class BDCSVD_LAPACKE :
public BDCSVD<MatrixType_, Options> {
54 typedef typename SVD::MatrixType MatrixType;
55 typedef typename SVD::Scalar Scalar;
56 typedef typename SVD::RealScalar RealScalar;
60 BDCSVD_LAPACKE(SVD&& svd) : SVD(std::move(svd)) {}
62 template <
typename Derived>
63 void compute_impl_lapacke(
const MatrixBase<Derived>& matrix,
unsigned int computationOptions) {
64 SVD::allocate(matrix.rows(), matrix.cols(), computationOptions);
66 SVD::m_nonzeroSingularValues = SVD::m_diagSize;
69 const lapack_int matrix_order = lapack_storage_of(matrix);
70 const char jobz = (SVD::m_computeFullU || SVD::m_computeFullV) ?
'A'
71 : (SVD::m_computeThinU || SVD::m_computeThinV) ?
'S'
73 const lapack_int u_cols = (jobz ==
'A') ? to_lapack(SVD::rows()) : (jobz ==
'S') ? to_lapack(SVD::diagSize()) : 1;
74 const lapack_int vt_rows = (jobz ==
'A') ? to_lapack(SVD::cols()) : (jobz ==
'S') ? to_lapack(SVD::diagSize()) : 1;
76 Scalar *u, *vt, dummy;
78 if (
SVD::computeU() && !(SVD::m_computeThinU && SVD::m_computeFullV)) {
79 ldu = to_lapack(SVD::m_matrixU.outerStride());
80 u = SVD::m_matrixU.data();
82 localU.resize(SVD::rows(), u_cols);
83 ldu = to_lapack(localU.outerStride());
91 localV.resize(vt_rows, SVD::cols());
92 ldvt = to_lapack(localV.outerStride());
102 lapack_int info = gesdd(matrix_order, jobz, to_lapack(SVD::rows()), to_lapack(SVD::cols()), to_lapack(temp.data()),
103 to_lapack(temp.outerStride()), (RealScalar*)SVD::m_singularValues.data(), to_lapack(u), ldu,
104 to_lapack(vt), ldvt);
107 if (info < 0 || !SVD::m_singularValues.allFinite()) {
110 }
else if (info > 0) {
114 if (SVD::m_computeThinU && SVD::m_computeFullV) {
115 SVD::m_matrixU = localU.leftCols(SVD::m_matrixU.cols());
118 SVD::m_matrixV = localV.adjoint().leftCols(SVD::m_matrixV.cols());
121 SVD::m_isInitialized =
true;
125template <
typename MatrixType_,
int Options,
typename Derived>
126BDCSVD<MatrixType_, Options>& BDCSVD_wrapper(BDCSVD<MatrixType_, Options>& svd,
const MatrixBase<Derived>& matrix,
127 int computationOptions) {
129 BDCSVD_LAPACKE<MatrixType_, Options> tmpSvd(std::move(svd));
130 tmpSvd.compute_impl_lapacke(matrix, computationOptions);
131 svd = std::move(tmpSvd);
139#define EIGEN_LAPACKE_SDD(EIGTYPE, EIGCOLROW, OPTIONS) \
141 template <typename Derived> \
142 inline BDCSVD<Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW, Dynamic, Dynamic>, OPTIONS>& \
143 BDCSVD<Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW, Dynamic, Dynamic>, OPTIONS>::compute_impl( \
144 const MatrixBase<Derived>& matrix, unsigned int computationOptions) { \
145 return internal::lapacke_helpers::BDCSVD_wrapper(*this, matrix, computationOptions); \
148#define EIGEN_LAPACK_SDD_OPTIONS(OPTIONS) \
149 EIGEN_LAPACKE_SDD(double, ColMajor, OPTIONS) \
150 EIGEN_LAPACKE_SDD(float, ColMajor, OPTIONS) \
151 EIGEN_LAPACKE_SDD(dcomplex, ColMajor, OPTIONS) \
152 EIGEN_LAPACKE_SDD(scomplex, ColMajor, OPTIONS) \
154 EIGEN_LAPACKE_SDD(double, RowMajor, OPTIONS) \
155 EIGEN_LAPACKE_SDD(float, RowMajor, OPTIONS) \
156 EIGEN_LAPACKE_SDD(dcomplex, RowMajor, OPTIONS) \
157 EIGEN_LAPACKE_SDD(scomplex, RowMajor, OPTIONS)
159EIGEN_LAPACK_SDD_OPTIONS(0)
169#undef EIGEN_LAPACK_SDD_OPTIONS
171#undef EIGEN_LAPACKE_SDD
BDCSVD()
Definition BDCSVD.h:121
@ InvalidInput
Definition Constants.h:464
@ Success
Definition Constants.h:457
@ NoConvergence
Definition Constants.h:461
@ ComputeFullV
Definition Constants.h:398
@ ComputeThinV
Definition Constants.h:400
@ ComputeFullU
Definition Constants.h:394
@ ComputeThinU
Definition Constants.h:396