mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-07-09 22:51:51 +08:00
Fix bug #807: Missing scalar type cast in umeyama()
(transplanted from b4beba72a2d31934d3a2a49401c792f9a8cd49e0 )
This commit is contained in:
parent
da81e863e2
commit
35c9f8779d
@ -113,7 +113,7 @@ umeyama(const MatrixBase<Derived>& src, const MatrixBase<OtherDerived>& dst, boo
|
|||||||
const Index n = src.cols(); // number of measurements
|
const Index n = src.cols(); // number of measurements
|
||||||
|
|
||||||
// required for demeaning ...
|
// required for demeaning ...
|
||||||
const RealScalar one_over_n = 1 / static_cast<RealScalar>(n);
|
const RealScalar one_over_n = RealScalar(1) / static_cast<RealScalar>(n);
|
||||||
|
|
||||||
// computation of mean
|
// computation of mean
|
||||||
const VectorType src_mean = src.rowwise().sum() * one_over_n;
|
const VectorType src_mean = src.rowwise().sum() * one_over_n;
|
||||||
@ -136,16 +136,16 @@ umeyama(const MatrixBase<Derived>& src, const MatrixBase<OtherDerived>& dst, boo
|
|||||||
|
|
||||||
// Eq. (39)
|
// Eq. (39)
|
||||||
VectorType S = VectorType::Ones(m);
|
VectorType S = VectorType::Ones(m);
|
||||||
if (sigma.determinant()<0) S(m-1) = -1;
|
if (sigma.determinant()<Scalar(0)) S(m-1) = Scalar(-1);
|
||||||
|
|
||||||
// Eq. (40) and (43)
|
// Eq. (40) and (43)
|
||||||
const VectorType& d = svd.singularValues();
|
const VectorType& d = svd.singularValues();
|
||||||
Index rank = 0; for (Index i=0; i<m; ++i) if (!internal::isMuchSmallerThan(d.coeff(i),d.coeff(0))) ++rank;
|
Index rank = 0; for (Index i=0; i<m; ++i) if (!internal::isMuchSmallerThan(d.coeff(i),d.coeff(0))) ++rank;
|
||||||
if (rank == m-1) {
|
if (rank == m-1) {
|
||||||
if ( svd.matrixU().determinant() * svd.matrixV().determinant() > 0 ) {
|
if ( svd.matrixU().determinant() * svd.matrixV().determinant() > Scalar(0) ) {
|
||||||
Rt.block(0,0,m,m).noalias() = svd.matrixU()*svd.matrixV().transpose();
|
Rt.block(0,0,m,m).noalias() = svd.matrixU()*svd.matrixV().transpose();
|
||||||
} else {
|
} else {
|
||||||
const Scalar s = S(m-1); S(m-1) = -1;
|
const Scalar s = S(m-1); S(m-1) = Scalar(-1);
|
||||||
Rt.block(0,0,m,m).noalias() = svd.matrixU() * S.asDiagonal() * svd.matrixV().transpose();
|
Rt.block(0,0,m,m).noalias() = svd.matrixU() * S.asDiagonal() * svd.matrixV().transpose();
|
||||||
S(m-1) = s;
|
S(m-1) = s;
|
||||||
}
|
}
|
||||||
@ -156,7 +156,7 @@ umeyama(const MatrixBase<Derived>& src, const MatrixBase<OtherDerived>& dst, boo
|
|||||||
if (with_scaling)
|
if (with_scaling)
|
||||||
{
|
{
|
||||||
// Eq. (42)
|
// Eq. (42)
|
||||||
const Scalar c = 1/src_var * svd.singularValues().dot(S);
|
const Scalar c = Scalar(1)/src_var * svd.singularValues().dot(S);
|
||||||
|
|
||||||
// Eq. (41)
|
// Eq. (41)
|
||||||
Rt.col(m).head(m) = dst_mean;
|
Rt.col(m).head(m) = dst_mean;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user