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
19 #ifndef SVD_STATIC_OPTIONS
20 #error a macro SVD_STATIC_OPTIONS(MatrixType, Options) must be defined prior to including svd_common.h
28 template <
typename SvdType,
typename MatrixType>
33 enum { RowsAtCompileTime = MatrixType::RowsAtCompileTime, ColsAtCompileTime = MatrixType::ColsAtCompileTime };
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();
55 template <
typename MatrixType,
typename SvdType,
int Options>
61 RealScalar prec = test_precision<RealScalar>();
68 VERIFY((
svd.matrixV().adjoint() *
svd.matrixV()).isIdentity(prec));
70 svd.matrixV().leftCols(diagSize).adjoint(),
71 referenceSvd.matrixV().leftCols(diagSize) * referenceSvd.singularValues().asDiagonal() *
72 referenceSvd.matrixV().leftCols(diagSize).adjoint());
76 VERIFY((
svd.matrixU().adjoint() *
svd.matrixU()).isIdentity(prec));
78 svd.matrixU().leftCols(diagSize).adjoint(),
79 referenceSvd.matrixU().leftCols(diagSize) *
80 referenceSvd.singularValues().cwiseAbs2().asDiagonal() *
81 referenceSvd.matrixU().leftCols(diagSize).adjoint());
96 template <
typename SvdType,
typename MatrixType>
103 enum { RowsAtCompileTime = MatrixType::RowsAtCompileTime, ColsAtCompileTime = MatrixType::ColsAtCompileTime };
105 typedef Matrix<Scalar, RowsAtCompileTime, Dynamic> RhsType;
106 typedef Matrix<Scalar, ColsAtCompileTime, Dynamic> SolutionType;
108 RhsType rhs = RhsType::Random(
rows, internal::random<Index>(1,
cols));
116 SolutionType
x =
svd.solve(rhs);
148 residual_y = (
m *
y - rhs).norm();
158 template <
typename MatrixType,
int Options>
163 enum { ColsAtCompileTime = MatrixType::ColsAtCompileTime };
165 typedef Matrix<Scalar, ColsAtCompileTime, Dynamic> SolutionType;
169 RankAtCompileTime2 = ColsAtCompileTime ==
Dynamic ?
Dynamic : (ColsAtCompileTime) / 2 + 1,
170 RowsAtCompileTime3 = ColsAtCompileTime ==
Dynamic ?
Dynamic : ColsAtCompileTime + 1
172 typedef Matrix<Scalar, RankAtCompileTime2, ColsAtCompileTime> MatrixType2;
173 typedef Matrix<Scalar, RankAtCompileTime2, 1> RhsType2;
174 typedef Matrix<Scalar, ColsAtCompileTime, RankAtCompileTime2> MatrixType2T;
175 Index rank = RankAtCompileTime2 ==
Dynamic ? internal::random<Index>(1,
cols) :
Index(RankAtCompileTime2);
176 MatrixType2
m2(rank,
cols);
180 }
while (
SVD_FOR_MIN_NORM(MatrixType2)(
m2).setThreshold(test_precision<Scalar>()).rank() != rank && (++guard) < 10);
183 RhsType2 rhs2 = RhsType2::Random(rank);
185 HouseholderQR<MatrixType2T>
qr(
m2.adjoint());
186 Matrix<Scalar, Dynamic, 1>
tmp =
187 qr.matrixQR().topLeftCorner(rank, rank).template triangularView<Upper>().adjoint().solve(rhs2);
190 SolutionType x21 =
qr.householderQ() *
tmp;
193 SolutionType x22 = svd2.solve(rhs2);
199 typedef Matrix<Scalar, RowsAtCompileTime3, ColsAtCompileTime> MatrixType3;
200 typedef Matrix<Scalar, RowsAtCompileTime3, 1> RhsType3;
201 Index rows3 = RowsAtCompileTime3 ==
Dynamic ? internal::random<Index>(rank + 1, 2 *
cols) :
Index(RowsAtCompileTime3);
202 Matrix<Scalar, RowsAtCompileTime3, Dynamic>
C = Matrix<Scalar, RowsAtCompileTime3, Dynamic>::Random(rows3, rank);
203 MatrixType3 m3 =
C *
m2;
204 RhsType3 rhs3 =
C * rhs2;
206 SolutionType x3 = svd3.solve(rhs3);
213 template <
typename MatrixType,
typename SolverType>
220 if (MatrixType::ColsAtCompileTime ==
Dynamic) {
225 typedef Matrix<typename MatrixType::Scalar, MatrixType::ColsAtCompileTime, MatrixType::ColsAtCompileTime> CMatrixType;
226 check_solverbase<CMatrixType, MatrixType>(
m,
solver,
rows,
cols, cols2);
231 template <
typename Scalar>
237 template <
typename T>
244 template <
typename MatrixType>
249 VERIFY(
sub(some_inf, some_inf) !=
sub(some_inf, some_inf));
250 svd.compute(MatrixType::Constant(10, 10, some_inf));
253 Scalar nan = std::numeric_limits<Scalar>::quiet_NaN();
255 svd.compute(MatrixType::Constant(10, 10, nan));
259 m(internal::random<int>(0, 9), internal::random<int>(0, 9)) = some_inf;
264 m(internal::random<int>(0, 9), internal::random<int>(0, 9)) = nan;
276 m << 1, 0, 0, 0, 0, 3, 1,
min, 1, 0, 1, nan, 0, nan, nan, 0;
285 #if defined __INTEL_COMPILER
288 #pragma warning disable 239
291 M << -7.90884e-313, -4.94e-324, 0, 5.60844e-313;
297 VectorXd value_set(9);
298 value_set << 0, 1, -1, 5.60844e-313, -5.60844e-313, 4.94e-324, -4.94e-324, -4.94e-223, 4.94e-223;
299 Array4i id(0, 0, 0, 0);
302 M << value_set(
id(0)), value_set(
id(1)), value_set(
id(2)), value_set(
id(3));
307 if (
id(
k) >= value_set.size()) {
308 while (
k < 3 &&
id(
k) >= value_set.size()) id(++
k)++;
309 id.head(
k).setZero();
313 }
while ((
id <
int(value_set.size())).all());
315 #if defined __INTEL_COMPILER
321 M3 << 4.4331978442502944e+307, -5.8585363752028680e+307, 6.4527017443412964e+307, 3.7841695601406358e+307,
322 2.4331702789740617e+306, -3.5235707140272905e+307, -8.7190887618028355e+307, -7.3453213709232193e+307,
323 -2.4367363684472105e+307;
330 template <
typename MatrixType>
333 VectorXd value_set(3);
334 value_set << 0, 1, -1;
335 Array4i id(0, 0, 0, 0);
338 M << value_set(
id(0)), value_set(
id(1)), value_set(
id(2)), value_set(
id(3));
343 if (
id(
k) >= value_set.size()) {
344 while (
k < 3 &&
id(
k) >= value_set.size()) id(++
k)++;
345 id.head(
k).setZero();
349 }
while ((
id <
int(value_set.size())).all());
354 Vector3f
v(3.f, 2.f, 1.f);
355 MatrixXf
m =
v.asDiagonal();
357 internal::set_is_malloc_allowed(
false);
360 internal::set_is_malloc_allowed(
true);
367 internal::set_is_malloc_allowed(
false);
369 internal::set_is_malloc_allowed(
true);
373 internal::set_is_malloc_allowed(
false);
375 internal::set_is_malloc_allowed(
true);
378 template <
typename MatrixType,
int QRPreconditioner = 0>
380 enum { RowsAtCompileTime = MatrixType::RowsAtCompileTime };
382 typedef Matrix<typename MatrixType::Scalar, RowsAtCompileTime, 1> RhsType;
408 template <
typename MatrixType,
int QRPreconditioner = 0>
410 enum { RowsAtCompileTime = MatrixType::RowsAtCompileTime };
411 typedef Matrix<typename MatrixType::Scalar, RowsAtCompileTime, 1> RhsType;
423 svd_verify_assert_full_only<MatrixType, QRPreconditioner>(
m);
426 template <
typename MatrixType,
int Options>
431 RowsAtCompileTime = MatrixType::RowsAtCompileTime,
432 ColsAtCompileTime = MatrixType::ColsAtCompileTime,
434 MatrixURowsAtCompileTime = SVDType::MatrixUType::RowsAtCompileTime,
435 MatrixUColsAtCompileTime = SVDType::MatrixUType::ColsAtCompileTime,
436 MatrixVRowsAtCompileTime = SVDType::MatrixVType::RowsAtCompileTime,
437 MatrixVColsAtCompileTime = SVDType::MatrixVType::ColsAtCompileTime
440 SVDType staticSvd(
m);
442 VERIFY(MatrixURowsAtCompileTime == RowsAtCompileTime);
443 VERIFY(MatrixVRowsAtCompileTime == ColsAtCompileTime);
450 VERIFY(staticSvd.computeU());
452 VERIFY(!staticSvd.computeU());
454 VERIFY(staticSvd.computeV());
456 VERIFY(!staticSvd.computeV());
458 if (staticSvd.computeU())
VERIFY(staticSvd.matrixU().isUnitary());
459 if (staticSvd.computeV())
VERIFY(staticSvd.matrixV().isUnitary());
461 if (staticSvd.computeU() && staticSvd.computeV()) {
463 svd_least_square<SVDType, MatrixType>(
m);
469 template <
typename MatrixType,
int QRPreconditioner = 0>
474 svd_compute_checks<MatrixType, QRPreconditioner>(
m);
475 svd_compute_checks<MatrixType, QRPreconditioner | ComputeThinU>(
m);
476 svd_compute_checks<MatrixType, QRPreconditioner | ComputeThinV>(
m);
477 svd_compute_checks<MatrixType, QRPreconditioner | ComputeThinU | ComputeThinV>(
m);
479 svd_compute_checks<MatrixType, QRPreconditioner | ComputeThinU | ComputeFullV>(
m);
480 svd_compute_checks<MatrixType, QRPreconditioner | ComputeFullU | ComputeThinV>(
m);
483 FullSvdType fullSvd(
m);
485 svd_compare_to_full<MatrixType, FullSvdType, QRPreconditioner | ComputeFullU | ComputeFullV>(
m, fullSvd);
488 template <
typename MatrixType,
int QRPreconditioner = 0>
492 svd_compute_checks<MatrixType, QRPreconditioner | ComputeFullU>(
m);
493 svd_compute_checks<MatrixType, QRPreconditioner | ComputeFullV>(
m);
494 svd_compute_checks<MatrixType, QRPreconditioner | ComputeFullU | ComputeFullV>(
m);
500 template <
typename MatrixType,
int QRPreconditioner = 0>
503 MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
504 MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
507 int rows = MaxRowsAtCompileTime ==
Dynamic ? initialRows : (
std::min)(initialRows, (
int)MaxRowsAtCompileTime);
508 int cols = MaxColsAtCompileTime ==
Dynamic ? initialCols : (
std::min)(initialCols, (
int)MaxColsAtCompileTime);
517 MatrixType n(MaxRowsAtCompileTime, MaxColsAtCompileTime);
520 mixedSvd1.compute(
n);
521 mixedSvd2.compute(
n);
524 MatrixX<typename MatrixType::Scalar> dynamicMatrix(MaxRowsAtCompileTime + 1, MaxColsAtCompileTime + 1);
532 template <
typename SvdType,
typename MatrixType>
537 enum { RowsAtCompileTime = MatrixType::RowsAtCompileTime, ColsAtCompileTime = MatrixType::ColsAtCompileTime };
539 typedef Matrix<Scalar, RowsAtCompileTime, 1> RhsType;
552 #undef SVD_FOR_MIN_NORM
553 #undef SVD_STATIC_OPTIONS
AnnoyingScalar abs(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:135
bool test_isApprox(const AnnoyingScalar &a, const AnnoyingScalar &b)
Definition: AnnoyingScalar.h:196
bool test_isMuchSmallerThan(const AnnoyingScalar &a, const AnnoyingScalar &b)
Definition: AnnoyingScalar.h:200
AnnoyingScalar sqrt(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:134
Array< int, Dynamic, 1 > v
Definition: Array_initializer_list_vector_cxx11.cpp:1
BiCGSTAB< SparseMatrix< double > > solver
Definition: BiCGSTAB_simple.cpp:5
const unsigned n
Definition: CG3DPackingUnitTest.cpp:11
Array< double, 1, 3 > e(1./3., 0.5, 2.)
HouseholderQR< MatrixXf > qr(A)
cout<< "Here is the matrix m:"<< endl<< m<< endl;JacobiSVD< MatrixXf, ComputeThinU|ComputeThinV > svd(m)
#define EIGEN_DONT_INLINE
Definition: Macros.h:853
int rows
Definition: Tutorial_commainit_02.cpp:1
int cols
Definition: Tutorial_commainit_02.cpp:1
#define SVD_DEFAULT(M)
Definition: bdcsvd.cpp:20
#define SVD_STATIC_OPTIONS(M, O)
Definition: bdcsvd.cpp:22
#define SVD_FOR_MIN_NORM(M)
Definition: bdcsvd.cpp:21
Scalar * b
Definition: benchVecAdd.cpp:17
SCALAR Scalar
Definition: bench_gemm.cpp:45
Matrix< RealScalar, Dynamic, Dynamic > M
Definition: bench_gemm.cpp:50
NumTraits< Scalar >::Real RealScalar
Definition: bench_gemm.cpp:46
MatrixXf MatrixType
Definition: benchmark-blocking-sizes.cpp:52
#define EIGEN_TEST_MAX_SIZE
Definition: boostmultiprec.cpp:16
The matrix class, also used for vectors and row-vectors.
Definition: Eigen/Eigen/src/Core/Matrix.h:186
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void conservativeResize(Index rows, Index cols)
Definition: PlainObjectBase.h:398
EIGEN_DEVICE_FUNC Derived & setZero(Index size)
Definition: CwiseNullaryOp.h:569
Definition: matrices.h:74
#define min(a, b)
Definition: datatypes.h:22
@ NoQRPreconditioner
Definition: Constants.h:423
@ InvalidInput
Definition: Constants.h:447
@ ComputeFullV
Definition: Constants.h:393
@ ComputeThinV
Definition: Constants.h:395
@ ComputeFullU
Definition: Constants.h:389
@ ComputeThinU
Definition: Constants.h:391
#define VERIFY_IS_APPROX(a, b)
Definition: integer_types.cpp:13
Scalar * y
Definition: level1_cplx_impl.h:128
const Scalar * a
Definition: level2_cplx_impl.h:32
int * m
Definition: level2_cplx_impl.h:294
char char char int int * k
Definition: level2_impl.h:374
Eigen::Matrix< Scalar, Dynamic, Dynamic, ColMajor > tmp
Definition: level3_impl.h:365
#define VERIFY(a)
Definition: main.h:362
#define CALL_SUBTEST(FUNC)
Definition: main.h:382
#define VERIFY_IS_UNITARY(a)
Definition: main.h:378
#define VERIFY_RAISES_ASSERT(a)
Definition: main.h:329
@ QRPreconditionerBits
Definition: SVDBase.h:27
constexpr int min_size_prefer_dynamic(A a, B b)
Definition: Meta.h:668
squared absolute value
Definition: GlobalFunctions.h:87
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:83
static int g_test_level
Definition: main.h:190
const int Dynamic
Definition: Constants.h:25
int sigma
Definition: calibrate.py:179
double Zero
Definition: pseudosolid_node_update_elements.cc:35
double epsilon
Definition: osc_ring_sarah_asymptotics.h:43
list x
Definition: plotDoE.py:28
void svd_option_checks_full_only(const MatrixType &input)
Definition: svd_common.h:489
void svd_inf_nan()
Definition: svd_common.h:245
void svd_compute_checks(const MatrixType &m)
Definition: svd_common.h:427
void svd_all_trivial_2x2(void(*cb)(const MatrixType &))
Definition: svd_common.h:331
void svd_thin_option_checks(const MatrixType &input)
Definition: svd_common.h:470
EIGEN_DONT_INLINE Scalar zero()
Definition: svd_common.h:232
void svd_min_norm(const MatrixType &m)
Definition: svd_common.h:159
void svd_verify_assert_full_only(const MatrixType &input=MatrixType())
Definition: svd_common.h:379
void svd_underoverflow()
Definition: svd_common.h:284
void svd_verify_constructor_options_assert(const MatrixType &m)
Definition: svd_common.h:533
void svd_test_solvers(const MatrixType &m, const SolverType &solver)
Definition: svd_common.h:214
void svd_compare_to_full(const MatrixType &m, const SvdType &referenceSvd)
Definition: svd_common.h:56
EIGEN_DONT_INLINE T sub(T a, T b)
Definition: svd_common.h:238
void svd_least_square(const MatrixType &m)
Definition: svd_common.h:97
void svd_check_max_size_matrix(int initialRows, int initialCols)
Definition: svd_common.h:501
void svd_preallocate()
Definition: svd_common.h:353
void svd_check_full(const MatrixType &m, const SvdType &svd)
Definition: svd_common.h:29
void svd_verify_assert(const MatrixType &input=MatrixType())
Definition: svd_common.h:409
void svd_fill_random(MatrixType &m, int Option=0)
Definition: svd_fill.h:27