10 #ifndef EIGEN_BIDIAGONALIZATION_H
11 #define EIGEN_BIDIAGONALIZATION_H
19 template<
typename _MatrixType>
class UpperBidiagonalization
23 typedef _MatrixType MatrixType;
25 RowsAtCompileTime = MatrixType::RowsAtCompileTime,
26 ColsAtCompileTime = MatrixType::ColsAtCompileTime,
27 ColsAtCompileTimeMinusOne = internal::decrement_size<ColsAtCompileTime>::ret
29 typedef typename MatrixType::Scalar Scalar;
30 typedef typename MatrixType::RealScalar RealScalar;
31 typedef typename MatrixType::Index Index;
32 typedef Matrix<Scalar, 1, ColsAtCompileTime> RowVectorType;
33 typedef Matrix<Scalar, RowsAtCompileTime, 1> ColVectorType;
34 typedef BandMatrix<RealScalar, ColsAtCompileTime, ColsAtCompileTime, 1, 0> BidiagonalType;
35 typedef Matrix<Scalar, ColsAtCompileTime, 1> DiagVectorType;
36 typedef Matrix<Scalar, ColsAtCompileTimeMinusOne, 1> SuperDiagVectorType;
37 typedef HouseholderSequence<
39 CwiseUnaryOp<internal::scalar_conjugate_op<Scalar>,
const Diagonal<const MatrixType,0> >
40 > HouseholderUSequenceType;
41 typedef HouseholderSequence<
42 const typename internal::remove_all<typename MatrixType::ConjugateReturnType>::type,
43 Diagonal<const MatrixType,1>,
45 > HouseholderVSequenceType;
53 UpperBidiagonalization() : m_householder(), m_bidiagonal(), m_isInitialized(false) {}
55 UpperBidiagonalization(
const MatrixType& matrix)
56 : m_householder(matrix.rows(), matrix.cols()),
57 m_bidiagonal(matrix.cols(), matrix.cols()),
58 m_isInitialized(false)
63 UpperBidiagonalization& compute(
const MatrixType& matrix);
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>
89 UpperBidiagonalization<_MatrixType>& UpperBidiagonalization<_MatrixType>::compute(
const _MatrixType& matrix)
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;
98 ColVectorType temp(rows);
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>
137 const UpperBidiagonalization<typename MatrixBase<Derived>::PlainObject>
138 MatrixBase<Derived>::bidiagonalization()
const
140 return UpperBidiagonalization<PlainObject>(eval());
148 #endif // EIGEN_BIDIAGONALIZATION_H
Definition: Constants.h:279