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();
void svd(vpColVector &w, vpMatrix &V)
Implementation of a matrix and operations on matrices.
void resize(const unsigned int nrows, const unsigned int ncols, const bool flagNullify=true, const bool recopy_=true)
double * data
Address of the first element of the data array.
unsigned int size() const
Return the number of elements of the 2D array.
unsigned int getCols() const
void svdLapack(vpColVector &w, vpMatrix &V)
vpMatrix transpose() const
void svdOpenCV(vpColVector &w, vpMatrix &V)
unsigned int getRows() const
void svdGsl(vpColVector &w, vpMatrix &V)
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)
void resize(const unsigned int i, const bool flagNullify=true)