39 #include <visp3/core/vpColVector.h>
40 #include <visp3/core/vpConfig.h>
41 #include <visp3/core/vpDebug.h>
42 #include <visp3/core/vpException.h>
43 #include <visp3/core/vpMath.h>
44 #include <visp3/core/vpMatrix.h>
45 #include <visp3/core/vpMatrixException.h>
51 #ifdef VISP_HAVE_EIGEN3
56 #include <gsl/gsl_linalg.h>
59 #if (VISP_HAVE_OPENCV_VERSION >= 0x020101) // Require opencv >= 2.1.1
60 #include <opencv2/core/core.hpp>
63 #ifdef VISP_HAVE_LAPACK
64 #ifdef VISP_HAVE_LAPACK_BUILT_IN
65 typedef long int integer;
70 extern "C" int dgesdd_(
char *jobz, integer *m, integer *n,
double *a, integer *lda,
double *s,
double *u, integer *ldu,
71 double *vt, integer *ldvt,
double *work, integer *lwork, integer *iwork, integer *info);
82 #if (VISP_HAVE_OPENCV_VERSION >= 0x020101) // Require opencv >= 2.1.1
152 int rows = (int)this->
getRows();
153 int cols = (int)this->
getCols();
154 cv::Mat m(rows, cols, CV_64F, this->
data);
155 cv::SVD opencvSVD(m);
156 cv::Mat opencvV = opencvSVD.vt;
157 cv::Mat opencvW = opencvSVD.w;
158 V.
resize((
unsigned int)opencvV.rows, (
unsigned int)opencvV.cols);
159 w.
resize((
unsigned int)(opencvW.rows * opencvW.cols));
161 memcpy(V.
data, opencvV.data, (
size_t)(8 * opencvV.rows * opencvV.cols));
163 memcpy(w.
data, opencvW.data, (
size_t)(8 * opencvW.rows * opencvW.cols));
164 this->
resize((
unsigned int)opencvSVD.u.rows, (
unsigned int)opencvSVD.u.cols);
165 memcpy(this->
data, opencvSVD.u.data, (
size_t)(8 * opencvSVD.u.rows * opencvSVD.u.cols));
170 #ifdef VISP_HAVE_LAPACK
242 integer m = (integer)(this->
getCols());
243 integer n = (integer)(this->
getRows());
246 integer ldvt = (std::min)(m, n);
252 integer *iwork =
new integer[8 * static_cast<integer>((std::min)(n, m))];
255 double *a =
new double[static_cast<unsigned int>(lda * n)];
258 double *vt = this->
data;
261 dgesdd_((
char *)
"S", &m, &n, a, &lda, s, u, &ldu, vt, &ldvt, &wkopt, &lwork, iwork, &info);
263 work =
new double[static_cast<unsigned int>(lwork)];
265 dgesdd_((
char *)
"S", &m, &n, a, &lda, s, u, &ldu, vt, &ldvt, work, &lwork, iwork, &info);
353 gsl_vector *work = gsl_vector_alloc(nc);
378 gsl_linalg_SV_decomp(&A, &V_, &S, work);
380 gsl_vector_free(work);
384 #ifdef VISP_HAVE_EIGEN3
456 Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> > M(this->
data, this->
getRows(),
459 Eigen::JacobiSVD<Eigen::MatrixXd>
svd(M, Eigen::ComputeThinU | Eigen::ComputeThinV);
461 Eigen::Map<Eigen::VectorXd> w_(w.
data, w.
size());
462 Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> > V_(V.
data, V.
getRows(),
464 Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> > U_(this->
data, this->
getRows(),
466 w_ =
svd.singularValues();