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 #ifndef DOXYGEN_SHOULD_SKIP_THIS 53 #ifdef VISP_HAVE_EIGEN3 58 #include <gsl/gsl_linalg.h> 61 #if (VISP_HAVE_OPENCV_VERSION >= 0x020101) // Require opencv >= 2.1.1 62 #include <opencv2/core/core.hpp> 65 #ifdef VISP_HAVE_LAPACK 66 #ifdef VISP_HAVE_LAPACK_BUILT_IN 67 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);
84 #if (VISP_HAVE_OPENCV_VERSION >= 0x020101) // Require opencv >= 2.1.1 154 int rows = (int)this->
getRows();
155 int cols = (int)this->
getCols();
156 cv::Mat m(rows, cols, CV_64F, this->
data);
157 cv::SVD opencvSVD(m);
158 cv::Mat opencvV = opencvSVD.vt;
159 cv::Mat opencvW = opencvSVD.w;
160 V.
resize((
unsigned int)opencvV.rows, (
unsigned int)opencvV.cols);
161 w.
resize((
unsigned int)(opencvW.rows * opencvW.cols));
163 memcpy(V.
data, opencvV.data, (
size_t)(8 * opencvV.rows * opencvV.cols));
165 memcpy(w.
data, opencvW.data, (
size_t)(8 * opencvW.rows * opencvW.cols));
166 this->
resize((
unsigned int)opencvSVD.u.rows, (
unsigned int)opencvSVD.u.cols);
167 memcpy(this->
data, opencvSVD.u.data, (
size_t)(8 * opencvSVD.u.rows * opencvSVD.u.cols));
172 #ifdef VISP_HAVE_LAPACK 244 integer m = (integer)(this->
getCols());
245 integer n = (integer)(this->
getRows());
248 integer ldvt = (std::min)(m, n);
254 integer *iwork =
new integer[8 *
static_cast<integer
>((std::min)(n, m))];
257 double *a =
new double[
static_cast<unsigned int>(lda * n)];
260 double *vt = this->
data;
263 dgesdd_((
char *)
"S", &m, &n, a, &lda, s, u, &ldu, vt, &ldvt, &wkopt, &lwork, iwork, &info);
265 work =
new double[
static_cast<unsigned int>(lwork)];
267 dgesdd_((
char *)
"S", &m, &n, a, &lda, s, u, &ldu, vt, &ldvt, work, &lwork, iwork, &info);
355 gsl_vector *work = gsl_vector_alloc(nc);
380 gsl_linalg_SV_decomp(&A, &V_, &S, work);
382 gsl_vector_free(work);
386 #ifdef VISP_HAVE_EIGEN3 458 Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> > M(this->
data, this->
getRows(),
461 Eigen::JacobiSVD<Eigen::MatrixXd>
svd(M, Eigen::ComputeThinU | Eigen::ComputeThinV);
463 Eigen::Map<Eigen::VectorXd> w_(w.
data, w.
size());
464 Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> > V_(V.
data, V.
getRows(),
466 Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> > U_(this->
data, this->
getRows(),
468 w_ =
svd.singularValues();
474 #endif // #ifndef DOXYGEN_SHOULD_SKIP_THIS 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)
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.
unsigned int getCols() const
vpMatrix transpose() const
Implementation of column vector and the associated operations.
error that can be emited by the vpMatrix class and its derivates
void resize(const unsigned int i, const bool flagNullify=true)