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)
151 int rows = (int)this->
getRows();
152 int cols = (int)this->
getCols();
153 cv::Mat m(rows, cols, CV_64F, this->
data);
154 cv::SVD opencvSVD(m);
155 cv::Mat opencvV = opencvSVD.vt;
156 cv::Mat opencvW = opencvSVD.w;
157 V.
resize((
unsigned int)opencvV.rows, (
unsigned int)opencvV.cols);
158 w.
resize((
unsigned int)(opencvW.rows * opencvW.cols));
160 memcpy(V.
data, opencvV.data, (
size_t)(8 * opencvV.rows * opencvV.cols));
162 memcpy(w.
data, opencvW.data, (
size_t)(8 * opencvW.rows * opencvW.cols));
163 this->
resize((
unsigned int)opencvSVD.u.rows, (
unsigned int)opencvSVD.u.cols);
164 memcpy(this->
data, opencvSVD.u.data, (
size_t)(8 * opencvSVD.u.rows * opencvSVD.u.cols));
169 #if defined(VISP_HAVE_LAPACK)
258 gsl_vector *work = gsl_vector_alloc(nc);
288 gsl_linalg_SV_decomp(&A, &V_, &S, work);
295 gsl_vector_free(work);
316 double *a =
new double[
static_cast<unsigned int>(nr * nc)];
318 memcpy(a, U.
data, this->getRows() * this->getCols() *
sizeof(
double));
324 integer m = (integer)(nc);
325 integer n = (integer)(nr);
328 integer ldvt = std::min<integer>(nr, nc);
334 integer *iwork =
new integer[8 *
static_cast<integer
>(std::min<integer>(nr, nc))];
347 dgesdd_((
char *)
"S", &m, &n, a, &lda, s, u, &ldu, vt, &ldvt, &wkopt, &lwork, iwork, &info);
349 work =
new double[
static_cast<unsigned int>(lwork)];
351 dgesdd_((
char *)
"S", &m, &n, a, &lda, s, u, &ldu, vt, &ldvt, work, &lwork, iwork, &info);
372 #ifdef VISP_HAVE_EIGEN3
450 Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> > M(this->
data, this->
getRows(),
452 Eigen::JacobiSVD<Eigen::MatrixXd>
svd(M, Eigen::ComputeThinU | Eigen::ComputeThinV);
454 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(), V.
getCols());
463 Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> > U_(this->
data,
rowNum,
colNum);
464 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