diff --git a/Eigen/src/SVD/BDCSVD.h b/Eigen/src/SVD/BDCSVD.h index b786de9bb..9af96ec31 100644 --- a/Eigen/src/SVD/BDCSVD.h +++ b/Eigen/src/SVD/BDCSVD.h @@ -163,7 +163,7 @@ public: */ EIGEN_DEPRECATED BDCSVD(Index rows, Index cols, unsigned int computationOptions) : m_algoswap(16), m_numIters(0) { - internal::check_svd_options_assertions(computationOptions); + internal::check_svd_options_assertions(computationOptions, rows, cols); allocate(rows, cols, computationOptions); } @@ -190,7 +190,7 @@ public: */ EIGEN_DEPRECATED BDCSVD(const MatrixType& matrix, unsigned int computationOptions) : m_algoswap(16), m_numIters(0) { - internal::check_svd_options_assertions(computationOptions); + internal::check_svd_options_assertions(computationOptions, matrix.rows(), matrix.cols()); compute_impl(matrix, computationOptions); } @@ -214,7 +214,7 @@ public: */ EIGEN_DEPRECATED BDCSVD& compute(const MatrixType& matrix, unsigned int computationOptions) { - internal::check_svd_options_assertions(computationOptions); + internal::check_svd_options_assertions(computationOptions, matrix.rows(), matrix.cols()); return compute_impl(matrix, computationOptions); } diff --git a/Eigen/src/SVD/JacobiSVD.h b/Eigen/src/SVD/JacobiSVD.h index 16ae8045c..8ae583a8e 100644 --- a/Eigen/src/SVD/JacobiSVD.h +++ b/Eigen/src/SVD/JacobiSVD.h @@ -568,7 +568,7 @@ class JacobiSVD : public SVDBase > { */ EIGEN_DEPRECATED JacobiSVD(Index rows, Index cols, unsigned int computationOptions) { - internal::check_svd_options_assertions(computationOptions); + internal::check_svd_options_assertions(computationOptions, rows, cols); allocate(rows, cols, computationOptions); } @@ -593,7 +593,7 @@ class JacobiSVD : public SVDBase > { */ EIGEN_DEPRECATED JacobiSVD(const MatrixType& matrix, unsigned int computationOptions) { - internal::check_svd_options_assertions(computationOptions); + internal::check_svd_options_assertions(computationOptions, matrix.rows(), matrix.cols()); compute_impl(matrix, computationOptions); } @@ -615,7 +615,7 @@ class JacobiSVD : public SVDBase > { */ EIGEN_DEPRECATED JacobiSVD& compute(const MatrixType& matrix, unsigned int computationOptions) { - internal::check_svd_options_assertions(m_computationOptions); + internal::check_svd_options_assertions(m_computationOptions, matrix.rows(), matrix.cols()); return compute_impl(matrix, computationOptions); } diff --git a/Eigen/src/SVD/SVDBase.h b/Eigen/src/SVD/SVDBase.h index e4ef257f8..85b3e2057 100644 --- a/Eigen/src/SVD/SVDBase.h +++ b/Eigen/src/SVD/SVDBase.h @@ -37,18 +37,19 @@ constexpr int should_svd_compute_full_u(int options) { return options & ComputeF constexpr int should_svd_compute_thin_v(int options) { return options & ComputeThinV; } constexpr int should_svd_compute_full_v(int options) { return options & ComputeFullV; } -template -void check_svd_options_assertions(unsigned int computationOptions) { +template +void check_svd_options_assertions(unsigned int computationOptions, Index rows, Index cols) { EIGEN_STATIC_ASSERT((Options & ComputationOptionsBits) == 0, "SVDBase: Cannot request U or V using both static and runtime options, even if they match. " "Requesting unitaries at runtime is DEPRECATED: " "Prefer requesting unitaries statically, using the Options template parameter."); - eigen_assert( - !(should_svd_compute_thin_u(computationOptions) && MatrixType::ColsAtCompileTime != Dynamic) && - !(should_svd_compute_thin_v(computationOptions) && MatrixType::ColsAtCompileTime != Dynamic) && - "SVDBase: If U or V are requested at runtime, then thin U and V are only available when " - "your matrix has a dynamic number of columns."); + eigen_assert(!(should_svd_compute_thin_u(computationOptions) && cols < rows && MatrixType::RowsAtCompileTime != Dynamic) && + !(should_svd_compute_thin_v(computationOptions) && rows < cols && MatrixType::ColsAtCompileTime != Dynamic) && + "SVDBase: If thin U is requested at runtime, your matrix must have more rows than columns or a dynamic number of rows." + "Similarly, if thin V is requested at runtime, you matrix must have more columns than rows or a dynamic number of columns."); (void)computationOptions; + (void)rows; + (void)cols; } template struct traits > diff --git a/test/svd_common.h b/test/svd_common.h index 1514f674f..c6f653ab8 100644 --- a/test/svd_common.h +++ b/test/svd_common.h @@ -482,9 +482,9 @@ void svd_compute_checks(const MatrixType& m) { template void svd_check_constructor_options(const MatrixType& m, unsigned int computationOptions) { - const bool thinUnitary = (computationOptions & ComputeThinU) != 0 || (computationOptions & ComputeThinV) != 0; - - if (SvdType::ColsAtCompileTime != Dynamic && thinUnitary) { + const bool fixedRowAndThinU = SvdType::RowsAtCompileTime != Dynamic && (computationOptions & ComputeThinU) != 0 && m.cols() < m.rows(); + const bool fixedColAndThinV = SvdType::ColsAtCompileTime != Dynamic && (computationOptions & ComputeThinV) != 0 && m.rows() < m.cols(); + if (fixedRowAndThinU || fixedColAndThinV) { VERIFY_RAISES_ASSERT(SvdType svd(m, computationOptions)); return; }