mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-04-20 08:39:37 +08:00
Fix compilation of qr.inverse() for column and full pivoting variants.
This commit is contained in:
parent
4387433acf
commit
80b5133789
@ -613,12 +613,12 @@ void ColPivHouseholderQR<_MatrixType>::_solve_impl(const RhsType &rhs, DstType &
|
|||||||
|
|
||||||
namespace internal {
|
namespace internal {
|
||||||
|
|
||||||
template<typename DstXprType, typename MatrixType, typename Scalar>
|
template<typename DstXprType, typename MatrixType>
|
||||||
struct Assignment<DstXprType, Inverse<ColPivHouseholderQR<MatrixType> >, internal::assign_op<Scalar,Scalar>, Dense2Dense>
|
struct Assignment<DstXprType, Inverse<ColPivHouseholderQR<MatrixType> >, internal::assign_op<typename DstXprType::Scalar,typename ColPivHouseholderQR<MatrixType>::Scalar>, Dense2Dense>
|
||||||
{
|
{
|
||||||
typedef ColPivHouseholderQR<MatrixType> QrType;
|
typedef ColPivHouseholderQR<MatrixType> QrType;
|
||||||
typedef Inverse<QrType> SrcXprType;
|
typedef Inverse<QrType> SrcXprType;
|
||||||
static void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op<Scalar,Scalar> &)
|
static void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op<typename DstXprType::Scalar,typename QrType::Scalar> &)
|
||||||
{
|
{
|
||||||
dst = src.nestedExpression().solve(MatrixType::Identity(src.rows(), src.cols()));
|
dst = src.nestedExpression().solve(MatrixType::Identity(src.rows(), src.cols()));
|
||||||
}
|
}
|
||||||
|
@ -575,12 +575,12 @@ void FullPivHouseholderQR<_MatrixType>::_solve_impl(const RhsType &rhs, DstType
|
|||||||
|
|
||||||
namespace internal {
|
namespace internal {
|
||||||
|
|
||||||
template<typename DstXprType, typename MatrixType, typename Scalar>
|
template<typename DstXprType, typename MatrixType>
|
||||||
struct Assignment<DstXprType, Inverse<FullPivHouseholderQR<MatrixType> >, internal::assign_op<Scalar,Scalar>, Dense2Dense>
|
struct Assignment<DstXprType, Inverse<FullPivHouseholderQR<MatrixType> >, internal::assign_op<typename DstXprType::Scalar,typename FullPivHouseholderQR<MatrixType>::Scalar>, Dense2Dense>
|
||||||
{
|
{
|
||||||
typedef FullPivHouseholderQR<MatrixType> QrType;
|
typedef FullPivHouseholderQR<MatrixType> QrType;
|
||||||
typedef Inverse<QrType> SrcXprType;
|
typedef Inverse<QrType> SrcXprType;
|
||||||
static void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op<Scalar,Scalar> &)
|
static void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op<typename DstXprType::Scalar,typename QrType::Scalar> &)
|
||||||
{
|
{
|
||||||
dst = src.nestedExpression().solve(MatrixType::Identity(src.rows(), src.cols()));
|
dst = src.nestedExpression().solve(MatrixType::Identity(src.rows(), src.cols()));
|
||||||
}
|
}
|
||||||
|
@ -141,6 +141,18 @@ template<typename MatrixType> void qr()
|
|||||||
m2 = MatrixType::Random(cols,cols2);
|
m2 = MatrixType::Random(cols,cols2);
|
||||||
m2 = qr.solve(m3);
|
m2 = qr.solve(m3);
|
||||||
VERIFY_IS_APPROX(m3, m1*m2);
|
VERIFY_IS_APPROX(m3, m1*m2);
|
||||||
|
|
||||||
|
{
|
||||||
|
Index size = rows;
|
||||||
|
do {
|
||||||
|
m1 = MatrixType::Random(size,size);
|
||||||
|
qr.compute(m1);
|
||||||
|
} while(!qr.isInvertible());
|
||||||
|
MatrixType m1_inv = qr.inverse();
|
||||||
|
m3 = m1 * MatrixType::Random(size,cols2);
|
||||||
|
m2 = qr.solve(m3);
|
||||||
|
VERIFY_IS_APPROX(m2, m1_inv*m3);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename MatrixType, int Cols2> void qr_fixedsize()
|
template<typename MatrixType, int Cols2> void qr_fixedsize()
|
||||||
|
@ -54,6 +54,18 @@ template<typename MatrixType> void qr()
|
|||||||
m2 = MatrixType::Random(cols,cols2);
|
m2 = MatrixType::Random(cols,cols2);
|
||||||
m2 = qr.solve(m3);
|
m2 = qr.solve(m3);
|
||||||
VERIFY_IS_APPROX(m3, m1*m2);
|
VERIFY_IS_APPROX(m3, m1*m2);
|
||||||
|
|
||||||
|
{
|
||||||
|
Index size = rows;
|
||||||
|
do {
|
||||||
|
m1 = MatrixType::Random(size,size);
|
||||||
|
qr.compute(m1);
|
||||||
|
} while(!qr.isInvertible());
|
||||||
|
MatrixType m1_inv = qr.inverse();
|
||||||
|
m3 = m1 * MatrixType::Random(size,cols2);
|
||||||
|
m2 = qr.solve(m3);
|
||||||
|
VERIFY_IS_APPROX(m2, m1_inv*m3);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename MatrixType> void qr_invertible()
|
template<typename MatrixType> void qr_invertible()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user