1#ifndef IRLBA_MATRIX_CENTERED_HPP
2#define IRLBA_MATRIX_CENTERED_HPP
27template<
class EigenVector_,
class Matrix_,
class Center_>
34 my_work(matrix.new_known_workspace()),
42 I<decltype(std::declval<Matrix_>().new_known_workspace())> my_work;
43 const Center_& my_center;
46 void multiply(
const EigenVector_& right, EigenVector_& out) {
47 my_work->multiply(right, out);
48 const auto beta = right.dot(my_center);
64template<
class EigenVector_,
class Matrix_,
class Center_>
71 my_work(matrix.new_known_adjoint_workspace()),
79 I<decltype(std::declval<Matrix_>().new_known_adjoint_workspace())> my_work;
80 const Center_& my_center;
83 void multiply(
const EigenVector_& right, EigenVector_& out) {
84 my_work->multiply(right, out);
85 const auto beta = right.sum();
86 out -= beta * my_center;
99template<
class EigenMatrix_,
class Matrix_,
class Center_>
106 my_work(matrix.new_known_realize_workspace()),
114 I<decltype(std::declval<Matrix_>().new_known_realize_workspace())> my_work;
115 const Center_& my_center;
118 const EigenMatrix_&
realize(EigenMatrix_& buffer) {
119 my_work->realize_copy(buffer);
120 buffer.array().rowwise() -= my_center.adjoint().array();
142 class MatrixPointer_ =
const Matrix<EigenVector_, EigenMatrix_>*,
143 class CenterPointer_ =
const EigenVector_*
153 my_matrix(std::move(matrix)),
154 my_center(std::move(center))
158 MatrixPointer_ my_matrix;
159 CenterPointer_ my_center;
163 return my_matrix->rows();
167 return my_matrix->cols();
188 return std::make_unique<
CenteredWorkspace<EigenVector_, I<
decltype(*my_matrix)>, I<
decltype(*my_center)> > >(*my_matrix, *my_center);
195 return std::make_unique<
CenteredAdjointWorkspace<EigenVector_, I<
decltype(*my_matrix)>, I<
decltype(*my_center)> > >(*my_matrix, *my_center);
202 return std::make_unique<
CenteredRealizeWorkspace<EigenMatrix_, I<
decltype(*my_matrix)>, I<
decltype(*my_center)> > >(*my_matrix, *my_center);
Workspace class for multiplying a transposed Matrix.
Definition interface.hpp:61
Workspace class for multiplying a transposed CenteredMatrix.
Definition centered.hpp:65
void multiply(const EigenVector_ &right, EigenVector_ &out)
Definition centered.hpp:83
Deferred centering of a matrix.
Definition centered.hpp:145
std::unique_ptr< CenteredWorkspace< EigenVector_, I< decltype(*my_matrix)>, I< decltype(*my_center)> > > new_known_workspace() const
Definition centered.hpp:187
Eigen::Index cols() const
Definition centered.hpp:166
Eigen::Index rows() const
Definition centered.hpp:162
std::unique_ptr< Workspace< EigenVector_ > > new_workspace() const
Definition centered.hpp:171
std::unique_ptr< CenteredRealizeWorkspace< EigenMatrix_, I< decltype(*my_matrix)>, I< decltype(*my_center)> > > new_known_realize_workspace() const
Definition centered.hpp:201
CenteredMatrix(MatrixPointer_ matrix, CenterPointer_ center)
Definition centered.hpp:152
std::unique_ptr< CenteredAdjointWorkspace< EigenVector_, I< decltype(*my_matrix)>, I< decltype(*my_center)> > > new_known_adjoint_workspace() const
Definition centered.hpp:194
std::unique_ptr< RealizeWorkspace< EigenMatrix_ > > new_realize_workspace() const
Definition centered.hpp:179
std::unique_ptr< AdjointWorkspace< EigenVector_ > > new_adjoint_workspace() const
Definition centered.hpp:175
Workspace class for realizing a CenteredMatrix.
Definition centered.hpp:100
const EigenMatrix_ & realize(EigenMatrix_ &buffer)
Definition centered.hpp:118
Workspace class for multiplying a CenteredMatrix.
Definition centered.hpp:28
void multiply(const EigenVector_ &right, EigenVector_ &out)
Definition centered.hpp:46
Interface for a matrix to use in compute().
Definition interface.hpp:142
Workspace class for realizing a Matrix.
Definition interface.hpp:99
Workspace class for multiplying a Matrix.
Definition interface.hpp:24
Interfaces for matrix inputs.
Implements IRLBA for approximate SVD.
Definition compute.hpp:22