10 #ifndef EIGEN_BIDIAGONALIZATION_H 11 #define EIGEN_BIDIAGONALIZATION_H 23 typedef _MatrixType MatrixType;
25 RowsAtCompileTime = MatrixType::RowsAtCompileTime,
26 ColsAtCompileTime = MatrixType::ColsAtCompileTime,
30 typedef typename MatrixType::RealScalar RealScalar;
31 typedef typename MatrixType::Index Index;
56 : m_householder(matrix.rows(), matrix.cols()),
57 m_bidiagonal(matrix.cols(), matrix.cols()),
58 m_isInitialized(
false)
65 const MatrixType& householder()
const {
return m_householder; }
66 const BidiagonalType& bidiagonal()
const {
return m_bidiagonal; }
68 const HouseholderUSequenceType householderU()
const 70 eigen_assert(m_isInitialized &&
"UpperBidiagonalization is not initialized.");
71 return HouseholderUSequenceType(m_householder, m_householder.diagonal().conjugate());
74 const HouseholderVSequenceType householderV()
76 eigen_assert(m_isInitialized &&
"UpperBidiagonalization is not initialized.");
77 return HouseholderVSequenceType(m_householder.conjugate(), m_householder.const_derived().template diagonal<1>())
78 .setLength(m_householder.cols()-1)
83 MatrixType m_householder;
84 BidiagonalType m_bidiagonal;
88 template<
typename _MatrixType>
91 Index rows = matrix.rows();
92 Index cols = matrix.cols();
94 eigen_assert(rows >= cols &&
"UpperBidiagonalization is only for matrices satisfying rows>=cols.");
96 m_householder = matrix;
100 for (Index k = 0; ; ++k)
102 Index remainingRows = rows - k;
103 Index remainingCols = cols - k - 1;
106 m_householder.col(k).tail(remainingRows)
107 .makeHouseholderInPlace(m_householder.coeffRef(k,k),
108 m_bidiagonal.template diagonal<0>().coeffRef(k));
110 m_householder.bottomRightCorner(remainingRows, remainingCols)
111 .applyHouseholderOnTheLeft(m_householder.col(k).tail(remainingRows-1),
112 m_householder.coeff(k,k),
115 if(k == cols-1)
break;
118 m_householder.row(k).tail(remainingCols)
119 .makeHouseholderInPlace(m_householder.coeffRef(k,k+1),
120 m_bidiagonal.template diagonal<1>().coeffRef(k));
122 m_householder.bottomRightCorner(remainingRows-1, remainingCols)
123 .applyHouseholderOnTheRight(m_householder.row(k).tail(remainingCols-1).transpose(),
124 m_householder.coeff(k,k+1),
127 m_isInitialized =
true;
136 template<
typename Derived>
148 #endif // EIGEN_BIDIAGONALIZATION_H Apply transformation on the right.
Definition: Constants.h:279
EIGEN_STRONG_INLINE const Scalar * data() const
Definition: PlainObjectBase.h:212
iterative scaling algorithm to equilibrate rows and column norms in matrices
Definition: TestIMU_Common.h:87
Definition: ForwardDeclarations.h:227
Definition: Householder.h:17
Definition: UpperBidiagonalization.h:19
Definition: BandTriangularSolver.h:13
UpperBidiagonalization()
Default Constructor.
Definition: UpperBidiagonalization.h:53
Expression of a diagonal/subdiagonal/superdiagonal in a matrix.
Definition: Diagonal.h:64
Generic expression where a coefficient-wise unary operator is applied to an expression.
Definition: CwiseUnaryOp.h:59
The matrix class, also used for vectors and row-vectors.
Definition: Matrix.h:127
Base class for all dense matrices, vectors, and expressions.
Definition: MatrixBase.h:48
Definition: XprHelper.h:203
double Scalar
Common scalar type.
Definition: FlexibleKalmanBase.h:48