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