Fixed bad memory access in the SVD.

This commit is contained in:
Hauke Heibel 2010-09-23 11:15:36 +02:00
parent e0ea25fc21
commit 62bf04b339
2 changed files with 4 additions and 2 deletions

View File

@ -464,7 +464,7 @@ struct ei_solve_retval<SVD<_MatrixType>, Rhs>
{ {
Matrix<Scalar,MatrixType::RowsAtCompileTime,1> aux = dec().matrixU().adjoint() * rhs().col(j); Matrix<Scalar,MatrixType::RowsAtCompileTime,1> aux = dec().matrixU().adjoint() * rhs().col(j);
for (Index i = 0; i < dec().rows(); ++i) for (Index i = 0; i < dec().singularValues().size(); ++i)
{ {
Scalar si = dec().singularValues().coeff(i); Scalar si = dec().singularValues().coeff(i);
if(si == RealScalar(0)) if(si == RealScalar(0))
@ -472,6 +472,8 @@ struct ei_solve_retval<SVD<_MatrixType>, Rhs>
else else
aux.coeffRef(i) /= si; aux.coeffRef(i) /= si;
} }
aux.tail(aux.size() - dec().singularValues().size()).setZero();
const Index minsize = std::min(dec().rows(),dec().cols()); const Index minsize = std::min(dec().rows(),dec().cols());
dst.col(j).head(minsize) = aux.head(minsize); dst.col(j).head(minsize) = aux.head(minsize);
if(dec().cols()>dec().rows()) dst.col(j).tail(cols()-minsize).setZero(); if(dec().cols()>dec().rows()) dst.col(j).tail(cols()-minsize).setZero();

View File

@ -51,7 +51,7 @@ template<typename MatrixType> void svd(const MatrixType& m)
} }
if (rows==cols) if (rows>=cols)
{ {
if (ei_is_same_type<RealScalar,float>::ret) if (ei_is_same_type<RealScalar,float>::ret)
{ {