11 #ifndef EIGEN_BIDIAGONALIZATION_H
12 #define EIGEN_BIDIAGONALIZATION_H
23 template <
typename MatrixType_>
92 template <
typename MatrixType>
105 tempData = tempVector.data();
115 mat.bottomRightCorner(remainingRows, remainingCols)
116 .applyHouseholderOnTheLeft(
mat.col(
k).tail(remainingRows - 1),
mat.
coeff(
k,
k), tempData);
118 if (
k ==
cols - 1)
break;
121 mat.row(
k).tail(remainingCols).makeHouseholderInPlace(
mat.
coeffRef(
k,
k + 1), upper_diagonal[
k]);
123 mat.bottomRightCorner(remainingRows - 1, remainingCols)
124 .applyHouseholderOnTheRight(
mat.row(
k).tail(remainingCols - 1).
adjoint(),
mat.
coeff(
k,
k + 1), tempData);
145 template <
typename MatrixType>
163 Scalar tau_u, tau_u_prev(0), tau_v;
166 Index remainingRows = brows -
k;
167 Index remainingCols = bcols -
k - 1;
169 SubMatType X_k1(
X.block(
k, 0, remainingRows,
k));
170 SubMatType V_k1(
A.block(
k, 0, remainingRows,
k));
173 SubColumnType v_k =
A.col(
k).tail(remainingRows);
174 v_k -= V_k1 *
Y.row(
k).head(
k).adjoint();
175 if (
k) v_k -= X_k1 *
A.col(
k).head(
k);
178 v_k.makeHouseholderInPlace(tau_v,
diagonal[
k]);
181 SubMatType Y_k(
Y.block(
k + 1, 0, remainingCols,
k + 1));
182 SubMatType U_k1(
A.block(0,
k + 1,
k, remainingCols));
190 SubColumnType y_k(
Y.col(
k).tail(remainingCols));
193 SubColumnType
tmp(
Y.col(
k).head(
k));
194 y_k.noalias() =
A.block(
k,
k + 1, remainingRows, remainingCols).adjoint() * v_k;
195 tmp.noalias() = V_k1.adjoint() * v_k;
196 y_k.noalias() -= Y_k.leftCols(
k) *
tmp;
197 tmp.noalias() = X_k1.adjoint() * v_k;
198 y_k.noalias() -= U_k1.adjoint() *
tmp;
203 SubRowType u_k(
A.row(
k).tail(remainingCols));
204 u_k = u_k.conjugate();
206 u_k -= Y_k *
A.row(
k).head(
k + 1).adjoint();
207 if (
k) u_k -= U_k1.adjoint() *
X.row(
k).head(
k).adjoint();
211 u_k.makeHouseholderInPlace(tau_u, upper_diagonal[
k]);
219 SubColumnType x_k(
X.col(
k).tail(remainingRows - 1));
223 SubColumnType tmp0(
X.col(
k).head(
k)), tmp1(
X.col(
k).head(
k + 1));
225 x_k.noalias() =
A.block(
k + 1,
k + 1, remainingRows - 1, remainingCols) * u_k.transpose();
226 tmp0.noalias() = U_k1 * u_k.transpose();
227 x_k.noalias() -= X_k1.bottomRows(remainingRows - 1) * tmp0;
228 tmp1.noalias() = Y_k.adjoint() * u_k.transpose();
229 x_k.noalias() -=
A.block(
k + 1, 0, remainingRows - 1,
k + 1) * tmp1;
232 u_k = u_k.conjugate();
243 if (bs < bcols)
A.
coeffRef(bs - 1, bs) = tau_u_prev;
246 if (bcols > bs && brows > bs) {
247 SubMatType A11(
A.bottomRightCorner(brows - bs, bcols - bs));
248 SubMatType A10(
A.block(bs, 0, brows - bs, bs));
249 SubMatType A01(
A.block(0, bs, bs, bcols - bs));
251 A01(bs - 1, 0) = Literal(1);
252 A11.noalias() -= A10 *
Y.topLeftCorner(bcols, bs).bottomRows(bcols - bs).adjoint();
253 A11.noalias() -=
X.topLeftCorner(brows, bs).bottomRows(brows - bs) * A01;
254 A01(bs - 1, 0) =
tmp;
265 template <
typename MatrixType,
typename B
idiagType>
284 for (
k = 0;
k <
size;
k += blockSize) {
303 BlockType
B =
A.block(
k,
k, brows, bcols);
310 auto upper_diagonal = bidiagonal.template diagonal<1>();
312 upper_diagonal.size() > 0 ? &upper_diagonal.coeffRef(
k) :
nullptr;
314 if (
k + bs ==
cols || bcols < 48)
320 upperbidiagonalization_blocked_helper<BlockType>(
B, &(bidiagonal.template diagonal<0>().coeffRef(
k)),
321 upper_diagonal_ptr, bs,
X.topLeftCorner(brows, bs),
322 Y.topLeftCorner(bcols, bs));
327 template <
typename MatrixType_>
333 eigen_assert(
rows >=
cols &&
"UpperBidiagonalization is only for Arices satisfying rows>=cols.");
340 &(m_bidiagonal.template diagonal<1>().coeffRef(0)), temp.
data());
342 m_isInitialized =
true;
346 template <
typename MatrixType_>
353 eigen_assert(
rows >=
cols &&
"UpperBidiagonalization is only for Arices satisfying rows>=cols.");
358 m_isInitialized =
true;
367 template<
typename Derived>
AnnoyingScalar conj(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:133
#define EIGEN_ONLY_USED_FOR_DEBUG(x)
Definition: Macros.h:922
#define eigen_assert(x)
Definition: Macros.h:910
int rows
Definition: Tutorial_commainit_02.cpp:1
int cols
Definition: Tutorial_commainit_02.cpp:1
Scalar Scalar int size
Definition: benchVecAdd.cpp:17
SCALAR Scalar
Definition: bench_gemm.cpp:45
Matrix< SCALARA, Dynamic, Dynamic, opt_A > A
Definition: bench_gemm.cpp:47
NumTraits< Scalar >::Real RealScalar
Definition: bench_gemm.cpp:46
MatrixXf MatrixType
Definition: benchmark-blocking-sizes.cpp:52
Expression of a fixed-size or dynamic-size block.
Definition: Block.h:110
Expression of a diagonal/subdiagonal/superdiagonal in a matrix.
Definition: Diagonal.h:68
Sequence of Householder reflections acting on subspaces with decreasing size.
Definition: HouseholderSequence.h:117
Convenience specialization of Stride to specify only an inner stride See class Map for some examples.
Definition: Stride.h:93
Base class for all dense matrices, vectors, and expressions.
Definition: MatrixBase.h:52
The matrix class, also used for vectors and row-vectors.
Definition: Eigen/Eigen/src/Core/Matrix.h:186
EIGEN_DEVICE_FUNC constexpr EIGEN_STRONG_INLINE Scalar & coeffRef(Index rowId, Index colId)
Definition: PlainObjectBase.h:217
constexpr EIGEN_DEVICE_FUNC const Scalar * data() const
Definition: PlainObjectBase.h:273
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT
Definition: PlainObjectBase.h:192
EIGEN_DEVICE_FUNC constexpr EIGEN_STRONG_INLINE void resize(Index rows, Index cols)
Definition: PlainObjectBase.h:294
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT
Definition: PlainObjectBase.h:191
A matrix or vector expression mapping an existing expression.
Definition: Ref.h:264
const AdjointReturnType adjoint() const
Definition: SparseMatrixBase.h:360
Scalar coeff(Index row, Index col) const
Definition: SparseMatrix.h:211
Index cols() const
Definition: SparseMatrix.h:161
Scalar & coeffRef(Index row, Index col)
Definition: SparseMatrix.h:275
Index rows() const
Definition: SparseMatrix.h:159
Definition: UpperBidiagonalization.h:24
UpperBidiagonalization & computeUnblocked(const MatrixType &matrix)
Definition: UpperBidiagonalization.h:328
const HouseholderUSequenceType householderU() const
Definition: UpperBidiagonalization.h:71
Eigen::Index Index
Definition: UpperBidiagonalization.h:34
UpperBidiagonalization(const MatrixType &matrix)
Definition: UpperBidiagonalization.h:55
MatrixType m_householder
Definition: UpperBidiagonalization.h:85
Matrix< Scalar, ColsAtCompileTime, 1 > DiagVectorType
Definition: UpperBidiagonalization.h:38
bool m_isInitialized
Definition: UpperBidiagonalization.h:87
UpperBidiagonalization(Index rows, Index cols)
Definition: UpperBidiagonalization.h:62
BidiagonalType m_bidiagonal
Definition: UpperBidiagonalization.h:86
MatrixType_ MatrixType
Definition: UpperBidiagonalization.h:26
HouseholderSequence< const internal::remove_all_t< typename MatrixType::ConjugateReturnType >, Diagonal< const MatrixType, 1 >, OnTheRight > HouseholderVSequenceType
Definition: UpperBidiagonalization.h:45
UpperBidiagonalization & compute(const MatrixType &matrix)
Definition: UpperBidiagonalization.h:347
UpperBidiagonalization()
Default Constructor.
Definition: UpperBidiagonalization.h:53
const MatrixType & householder() const
Definition: UpperBidiagonalization.h:68
Matrix< Scalar, ColsAtCompileTimeMinusOne, 1 > SuperDiagVectorType
Definition: UpperBidiagonalization.h:39
const HouseholderVSequenceType householderV()
Definition: UpperBidiagonalization.h:76
HouseholderSequence< const MatrixType, const internal::remove_all_t< typename Diagonal< const MatrixType, 0 >::ConjugateReturnType > > HouseholderUSequenceType
Definition: UpperBidiagonalization.h:42
Matrix< Scalar, RowsAtCompileTime, 1 > ColVectorType
Definition: UpperBidiagonalization.h:36
@ ColsAtCompileTimeMinusOne
Definition: UpperBidiagonalization.h:30
@ ColsAtCompileTime
Definition: UpperBidiagonalization.h:29
@ RowsAtCompileTime
Definition: UpperBidiagonalization.h:28
Matrix< Scalar, 1, ColsAtCompileTime > RowVectorType
Definition: UpperBidiagonalization.h:35
const BidiagonalType & bidiagonal() const
Definition: UpperBidiagonalization.h:69
BandMatrix< RealScalar, ColsAtCompileTime, ColsAtCompileTime, 1, 0, RowMajor > BidiagonalType
Definition: UpperBidiagonalization.h:37
MatrixType::Scalar Scalar
Definition: UpperBidiagonalization.h:32
MatrixType::RealScalar RealScalar
Definition: UpperBidiagonalization.h:33
Definition: matrices.h:74
Eigen::Map< Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic, Eigen::ColMajor >, 0, Eigen::OuterStride<> > matrix(T *data, int rows, int cols, int stride)
Definition: common.h:85
#define min(a, b)
Definition: datatypes.h:22
void diagonal(const MatrixType &m)
Definition: diagonal.cpp:13
@ ColMajor
Definition: Constants.h:318
@ RowMajor
Definition: Constants.h:320
@ OnTheRight
Definition: Constants.h:333
const unsigned int RowMajorBit
Definition: Constants.h:70
#define X
Definition: icosphere.cpp:20
char char char int int * k
Definition: level2_impl.h:374
Eigen::Matrix< Scalar, Dynamic, Dynamic, ColMajor > tmp
Definition: level3_impl.h:365
void upperbidiagonalization_inplace_unblocked(MatrixType &mat, typename MatrixType::RealScalar *diagonal, typename MatrixType::RealScalar *upper_diagonal, typename MatrixType::Scalar *tempData=0)
Definition: UpperBidiagonalization.h:93
typename remove_all< T >::type remove_all_t
Definition: Meta.h:142
void upperbidiagonalization_inplace_blocked(MatrixType &A, BidiagType &bidiagonal, Index maxBlockSize=32, typename MatrixType::Scalar *=0)
Definition: UpperBidiagonalization.h:266
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:146
Namespace containing all symbols from the Eigen library.
Definition: bench_norm.cpp:70
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:83
const int Dynamic
Definition: Constants.h:25
Definition: Eigen_Colamd.h:49
internal::nested_eval< T, 1 >::type eval(const T &xpr)
Definition: sparse_permutations.cpp:47
Holds information about the various numeric (i.e. scalar) types allowed by Eigen.
Definition: NumTraits.h:217
Definition: Householder.h:21
Definition: ForwardDeclarations.h:21
const char Y
Definition: test/EulerAngles.cpp:32