diff options
author | Matthieu Vigne <matthieu.vigne@laposte.net> | 2018-10-31 20:28:18 +0100 |
---|---|---|
committer | Matthieu Vigne <matthieu.vigne@laposte.net> | 2018-10-31 20:28:18 +0100 |
commit | 8d7a73e48e82b41f8e8b90afb434c98452556990 (patch) | |
tree | e974f6944458c71097e272ab70d899ad215caea9 | |
parent | 66b28e290d426899bda932fa3b0617d63b3a2a75 (diff) |
bug #1617: Fix SolveTriangular.solveInPlace crashing for empty matrix.
This made FullPivLU.kernel() crash when used on the zero matrix.
Add unit test for FullPivLU.kernel() on the zero matrix.
-rw-r--r-- | Eigen/src/Core/SolveTriangular.h | 3 | ||||
-rw-r--r-- | test/lu.cpp | 4 |
2 files changed, 7 insertions, 0 deletions
diff --git a/Eigen/src/Core/SolveTriangular.h b/Eigen/src/Core/SolveTriangular.h index a0011d4f9..2e061caab 100644 --- a/Eigen/src/Core/SolveTriangular.h +++ b/Eigen/src/Core/SolveTriangular.h @@ -169,6 +169,9 @@ EIGEN_DEVICE_FUNC void TriangularViewImpl<MatrixType,Mode,Dense>::solveInPlace(c OtherDerived& other = _other.const_cast_derived(); eigen_assert( derived().cols() == derived().rows() && ((Side==OnTheLeft && derived().cols() == other.rows()) || (Side==OnTheRight && derived().cols() == other.cols())) ); eigen_assert((!(Mode & ZeroDiag)) && bool(Mode & (Upper|Lower))); + // If solving for a 0x0 matrix, nothing to do, simply return. + if (derived().cols() == 0) + return; enum { copy = (internal::traits<OtherDerived>::Flags & RowMajorBit) && OtherDerived::IsVectorAtCompileTime && OtherDerived::SizeAtCompileTime!=1}; typedef typename internal::conditional<copy, diff --git a/test/lu.cpp b/test/lu.cpp index 144496e91..effde6060 100644 --- a/test/lu.cpp +++ b/test/lu.cpp @@ -57,6 +57,10 @@ template<typename MatrixType> void lu_non_invertible() // The image of the zero matrix should consist of a single (zero) column vector VERIFY((MatrixType::Zero(rows,cols).fullPivLu().image(MatrixType::Zero(rows,cols)).cols() == 1)); + // The kernel of the zero matrix is the entire space, and thus is an invertible matrix of dimensions cols. + KernelMatrixType kernel = MatrixType::Zero(rows,cols).fullPivLu().kernel(); + VERIFY((kernel.fullPivLu().isInvertible())); + MatrixType m1(rows, cols), m3(rows, cols2); CMatrixType m2(cols, cols2); createRandomPIMatrixOfRank(rank, rows, cols, m1); |