12#error a macro SVD_DEFAULT(MatrixType) must be defined prior to including svd_common.h
15#ifndef SVD_FOR_MIN_NORM
16#error a macro SVD_FOR_MIN_NORM(MatrixType) must be defined prior to including svd_common.h
24template<
typename SvdType,
typename MatrixType>
27 Index
rows =
m.rows();
28 Index
cols =
m.cols();
31 RowsAtCompileTime = MatrixType::RowsAtCompileTime,
32 ColsAtCompileTime = MatrixType::ColsAtCompileTime
35 typedef typename MatrixType::Scalar
Scalar;
36 typedef typename MatrixType::RealScalar
RealScalar;
37 typedef Matrix<Scalar, RowsAtCompileTime, RowsAtCompileTime> MatrixUType;
38 typedef Matrix<Scalar, ColsAtCompileTime, ColsAtCompileTime> MatrixVType;
41 sigma.diagonal() =
svd.singularValues().template cast<Scalar>();
42 MatrixUType u =
svd.matrixU();
43 MatrixVType
v =
svd.matrixV();
45 if(scaling<(std::numeric_limits<RealScalar>::min)())
47 VERIFY(sigma.cwiseAbs().maxCoeff() <= (std::numeric_limits<RealScalar>::min)());
58template<
typename SvdType,
typename MatrixType>
60 unsigned int computationOptions,
61 const SvdType& referenceSvd)
63 typedef typename MatrixType::RealScalar
RealScalar;
64 Index
rows =
m.rows();
65 Index
cols =
m.cols();
66 Index diagSize = (std::min)(
rows,
cols);
67 RealScalar prec = test_precision<RealScalar>();
69 SvdType
svd(
m, computationOptions);
73 if(computationOptions & (ComputeFullV|ComputeThinV))
75 VERIFY( (
svd.matrixV().adjoint()*
svd.matrixV()).isIdentity(prec) );
76 VERIFY_IS_APPROX(
svd.matrixV().leftCols(diagSize) *
svd.singularValues().asDiagonal() *
svd.matrixV().leftCols(diagSize).adjoint(),
77 referenceSvd.matrixV().leftCols(diagSize) * referenceSvd.singularValues().asDiagonal() * referenceSvd.matrixV().leftCols(diagSize).adjoint());
80 if(computationOptions & (ComputeFullU|ComputeThinU))
82 VERIFY( (
svd.matrixU().adjoint()*
svd.matrixU()).isIdentity(prec) );
83 VERIFY_IS_APPROX(
svd.matrixU().leftCols(diagSize) *
svd.singularValues().cwiseAbs2().asDiagonal() *
svd.matrixU().leftCols(diagSize).adjoint(),
84 referenceSvd.matrixU().leftCols(diagSize) * referenceSvd.singularValues().cwiseAbs2().asDiagonal() * referenceSvd.matrixU().leftCols(diagSize).adjoint());
91 if(computationOptions & ComputeFullU)
VERIFY_IS_APPROX(
svd.matrixU(), referenceSvd.matrixU());
92 if(computationOptions & ComputeThinU)
VERIFY_IS_APPROX(
svd.matrixU(), referenceSvd.matrixU().leftCols(diagSize));
93 if(computationOptions & ComputeFullV)
VERIFY_IS_APPROX(
svd.matrixV().cwiseAbs(), referenceSvd.matrixV().cwiseAbs());
94 if(computationOptions & ComputeThinV)
VERIFY_IS_APPROX(
svd.matrixV(), referenceSvd.matrixV().leftCols(diagSize));
99template<
typename SvdType,
typename MatrixType>
102 typedef typename MatrixType::Scalar
Scalar;
103 typedef typename MatrixType::RealScalar
RealScalar;
104 Index
rows =
m.rows();
105 Index
cols =
m.cols();
108 RowsAtCompileTime = MatrixType::RowsAtCompileTime,
109 ColsAtCompileTime = MatrixType::ColsAtCompileTime
112 typedef Matrix<Scalar, RowsAtCompileTime, Dynamic> RhsType;
113 typedef Matrix<Scalar, ColsAtCompileTime, Dynamic> SolutionType;
115 RhsType rhs = RhsType::Random(
rows, internal::random<Index>(1,
cols));
116 SvdType
svd(
m, computationOptions);
118 if(internal::is_same<RealScalar,double>::value)
svd.setThreshold(1
e-8);
119 else if(internal::is_same<RealScalar,float>::value)
svd.setThreshold(2
e-4);
121 SolutionType
x =
svd.solve(rhs);
130 if(internal::is_same<RealScalar,double>::value ||
svd.rank()==
m.diagonal().size())
135 if(internal::is_same<RealScalar,float>::value) ++g_test_level;
139 if(internal::is_same<RealScalar,float>::value) --g_test_level;
143 for(Index k=0;k<
x.rows();++k)
148 y.row(k) = (
RealScalar(1)+2*NumTraits<RealScalar>::epsilon())*
x.row(k);
151 if(internal::is_same<RealScalar,float>::value) ++g_test_level;
153 if(internal::is_same<RealScalar,float>::value) --g_test_level;
155 y.row(k) = (
RealScalar(1)-2*NumTraits<RealScalar>::epsilon())*
x.row(k);
156 residual_y = (
m*
y-rhs).norm();
158 if(internal::is_same<RealScalar,float>::value) ++g_test_level;
160 if(internal::is_same<RealScalar,float>::value) --g_test_level;
166template<
typename MatrixType>
169 typedef typename MatrixType::Scalar
Scalar;
170 Index
cols =
m.cols();
173 ColsAtCompileTime = MatrixType::ColsAtCompileTime
176 typedef Matrix<Scalar, ColsAtCompileTime, Dynamic> SolutionType;
180 RankAtCompileTime2 = ColsAtCompileTime==Dynamic ? Dynamic : (ColsAtCompileTime)/2+1,
181 RowsAtCompileTime3 = ColsAtCompileTime==Dynamic ? Dynamic : ColsAtCompileTime+1
183 typedef Matrix<Scalar, RankAtCompileTime2, ColsAtCompileTime> MatrixType2;
184 typedef Matrix<Scalar, RankAtCompileTime2, 1> RhsType2;
185 typedef Matrix<Scalar, ColsAtCompileTime, RankAtCompileTime2> MatrixType2T;
186 Index rank = RankAtCompileTime2==Dynamic ? internal::random<Index>(1,
cols) : Index(RankAtCompileTime2);
187 MatrixType2
m2(rank,
cols);
191 }
while(
SVD_FOR_MIN_NORM(MatrixType2)(
m2).setThreshold(test_precision<Scalar>()).rank()!=rank && (++guard)<10);
194 RhsType2 rhs2 = RhsType2::Random(rank);
196 HouseholderQR<MatrixType2T>
qr(
m2.adjoint());
197 Matrix<Scalar,Dynamic,1> tmp =
qr.matrixQR().topLeftCorner(rank,rank).template triangularView<Upper>().adjoint().solve(rhs2);
198 tmp.conservativeResize(
cols);
199 tmp.tail(
cols-rank).setZero();
200 SolutionType x21 =
qr.householderQ() * tmp;
203 SolutionType x22 = svd2.solve(rhs2);
209 typedef Matrix<Scalar, RowsAtCompileTime3, ColsAtCompileTime> MatrixType3;
210 typedef Matrix<Scalar, RowsAtCompileTime3, 1> RhsType3;
211 Index rows3 = RowsAtCompileTime3==Dynamic ? internal::random<Index>(rank+1,2*
cols) : Index(RowsAtCompileTime3);
212 Matrix<Scalar,RowsAtCompileTime3,Dynamic>
C = Matrix<Scalar,RowsAtCompileTime3,Dynamic>::Random(rows3,rank);
213 MatrixType3 m3 =
C *
m2;
214 RhsType3 rhs3 =
C * rhs2;
216 SolutionType x3 = svd3.solve(rhs3);
223template<
typename MatrixType,
typename SolverType>
230 if(MatrixType::ColsAtCompileTime==Dynamic)
238 typedef Matrix<typename MatrixType::Scalar, MatrixType::ColsAtCompileTime, MatrixType::ColsAtCompileTime> CMatrixType;
239 check_solverbase<CMatrixType, MatrixType>(
m,
solver,
rows,
cols, cols2);
243template<
typename SvdType,
typename MatrixType>
248 STATIC_CHECK(( internal::is_same<typename SvdType::StorageIndex,int>::value ));
250 SvdType fullSvd(
m, ComputeFullU|ComputeFullV);
252 CALL_SUBTEST(( svd_least_square<SvdType>(
m, ComputeFullU | ComputeFullV) ));
255 #if defined __INTEL_COMPILER
257 #pragma warning disable 111
269 if (MatrixType::ColsAtCompileTime == Dynamic) {
277 CALL_SUBTEST(( svd_least_square<SvdType>(
m, ComputeFullU | ComputeThinV) ));
278 CALL_SUBTEST(( svd_least_square<SvdType>(
m, ComputeThinU | ComputeFullV) ));
279 CALL_SUBTEST(( svd_least_square<SvdType>(
m, ComputeThinU | ComputeThinV) ));
286 Index diagSize = (std::min)(
m.rows(),
m.cols());
287 SvdType
svd(
m, ComputeThinU | ComputeThinV);
288 VERIFY_IS_APPROX(
m,
svd.matrixU().leftCols(diagSize) *
svd.singularValues().asDiagonal() *
svd.matrixV().leftCols(diagSize).adjoint());
295template<
typename Scalar>
303template<
typename SvdType,
typename MatrixType>
307 typedef typename MatrixType::Scalar
Scalar;
309 VERIFY(
sub(some_inf, some_inf) !=
sub(some_inf, some_inf));
310 svd.compute(MatrixType::Constant(10,10,some_inf), ComputeFullU | ComputeFullV);
313 Scalar nan = std::numeric_limits<Scalar>::quiet_NaN();
315 svd.compute(MatrixType::Constant(10,10,nan), ComputeFullU | ComputeFullV);
319 m(internal::random<int>(0,9), internal::random<int>(0,9)) = some_inf;
320 svd.compute(
m, ComputeFullU | ComputeFullV);
323 m = MatrixType::Zero(10,10);
324 m(internal::random<int>(0,9), internal::random<int>(0,9)) = nan;
325 svd.compute(
m, ComputeFullU | ComputeFullV);
330 m << 0, 2*NumTraits<Scalar>::epsilon(), 0.5,
333 svd.compute(
m, ComputeFullU | ComputeFullV);
341 svd.compute(
m, ComputeFullU | ComputeFullV);
350#if defined __INTEL_COMPILER
353#pragma warning disable 239
356 M << -7.90884e-313, -4.94e-324,
359 svd.compute(
M,ComputeFullU|ComputeFullV);
363 VectorXd value_set(9);
364 value_set << 0, 1, -1, 5.60844e-313, -5.60844e-313, 4.94e-324, -4.94e-324, -4.94e-223, 4.94e-223;
369 M << value_set(
id(0)), value_set(
id(1)), value_set(
id(2)), value_set(
id(3));
370 svd.compute(
M,ComputeFullU|ComputeFullV);
374 if(
id(k)>=value_set.size())
376 while(k<3 &&
id(k)>=value_set.size()) id(++k)++;
377 id.head(k).setZero();
381 }
while((
id<
int(value_set.size())).all());
383#if defined __INTEL_COMPILER
389 M3 << 4.4331978442502944e+307, -5.8585363752028680e+307, 6.4527017443412964e+307,
390 3.7841695601406358e+307, 2.4331702789740617e+306, -3.5235707140272905e+307,
391 -8.7190887618028355e+307, -7.3453213709232193e+307, -2.4367363684472105e+307;
394 svd3.compute(
M3,ComputeFullU|ComputeFullV);
400template<
typename MatrixType>
404 VectorXd value_set(3);
405 value_set << 0, 1, -1;
410 M << value_set(
id(0)), value_set(
id(1)), value_set(
id(2)), value_set(
id(3));
415 if(
id(k)>=value_set.size())
417 while(k<3 &&
id(k)>=value_set.size()) id(++k)++;
418 id.head(k).setZero();
422 }
while((
id<
int(value_set.size())).all());
428 Vector3f
v(3.f, 2.f, 1.f);
429 MatrixXf
m =
v.asDiagonal();
431 internal::set_is_malloc_allowed(
false);
434 internal::set_is_malloc_allowed(
true);
439 internal::set_is_malloc_allowed(
false);
441 internal::set_is_malloc_allowed(
true);
445 svd2.compute(
m, ComputeFullU | ComputeFullV);
448 internal::set_is_malloc_allowed(
false);
450 internal::set_is_malloc_allowed(
true);
452 SVD_DEFAULT(MatrixXf) svd3(3,3,ComputeFullU|ComputeFullV);
453 internal::set_is_malloc_allowed(
false);
455 internal::set_is_malloc_allowed(
true);
459 internal::set_is_malloc_allowed(
false);
460 svd2.compute(
m, ComputeFullU|ComputeFullV);
461 internal::set_is_malloc_allowed(
true);
464template<
typename SvdType,
typename MatrixType>
467 typedef typename MatrixType::Scalar
Scalar;
468 Index
rows =
m.rows();
469 Index
cols =
m.cols();
472 RowsAtCompileTime = MatrixType::RowsAtCompileTime,
473 ColsAtCompileTime = MatrixType::ColsAtCompileTime
476 typedef Matrix<Scalar, RowsAtCompileTime, 1> RhsType;
490 svd.singularValues();
493 svd.compute(
a, ComputeFullU);
497 svd.compute(
a, ComputeFullV);
502 if (!fullOnly && ColsAtCompileTime == Dynamic)
504 svd.compute(
a, ComputeThinU);
508 svd.compute(
a, ComputeThinV);
521#undef SVD_FOR_MIN_NORM
Matrix3f m
Definition AngleAxis_mimic_euler.cpp:1
bool test_isApprox(const AnnoyingScalar &a, const AnnoyingScalar &b)
Definition AnnoyingScalar.h:159
bool test_isMuchSmallerThan(const AnnoyingScalar &a, const AnnoyingScalar &b)
Definition AnnoyingScalar.h:162
ArrayXXi a
Definition Array_initializer_list_23_cxx11.cpp:1
Array< int, Dynamic, 1 > v
Definition Array_initializer_list_vector_cxx11.cpp:1
BiCGSTAB< SparseMatrix< double > > solver
Definition BiCGSTAB_simple.cpp:5
Array< double, 1, 3 > e(1./3., 0.5, 2.)
cout<< "Here is the matrix m:"<< endl<< m<< endl;JacobiSVD< MatrixXf > svd(m, ComputeThinU|ComputeThinV)
#define EIGEN_DONT_INLINE
Definition Macros.h:940
int rows
Definition Tutorial_commainit_02.cpp:1
int cols
Definition Tutorial_commainit_02.cpp:1
#define SVD_DEFAULT(M)
Definition bdcsvd.cpp:23
#define SVD_FOR_MIN_NORM(M)
Definition bdcsvd.cpp:24
Scalar * b
Definition benchVecAdd.cpp:17
SCALAR Scalar
Definition bench_gemm.cpp:46
Matrix< RealScalar, Dynamic, Dynamic > M
Definition bench_gemm.cpp:51
NumTraits< Scalar >::Real RealScalar
Definition bench_gemm.cpp:47
MatrixXf MatrixType
Definition benchmark-blocking-sizes.cpp:52
#define EIGEN_TEST_MAX_SIZE
Definition boostmultiprec.cpp:16
#define VERIFY(a)
Definition main.h:380
#define STATIC_CHECK(COND)
Definition main.h:397
#define CALL_SUBTEST(FUNC)
Definition main.h:399
#define VERIFY_IS_UNITARY(a)
Definition main.h:395
#define VERIFY_RAISES_ASSERT(a)
Definition main.h:340
#define abs(x)
Definition datatypes.h:17
set noclip points set clip one set noclip two set bar set border lt lw set xdata set ydata set zdata set x2data set y2data set boxwidth set dummy x
Definition gnuplot_common_settings.hh:12
#define VERIFY_IS_APPROX(a, b)
Definition integer_types.cpp:15
Scalar * y
Definition level1_cplx_impl.h:124
void qr()
Definition qr_colpivoting.cpp:99
EIGEN_DONT_INLINE Scalar zero()
Definition svd_common.h:296
void svd_min_norm(const MatrixType &m, unsigned int computationOptions)
Definition svd_common.h:167
void svd_compare_to_full(const MatrixType &m, unsigned int computationOptions, const SvdType &referenceSvd)
Definition svd_common.h:59
void svd_verify_assert(const MatrixType &m, bool fullOnly=false)
Definition svd_common.h:465
void svd_underoverflow()
Definition svd_common.h:348
void svd_inf_nan()
Definition svd_common.h:304
void svd_all_trivial_2x2(void(*cb)(const MatrixType &, bool))
Definition svd_common.h:401
void svd_test_solvers(const MatrixType &m, const SolverType &solver)
Definition svd_common.h:224
void svd_least_square(const MatrixType &m, unsigned int computationOptions)
Definition svd_common.h:100
void svd_test_all_computation_options(const MatrixType &m, bool full_only)
Definition svd_common.h:244
EIGEN_DONT_INLINE T sub(T a, T b)
Definition svd_common.h:299
void svd_preallocate()
Definition svd_common.h:426
void svd_check_full(const MatrixType &m, const SvdType &svd)
Definition svd_common.h:25