65extern "C" int dgesdd_(
char *jobz, integer *m, integer *n,
double *a, integer *lda,
double *s,
double *u, integer *ldu,
66 double *vt, integer *ldvt,
double *work, integer *lwork, integer *iwork, integer *info);
347 int rows =
static_cast<int>(this->
getRows());
348 int cols =
static_cast<int>(this->
getCols());
349 cv::Mat m(rows, cols, CV_64F, this->
data);
350 cv::SVD opencvSVD(m);
351 cv::Mat opencvV = opencvSVD.vt;
352 cv::Mat opencvW = opencvSVD.w;
353 V.
resize(
static_cast<unsigned int>(opencvV.rows),
static_cast<unsigned int>(opencvV.cols));
354 w.resize(
static_cast<unsigned int>(opencvW.rows * opencvW.cols));
356 memcpy(V.
data, opencvV.data,
static_cast<size_t>(8 * opencvV.rows * opencvV.cols));
358 memcpy(w.data, opencvW.data,
static_cast<size_t>(8 * opencvW.rows * opencvW.cols));
359 this->
resize(
static_cast<unsigned int>(opencvSVD.u.rows),
static_cast<unsigned int>(opencvSVD.u.cols));
360 memcpy(this->
data, opencvSVD.u.data,
static_cast<size_t>(8 * opencvSVD.u.rows * opencvSVD.u.cols));
458 gsl_vector *work = gsl_vector_alloc(nc);
488 gsl_linalg_SV_decomp(&A, &V_, &S, work);
495 gsl_vector_free(work);
516 double *a =
new double[
static_cast<unsigned int>(nr * nc)];
518 memcpy(a, U.
data, this->getRows() * this->getCols() *
sizeof(
double));
524 integer m = (integer)(nc);
525 integer n = (integer)(nr);
528 integer ldvt = std::min<integer>(nr, nc);
534 integer *iwork =
new integer[8 *
static_cast<integer
>(std::min<integer>(nr, nc))];
547 dgesdd_((
char *)
"S", &m, &n, a, &lda, s, u, &ldu, vt, &ldvt, &wkopt, &lwork, iwork, &info);
548 lwork =
static_cast<int>(wkopt);
549 work =
new double[
static_cast<unsigned int>(lwork)];
551 dgesdd_((
char *)
"S", &m, &n, a, &lda, s, u, &ldu, vt, &ldvt, work, &lwork, iwork, &info);
654 Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> > M(this->
data, this->
getRows(),
656 Eigen::JacobiSVD<Eigen::MatrixXd>
svd(M, Eigen::ComputeThinU | Eigen::ComputeThinV);
658 Eigen::Map<Eigen::VectorXd> w_(w.data, w.size());
666 Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> > V_(V.
data, V.
getRows(), V.
getCols());
667 Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> > U_(this->
data,
rowNum,
colNum);
668 w_ =
svd.singularValues();