11#ifndef EIGEN_BIDIAGONALIZATION_H
12#define EIGEN_BIDIAGONALIZATION_H
30 typedef typename MatrixType::Scalar
Scalar;
92template<
typename MatrixType>
94 typename MatrixType::RealScalar *diagonal,
95 typename MatrixType::RealScalar *upper_diagonal,
96 typename MatrixType::Scalar* tempData = 0)
98 typedef typename MatrixType::Scalar Scalar;
100 Index rows = mat.rows();
101 Index cols = mat.cols();
108 tempData = tempVector.data();
111 for (
Index k = 0; ; ++k)
113 Index remainingRows = rows - k;
114 Index remainingCols = cols - k - 1;
117 mat.col(k).tail(remainingRows)
118 .makeHouseholderInPlace(mat.coeffRef(k,k), diagonal[k]);
120 mat.bottomRightCorner(remainingRows, remainingCols)
121 .applyHouseholderOnTheLeft(mat.col(k).tail(remainingRows-1), mat.coeff(k,k), tempData);
123 if(k == cols-1)
break;
126 mat.row(k).tail(remainingCols)
127 .makeHouseholderInPlace(mat.coeffRef(k,k+1), upper_diagonal[k]);
129 mat.bottomRightCorner(remainingRows-1, remainingCols)
130 .applyHouseholderOnTheRight(mat.row(k).tail(remainingCols-1).adjoint(), mat.coeff(k,k+1), tempData);
151template<
typename MatrixType>
153 typename MatrixType::RealScalar *diagonal,
154 typename MatrixType::RealScalar *upper_diagonal,
161 typedef typename MatrixType::Scalar Scalar;
162 typedef typename MatrixType::RealScalar RealScalar;
171 Index brows = A.rows();
172 Index bcols = A.cols();
174 Scalar tau_u, tau_u_prev(0), tau_v;
176 for(
Index k = 0; k < bs; ++k)
178 Index remainingRows = brows - k;
179 Index remainingCols = bcols - k - 1;
181 SubMatType X_k1( X.block(k,0, remainingRows,k) );
182 SubMatType V_k1( A.block(k,0, remainingRows,k) );
185 SubColumnType v_k = A.col(k).tail(remainingRows);
186 v_k -= V_k1 * Y.row(k).head(k).adjoint();
187 if(k) v_k -= X_k1 * A.col(k).head(k);
190 v_k.makeHouseholderInPlace(tau_v, diagonal[k]);
194 SubMatType Y_k ( Y.block(k+1,0, remainingCols, k+1) );
195 SubMatType U_k1 ( A.block(0,k+1, k,remainingCols) );
203 SubColumnType y_k( Y.col(k).tail(remainingCols) );
206 SubColumnType tmp( Y.col(k).head(k) );
207 y_k.noalias() = A.block(k,k+1, remainingRows,remainingCols).adjoint() * v_k;
208 tmp.noalias() = V_k1.adjoint() * v_k;
209 y_k.noalias() -= Y_k.leftCols(k) * tmp;
210 tmp.noalias() = X_k1.adjoint() * v_k;
211 y_k.noalias() -= U_k1.adjoint() * tmp;
212 y_k *= numext::conj(tau_v);
216 SubRowType u_k( A.row(k).tail(remainingCols) );
217 u_k = u_k.conjugate();
219 u_k -= Y_k * A.row(k).head(k+1).adjoint();
220 if(k) u_k -= U_k1.adjoint() * X.row(k).head(k).adjoint();
224 u_k.makeHouseholderInPlace(tau_u, upper_diagonal[k]);
228 A(k,k+1) = Scalar(1);
232 SubColumnType x_k ( X.col(k).tail(remainingRows-1) );
236 SubColumnType tmp0 ( X.col(k).head(k) ),
237 tmp1 ( X.col(k).head(k+1) );
239 x_k.noalias() = A.block(k+1,k+1, remainingRows-1,remainingCols) * u_k.transpose();
240 tmp0.noalias() = U_k1 * u_k.transpose();
241 x_k.noalias() -= X_k1.bottomRows(remainingRows-1) * tmp0;
242 tmp1.noalias() = Y_k.adjoint() * u_k.transpose();
243 x_k.noalias() -= A.block(k+1,0, remainingRows-1,k+1) * tmp1;
244 x_k *= numext::conj(tau_u);
245 tau_u = numext::conj(tau_u);
246 u_k = u_k.conjugate();
249 if(k>0) A.coeffRef(k-1,k) = tau_u_prev;
253 A.coeffRef(k-1,k) = tau_u_prev;
255 A.coeffRef(k,k) = tau_v;
259 A.coeffRef(bs-1,bs) = tau_u_prev;
262 if(bcols>bs && brows>bs)
264 SubMatType A11( A.bottomRightCorner(brows-bs,bcols-bs) );
265 SubMatType A10( A.block(bs,0, brows-bs,bs) );
266 SubMatType A01( A.block(0,bs, bs,bcols-bs) );
267 Scalar tmp = A01(bs-1,0);
268 A01(bs-1,0) = Literal(1);
269 A11.noalias() -= A10 * Y.topLeftCorner(bcols,bs).bottomRows(bcols-bs).adjoint();
270 A11.noalias() -= X.topLeftCorner(brows,bs).bottomRows(brows-bs) * A01;
283template<
typename MatrixType,
typename B
idiagType>
285 Index maxBlockSize=32,
286 typename MatrixType::Scalar* = 0)
288 typedef typename MatrixType::Scalar Scalar;
291 Index rows = A.rows();
292 Index cols = A.cols();
298 MatrixType::RowsAtCompileTime,
301 MatrixType::MaxRowsAtCompileTime> X(rows,maxBlockSize);
303 MatrixType::ColsAtCompileTime,
306 MatrixType::MaxColsAtCompileTime> Y(cols,maxBlockSize);
310 for(k = 0; k <
size; k += blockSize)
313 Index brows = rows - k;
314 Index bcols = cols - k;
330 BlockType B = A.block(k,k,brows,bcols);
336 if(k+bs==cols || bcols<48)
339 &(bidiagonal.template diagonal<0>().coeffRef(k)),
340 &(bidiagonal.template diagonal<1>().coeffRef(k)),
347 upperbidiagonalization_blocked_helper<BlockType>( B,
348 &(bidiagonal.template diagonal<0>().coeffRef(k)),
349 &(bidiagonal.template diagonal<1>().coeffRef(k)),
351 X.topLeftCorner(brows,bs),
352 Y.topLeftCorner(bcols,bs)
358template<
typename _MatrixType>
361 Index rows = matrix.rows();
362 Index cols = matrix.cols();
365 eigen_assert(rows >= cols &&
"UpperBidiagonalization is only for Arices satisfying rows>=cols.");
367 m_householder = matrix;
372 &(m_bidiagonal.template diagonal<0>().coeffRef(0)),
373 &(m_bidiagonal.template diagonal<1>().coeffRef(0)),
376 m_isInitialized =
true;
380template<
typename _MatrixType>
383 Index rows = matrix.rows();
384 Index cols = matrix.cols();
388 eigen_assert(rows >= cols &&
"UpperBidiagonalization is only for Arices satisfying rows>=cols.");
390 m_householder = matrix;
393 m_isInitialized =
true;
402template<
typename Derived>
#define EIGEN_ONLY_USED_FOR_DEBUG(x)
Definition: Macros.h:1059
#define eigen_assert(x)
Definition: Macros.h:1047
Expression of a fixed-size or dynamic-size block.
Definition: Block.h:105
Expression of a diagonal/subdiagonal/superdiagonal in a matrix.
Definition: Diagonal.h:65
\householder_module
Definition: HouseholderSequence.h:121
Convenience specialization of Stride to specify only an inner stride See class Map for some examples.
Definition: Stride.h:96
Base class for all dense matrices, vectors, and expressions.
Definition: MatrixBase.h:50
The matrix class, also used for vectors and row-vectors.
Definition: Matrix.h:180
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar * data() const
Definition: PlainObjectBase.h:247
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void resize(Index rows, Index cols)
Resizes *this to a rows x cols matrix.
Definition: PlainObjectBase.h:271
A matrix or vector expression mapping an existing expression.
Definition: Ref.h:283
Definition: UpperBidiagonalization.h:21
UpperBidiagonalization(const MatrixType &matrix)
Definition: UpperBidiagonalization.h:56
HouseholderSequence< const MatrixType, const typename internal::remove_all< typename Diagonal< const MatrixType, 0 >::ConjugateReturnType >::type > HouseholderUSequenceType
Definition: UpperBidiagonalization.h:41
const HouseholderUSequenceType householderU() const
Definition: UpperBidiagonalization.h:70
BandMatrix< RealScalar, ColsAtCompileTime, ColsAtCompileTime, 1, 0, RowMajor > BidiagonalType
Definition: UpperBidiagonalization.h:35
MatrixType m_householder
Definition: UpperBidiagonalization.h:85
Matrix< Scalar, 1, ColsAtCompileTime > RowVectorType
Definition: UpperBidiagonalization.h:33
const HouseholderVSequenceType householderV()
Definition: UpperBidiagonalization.h:76
UpperBidiagonalization & compute(const MatrixType &matrix)
Definition: UpperBidiagonalization.h:381
MatrixType::RealScalar RealScalar
Definition: UpperBidiagonalization.h:31
const MatrixType & householder() const
Definition: UpperBidiagonalization.h:67
UpperBidiagonalization & computeUnblocked(const MatrixType &matrix)
Definition: UpperBidiagonalization.h:359
_MatrixType MatrixType
Definition: UpperBidiagonalization.h:24
Matrix< Scalar, RowsAtCompileTime, 1 > ColVectorType
Definition: UpperBidiagonalization.h:34
UpperBidiagonalization()
Default Constructor.
Definition: UpperBidiagonalization.h:54
HouseholderSequence< const typename internal::remove_all< typename MatrixType::ConjugateReturnType >::type, Diagonal< const MatrixType, 1 >, OnTheRight > HouseholderVSequenceType
Definition: UpperBidiagonalization.h:46
@ RowsAtCompileTime
Definition: UpperBidiagonalization.h:26
@ ColsAtCompileTimeMinusOne
Definition: UpperBidiagonalization.h:28
@ ColsAtCompileTime
Definition: UpperBidiagonalization.h:27
BidiagonalType m_bidiagonal
Definition: UpperBidiagonalization.h:86
const BidiagonalType & bidiagonal() const
Definition: UpperBidiagonalization.h:68
Matrix< Scalar, ColsAtCompileTimeMinusOne, 1 > SuperDiagVectorType
Definition: UpperBidiagonalization.h:37
Eigen::Index Index
Definition: UpperBidiagonalization.h:32
Matrix< Scalar, ColsAtCompileTime, 1 > DiagVectorType
Definition: UpperBidiagonalization.h:36
bool m_isInitialized
Definition: UpperBidiagonalization.h:87
MatrixType::Scalar Scalar
Definition: UpperBidiagonalization.h:30
type
Definition: core.h:575
@ ColMajor
Storage order is column major (see TopicStorageOrders).
Definition: Constants.h:319
@ OnTheRight
Apply transformation on the right.
Definition: Constants.h:334
const unsigned int RowMajorBit
for a matrix, this means that the storage order is row-major.
Definition: Constants.h:66
constexpr common_t< T1, T2 > min(const T1 x, const T2 y) noexcept
Compile-time pairwise minimum function.
Definition: min.hpp:35
void upperbidiagonalization_inplace_unblocked(MatrixType &mat, typename MatrixType::RealScalar *diagonal, typename MatrixType::RealScalar *upper_diagonal, typename MatrixType::Scalar *tempData=0)
Definition: UpperBidiagonalization.h:93
EIGEN_CONSTEXPR Index size(const T &x)
Definition: Meta.h:479
void upperbidiagonalization_inplace_blocked(MatrixType &A, BidiagType &bidiagonal, Index maxBlockSize=32, typename MatrixType::Scalar *=0)
Definition: UpperBidiagonalization.h:284
void upperbidiagonalization_blocked_helper(MatrixType &A, typename MatrixType::RealScalar *diagonal, typename MatrixType::RealScalar *upper_diagonal, Index bs, Ref< Matrix< typename MatrixType::Scalar, Dynamic, Dynamic, traits< MatrixType >::Flags &RowMajorBit > > X, Ref< Matrix< typename MatrixType::Scalar, Dynamic, Dynamic, traits< MatrixType >::Flags &RowMajorBit > > Y)
Definition: UpperBidiagonalization.h:152
Namespace containing all symbols from the Eigen library.
Definition: Core:141
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:74
const int Dynamic
This value means that a positive quantity (e.g., a size) is not known at compile-time,...
Definition: Constants.h:22
Definition: Eigen_Colamd.h:50
Holds information about the various numeric (i.e.
Definition: NumTraits.h:233
Definition: Householder.h:18
Definition: XprHelper.h:332
T type
Definition: Meta.h:126
Definition: ForwardDeclarations.h:17