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 55 #if (VISP_HAVE_OPENCV_VERSION >= 0x020101) // Require opencv >= 2.1.1 56 #include <opencv2/core/core.hpp> 59 #ifdef VISP_HAVE_LAPACK 61 # include <gsl/gsl_linalg.h> 65 typedef MKL_INT integer;
67 # if defined(VISP_HAVE_LAPACK_BUILT_IN) 68 typedef long int integer;
72 extern "C" int dgesdd_(
char *jobz, integer *m, integer *n,
double *a, integer *lda,
double *s,
double *u, integer *ldu,
73 double *vt, integer *ldvt,
double *work, integer *lwork, integer *iwork, integer *info);
85 #if (VISP_HAVE_OPENCV_VERSION >= 0x020101) // Require opencv >= 2.1.1 155 int rows = (int)this->
getRows();
156 int cols = (int)this->
getCols();
157 cv::Mat m(rows, cols, CV_64F, this->
data);
158 cv::SVD opencvSVD(m);
159 cv::Mat opencvV = opencvSVD.vt;
160 cv::Mat opencvW = opencvSVD.w;
161 V.
resize((
unsigned int)opencvV.rows, (
unsigned int)opencvV.cols);
162 w.
resize((
unsigned int)(opencvW.rows * opencvW.cols));
164 memcpy(V.
data, opencvV.data, (
size_t)(8 * opencvV.rows * opencvV.cols));
166 memcpy(w.
data, opencvW.data, (
size_t)(8 * opencvW.rows * opencvW.cols));
167 this->
resize((
unsigned int)opencvSVD.u.rows, (
unsigned int)opencvSVD.u.cols);
168 memcpy(this->
data, opencvSVD.u.data, (
size_t)(8 * opencvSVD.u.rows * opencvSVD.u.cols));
173 #if defined(VISP_HAVE_LAPACK) 262 gsl_vector *work = gsl_vector_alloc(nc);
292 gsl_linalg_SV_decomp(&A, &V_, &S, work);
299 gsl_vector_free(work);
306 integer m = (integer)(this->
getCols());
307 integer n = (integer)(this->
getRows());
310 integer ldvt = (std::min)(m, n);
316 integer *iwork =
new integer[8 *
static_cast<integer
>((std::min)(n, m))];
319 double *a =
new double[
static_cast<unsigned int>(lda * n)];
322 double *vt = this->
data;
325 dgesdd_((
char *)
"S", &m, &n, a, &lda, s, u, &ldu, vt, &ldvt, &wkopt, &lwork, iwork, &info);
327 work =
new double[
static_cast<unsigned int>(lwork)];
329 dgesdd_((
char *)
"S", &m, &n, a, &lda, s, u, &ldu, vt, &ldvt, work, &lwork, iwork, &info);
344 #ifdef VISP_HAVE_EIGEN3 416 Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> > M(this->
data, this->
getRows(),
419 Eigen::JacobiSVD<Eigen::MatrixXd>
svd(M, Eigen::ComputeThinU | Eigen::ComputeThinV);
421 Eigen::Map<Eigen::VectorXd> w_(w.
data, w.
size());
422 Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> > V_(V.
data, V.
getRows(),
424 Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> > U_(this->
data, this->
getRows(),
426 w_ = svd.singularValues();
void svd(vpColVector &w, vpMatrix &V)
Implementation of a matrix and operations on matrices.
void resize(unsigned int nrows, unsigned int ncols, bool flagNullify=true, bool recopy_=true)
unsigned int getRows() const
double * data
Address of the first element of the data array.
unsigned int size() const
Return the number of elements of the 2D array.
void svdLapack(vpColVector &w, vpMatrix &V)
unsigned int getCols() const
unsigned int rowNum
Number of rows in the array.
void svdOpenCV(vpColVector &w, vpMatrix &V)
vpMatrix transpose() const
unsigned int colNum
Number of columns in the array.
void resize(unsigned int i, bool flagNullify=true)
Implementation of column vector and the associated operations.
error that can be emited by the vpMatrix class and its derivates
void svdEigen3(vpColVector &w, vpMatrix &V)