1#ifndef IRLBA_MATRIX_SCALED_HPP
2#define IRLBA_MATRIX_SCALED_HPP
27template<
class EigenVector_,
class Matrix_,
class Scale_>
33 ScaledWorkspace(
const Matrix_& matrix,
const Scale_& scale,
const bool column,
const bool divide) :
34 my_work(matrix.new_known_workspace()),
44 I<decltype(std::declval<Matrix_>().new_known_workspace())> my_work;
45 const Scale_& my_scale;
49 EigenVector_ my_buffer;
52 void multiply(
const EigenVector_& right, EigenVector_& out) {
55 my_buffer = right.cwiseQuotient(my_scale);
57 my_buffer = right.cwiseProduct(my_scale);
59 my_work->multiply(my_buffer, out);
62 my_work->multiply(right, out);
64 out.array() /= my_scale.array();
66 out.array() *= my_scale.array();
81template<
class EigenVector_,
class Matrix_,
class Scale_>
88 my_work(matrix.new_known_adjoint_workspace()),
98 I<decltype(std::declval<Matrix_>().new_known_adjoint_workspace())> my_work;
99 const Scale_& my_scale;
103 EigenVector_ my_buffer;
106 void multiply(
const EigenVector_& right, EigenVector_& out) {
108 my_work->multiply(right, out);
110 out.array() /= my_scale.array();
112 out.array() *= my_scale.array();
117 my_buffer = right.cwiseQuotient(my_scale);
119 my_buffer = right.cwiseProduct(my_scale);
121 my_work->multiply(my_buffer, out);
135template<
class EigenMatrix_,
class Matrix_,
class Scale_>
141 ScaledRealizeWorkspace(
const Matrix_& matrix,
const Scale_& scale,
const bool column,
const bool divide) :
142 my_work(matrix.new_known_realize_workspace()),
152 I<decltype(std::declval<Matrix_>().new_known_realize_workspace())> my_work;
153 const Scale_& my_scale;
158 const EigenMatrix_&
realize(EigenMatrix_& buffer) {
159 my_work->realize_copy(buffer);
163 buffer.array().rowwise() /= my_scale.adjoint().array();
165 buffer.array().rowwise() *= my_scale.adjoint().array();
170 buffer.array().colwise() /= my_scale.array();
172 buffer.array().colwise() *= my_scale.array();
198 class MatrixPointer_ =
const Matrix<EigenVector_, EigenMatrix_>*,
199 class ScalePointer_ =
const EigenVector_*
212 ScaledMatrix(MatrixPointer_ matrix, ScalePointer_ scale,
bool column,
bool divide) :
213 my_matrix(std::move(matrix)),
214 my_scale(std::move(scale)),
220 MatrixPointer_ my_matrix;
221 ScalePointer_ my_scale;
227 return my_matrix->rows();
231 return my_matrix->cols();
252 return std::make_unique<
ScaledWorkspace<EigenVector_, I<
decltype(*my_matrix)>, I<
decltype(*my_scale)> > >(*my_matrix, *my_scale, my_column, my_divide);
259 return std::make_unique<
ScaledAdjointWorkspace<EigenVector_, I<
decltype(*my_matrix)>, I<
decltype(*my_scale)> > >(*my_matrix, *my_scale, my_column, my_divide);
266 return std::make_unique<
ScaledRealizeWorkspace<EigenMatrix_, I<
decltype(*my_matrix)>, I<
decltype(*my_scale)> > >(*my_matrix, *my_scale, my_column, my_divide);
Workspace class for multiplying a transposed Matrix.
Definition interface.hpp:61
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 transposed ScaledMatrix.
Definition scaled.hpp:82
void multiply(const EigenVector_ &right, EigenVector_ &out)
Definition scaled.hpp:106
Deferred scaling of a matrix.
Definition scaled.hpp:201
std::unique_ptr< ScaledRealizeWorkspace< EigenMatrix_, I< decltype(*my_matrix)>, I< decltype(*my_scale)> > > new_known_realize_workspace() const
Definition scaled.hpp:265
std::unique_ptr< RealizeWorkspace< EigenMatrix_ > > new_realize_workspace() const
Definition scaled.hpp:243
Eigen::Index cols() const
Definition scaled.hpp:230
ScaledMatrix(MatrixPointer_ matrix, ScalePointer_ scale, bool column, bool divide)
Definition scaled.hpp:212
std::unique_ptr< ScaledWorkspace< EigenVector_, I< decltype(*my_matrix)>, I< decltype(*my_scale)> > > new_known_workspace() const
Definition scaled.hpp:251
std::unique_ptr< AdjointWorkspace< EigenVector_ > > new_adjoint_workspace() const
Definition scaled.hpp:239
std::unique_ptr< ScaledAdjointWorkspace< EigenVector_, I< decltype(*my_matrix)>, I< decltype(*my_scale)> > > new_known_adjoint_workspace() const
Definition scaled.hpp:258
Eigen::Index rows() const
Definition scaled.hpp:226
std::unique_ptr< Workspace< EigenVector_ > > new_workspace() const
Definition scaled.hpp:235
Workspace class for realizing a ScaledMatrix.
Definition scaled.hpp:136
const EigenMatrix_ & realize(EigenMatrix_ &buffer)
Definition scaled.hpp:158
Workspace class for multiplying a ScaledMatrix.
Definition scaled.hpp:28
void multiply(const EigenVector_ &right, EigenVector_ &out)
Definition scaled.hpp:52
Workspace class for multiplying a Matrix.
Definition interface.hpp:24
Interfaces for matrix inputs.
Implements IRLBA for approximate SVD.
Definition compute.hpp:22