36 #include <visp3/core/vpColVector.h>
37 #include <visp3/core/vpConfig.h>
38 #include <visp3/core/vpDebug.h>
39 #include <visp3/core/vpException.h>
40 #include <visp3/core/vpMath.h>
41 #include <visp3/core/vpMatrix.h>
42 #include <visp3/core/vpMatrixException.h>
48 #ifdef VISP_HAVE_EIGEN3
52 #if defined(VISP_HAVE_OPENCV)
53 #include <opencv2/core/core.hpp>
56 #ifdef VISP_HAVE_LAPACK
58 #include <gsl/gsl_linalg.h>
62 typedef MKL_INT integer;
64 #if defined(VISP_HAVE_LAPACK_BUILT_IN)
65 typedef long int integer;
69 extern "C" int dgesdd_(
char *jobz, integer *m, integer *n,
double *a, integer *lda,
double *s,
double *u, integer *ldu,
70 double *vt, integer *ldvt,
double *work, integer *lwork, integer *iwork, integer *info);
82 #if defined(VISP_HAVE_OPENCV)
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 #if defined(VISP_HAVE_LAPACK)
258 gsl_vector *work = gsl_vector_alloc(nc);
287 gsl_linalg_SV_decomp(&A, &V_, &S, work);
294 gsl_vector_free(work);
301 integer m = (integer)(this->
getCols());
302 integer n = (integer)(this->
getRows());
305 integer ldvt = (std::min)(m, n);
311 integer *iwork =
new integer[8 *
static_cast<integer
>((std::min)(n, m))];
314 double *a =
new double[
static_cast<unsigned int>(lda * n)];
317 double *vt = this->
data;
320 dgesdd_((
char *)
"S", &m, &n, a, &lda, s, u, &ldu, vt, &ldvt, &wkopt, &lwork, iwork, &info);
322 work =
new double[
static_cast<unsigned int>(lwork)];
324 dgesdd_((
char *)
"S", &m, &n, a, &lda, s, u, &ldu, vt, &ldvt, work, &lwork, iwork, &info);
339 #ifdef VISP_HAVE_EIGEN3
411 Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> > M(this->
data, this->
getRows(),
414 Eigen::JacobiSVD<Eigen::MatrixXd>
svd(M, Eigen::ComputeThinU | Eigen::ComputeThinV);
416 Eigen::Map<Eigen::VectorXd> w_(w.
data, w.
size());
417 Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> > V_(V.
data, V.
getRows(),
419 Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> > U_(this->
data, this->
getRows(),
421 w_ =
svd.singularValues();
unsigned int getCols() const
double * data
Address of the first element of the data array.
void resize(unsigned int nrows, unsigned int ncols, bool flagNullify=true, bool recopy_=true)
unsigned int rowNum
Number of rows in the array.
unsigned int size() const
Return the number of elements of the 2D array.
unsigned int getRows() const
unsigned int colNum
Number of columns in the array.
Implementation of column vector and the associated operations.
void resize(unsigned int i, bool flagNullify=true)
error that can be emitted by the vpMatrix class and its derivatives
Implementation of a matrix and operations on matrices.
void svdLapack(vpColVector &w, vpMatrix &V)
void svd(vpColVector &w, vpMatrix &V)
void svdOpenCV(vpColVector &w, vpMatrix &V)
void svdEigen3(vpColVector &w, vpMatrix &V)
vpMatrix transpose() const