mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-07-30 16:52:01 +08:00
Fixed a cast warning in scaleAndAddTo.
Fixed lazyness in umeyama. Added a few missing casts.
This commit is contained in:
parent
32a9aee286
commit
0a0a805569
@ -259,8 +259,8 @@ class GeneralProduct<Lhs, Rhs, GemvProduct>
|
|||||||
template<typename Dest> void scaleAndAddTo(Dest& dst, Scalar alpha) const
|
template<typename Dest> void scaleAndAddTo(Dest& dst, Scalar alpha) const
|
||||||
{
|
{
|
||||||
ei_assert(m_lhs.rows() == dst.rows() && m_rhs.cols() == dst.cols());
|
ei_assert(m_lhs.rows() == dst.rows() && m_rhs.cols() == dst.cols());
|
||||||
ei_gemv_selector<Side,int(MatrixType::Flags)&RowMajorBit,
|
ei_gemv_selector<Side,bool(int(MatrixType::Flags)&RowMajorBit),
|
||||||
ei_blas_traits<MatrixType>::ActualAccess>::run(*this, dst, alpha);
|
bool(ei_blas_traits<MatrixType>::ActualAccess)>::run(*this, dst, alpha);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -144,7 +144,7 @@ umeyama(const MatrixBase<Derived>& src, const MatrixBase<OtherDerived>& dst, boo
|
|||||||
// const Scalar dst_var = dst_demean.rowwise().squaredNorm().sum() * one_over_n;
|
// const Scalar dst_var = dst_demean.rowwise().squaredNorm().sum() * one_over_n;
|
||||||
|
|
||||||
// Eq. (38)
|
// Eq. (38)
|
||||||
const MatrixType sigma = (one_over_n * dst_demean * src_demean.transpose()).lazy();
|
const MatrixType sigma = one_over_n * dst_demean * src_demean.transpose();
|
||||||
|
|
||||||
SVD<MatrixType> svd(sigma);
|
SVD<MatrixType> svd(sigma);
|
||||||
|
|
||||||
@ -160,14 +160,14 @@ umeyama(const MatrixBase<Derived>& src, const MatrixBase<OtherDerived>& dst, boo
|
|||||||
int rank = 0; for (int i=0; i<m; ++i) if (!ei_isMuchSmallerThan(d.coeff(i),d.coeff(0))) ++rank;
|
int rank = 0; for (int i=0; i<m; ++i) if (!ei_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() > 0 ) {
|
||||||
Rt.block(0,0,m,m) = (svd.matrixU()*svd.matrixV().transpose()).lazy();
|
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) = -1;
|
||||||
Rt.block(0,0,m,m) = (svd.matrixU() * S.asDiagonal() * svd.matrixV().transpose()).lazy();
|
Rt.block(0,0,m,m).noalias() = svd.matrixU() * S.asDiagonal() * svd.matrixV().transpose();
|
||||||
S(m-1) = s;
|
S(m-1) = s;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Rt.block(0,0,m,m) = (svd.matrixU() * S.asDiagonal() * svd.matrixV().transpose()).lazy();
|
Rt.block(0,0,m,m).noalias() = svd.matrixU() * S.asDiagonal() * svd.matrixV().transpose();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Eq. (42)
|
// Eq. (42)
|
||||||
@ -177,7 +177,7 @@ umeyama(const MatrixBase<Derived>& src, const MatrixBase<OtherDerived>& dst, boo
|
|||||||
// Note that we first assign dst_mean to the destination so that there no need
|
// Note that we first assign dst_mean to the destination so that there no need
|
||||||
// for a temporary.
|
// for a temporary.
|
||||||
Rt.col(m).start(m) = dst_mean;
|
Rt.col(m).start(m) = dst_mean;
|
||||||
Rt.col(m).start(m) -= (c*Rt.corner(TopLeft,m,m)*src_mean).lazy();
|
Rt.col(m).start(m).noalias() -= c*Rt.corner(TopLeft,m,m)*src_mean;
|
||||||
|
|
||||||
if (with_scaling) Rt.block(0,0,m,m) *= c;
|
if (with_scaling) Rt.block(0,0,m,m) *= c;
|
||||||
|
|
||||||
|
@ -40,8 +40,8 @@ template<typename Scalar> void trsm(int size,int cols)
|
|||||||
Matrix<Scalar,Dynamic,Dynamic,ColMajor> cmRhs(size,cols), ref(size,cols);
|
Matrix<Scalar,Dynamic,Dynamic,ColMajor> cmRhs(size,cols), ref(size,cols);
|
||||||
Matrix<Scalar,Dynamic,Dynamic,RowMajor> rmRhs(size,cols);
|
Matrix<Scalar,Dynamic,Dynamic,RowMajor> rmRhs(size,cols);
|
||||||
|
|
||||||
cmLhs.setRandom(); cmLhs *= 0.1; cmLhs.diagonal().cwise() += 1;
|
cmLhs.setRandom(); cmLhs *= static_cast<RealScalar>(0.1); cmLhs.diagonal().cwise() += static_cast<RealScalar>(1);
|
||||||
rmLhs.setRandom(); rmLhs *= 0.1; rmLhs.diagonal().cwise() += 1;
|
rmLhs.setRandom(); rmLhs *= static_cast<RealScalar>(0.1); rmLhs.diagonal().cwise() += static_cast<RealScalar>(1);
|
||||||
|
|
||||||
VERIFY_TRSM(cmLhs.conjugate().template triangularView<LowerTriangular>(), cmRhs);
|
VERIFY_TRSM(cmLhs.conjugate().template triangularView<LowerTriangular>(), cmRhs);
|
||||||
VERIFY_TRSM(cmLhs .template triangularView<UpperTriangular>(), cmRhs);
|
VERIFY_TRSM(cmLhs .template triangularView<UpperTriangular>(), cmRhs);
|
||||||
|
@ -127,7 +127,7 @@ void run_test(int dim, int num_elements)
|
|||||||
MatrixX src = MatrixX::Random(dim+1, num_elements);
|
MatrixX src = MatrixX::Random(dim+1, num_elements);
|
||||||
src.row(dim) = Matrix<Scalar, 1, Dynamic>::Constant(num_elements, Scalar(1));
|
src.row(dim) = Matrix<Scalar, 1, Dynamic>::Constant(num_elements, Scalar(1));
|
||||||
|
|
||||||
MatrixX dst = (cR_t*src).lazy();
|
MatrixX dst = cR_t*src;
|
||||||
|
|
||||||
MatrixX cR_t_umeyama = umeyama(src.block(0,0,dim,num_elements), dst.block(0,0,dim,num_elements));
|
MatrixX cR_t_umeyama = umeyama(src.block(0,0,dim,num_elements), dst.block(0,0,dim,num_elements));
|
||||||
|
|
||||||
@ -160,7 +160,7 @@ void run_fixed_size_test(int num_elements)
|
|||||||
MatrixX src = MatrixX::Random(dim+1, num_elements);
|
MatrixX src = MatrixX::Random(dim+1, num_elements);
|
||||||
src.row(dim) = Matrix<Scalar, 1, Dynamic>::Constant(num_elements, Scalar(1));
|
src.row(dim) = Matrix<Scalar, 1, Dynamic>::Constant(num_elements, Scalar(1));
|
||||||
|
|
||||||
MatrixX dst = (cR_t*src).lazy();
|
MatrixX dst = cR_t*src;
|
||||||
|
|
||||||
Block<MatrixX, Dimension, Dynamic> src_block(src,0,0,dim,num_elements);
|
Block<MatrixX, Dimension, Dynamic> src_block(src,0,0,dim,num_elements);
|
||||||
Block<MatrixX, Dimension, Dynamic> dst_block(dst,0,0,dim,num_elements);
|
Block<MatrixX, Dimension, Dynamic> dst_block(dst,0,0,dim,num_elements);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user