irlba
A C++ library for IRLBA
Loading...
Searching...
No Matches
centered.hpp
Go to the documentation of this file.
1#ifndef IRLBA_MATRIX_CENTERED_HPP
2#define IRLBA_MATRIX_CENTERED_HPP
3
4#include <memory>
5
6#include "../utils.hpp"
7#include "interface.hpp"
8
9#include "Eigen/Dense"
10
16namespace irlba {
17
27template<class EigenVector_, class Matrix_, class Center_>
28class CenteredWorkspace final : public Workspace<EigenVector_> {
29public:
33 CenteredWorkspace(const Matrix_& matrix, const Center_& center) :
34 my_work(matrix.new_known_workspace()),
35 my_center(center)
36 {}
41private:
42 I<decltype(std::declval<Matrix_>().new_known_workspace())> my_work;
43 const Center_& my_center;
44
45public:
46 void multiply(const EigenVector_& right, EigenVector_& out) {
47 my_work->multiply(right, out);
48 const auto beta = right.dot(my_center);
49 for (auto& o : out) {
50 o -= beta;
51 }
52 }
53};
54
64template<class EigenVector_, class Matrix_, class Center_>
65class CenteredAdjointWorkspace final : public AdjointWorkspace<EigenVector_> {
66public:
70 CenteredAdjointWorkspace(const Matrix_& matrix, const Center_& center) :
71 my_work(matrix.new_known_adjoint_workspace()),
72 my_center(center)
73 {}
78private:
79 I<decltype(std::declval<Matrix_>().new_known_adjoint_workspace())> my_work;
80 const Center_& my_center;
81
82public:
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;
87 }
88};
89
99template<class EigenMatrix_, class Matrix_, class Center_>
100class CenteredRealizeWorkspace final : public RealizeWorkspace<EigenMatrix_> {
101public:
105 CenteredRealizeWorkspace(const Matrix_& matrix, const Center_& center) :
106 my_work(matrix.new_known_realize_workspace()),
107 my_center(center)
108 {}
113private:
114 I<decltype(std::declval<Matrix_>().new_known_realize_workspace())> my_work;
115 const Center_& my_center;
116
117public:
118 const EigenMatrix_& realize(EigenMatrix_& buffer) {
119 my_work->realize_copy(buffer);
120 buffer.array().rowwise() -= my_center.adjoint().array();
121 return buffer;
122 }
123};
124
139template<
140 class EigenVector_,
141 class EigenMatrix_,
142 class MatrixPointer_ = const Matrix<EigenVector_, EigenMatrix_>*,
143 class CenterPointer_ = const EigenVector_*
144>
145class CenteredMatrix final : public Matrix<EigenVector_, EigenMatrix_> {
146public:
152 CenteredMatrix(MatrixPointer_ matrix, CenterPointer_ center) :
153 my_matrix(std::move(matrix)),
154 my_center(std::move(center))
155 {}
156
157private:
158 MatrixPointer_ my_matrix;
159 CenterPointer_ my_center;
160
161public:
162 Eigen::Index rows() const {
163 return my_matrix->rows();
164 }
165
166 Eigen::Index cols() const {
167 return my_matrix->cols();
168 }
169
170public:
171 std::unique_ptr<Workspace<EigenVector_> > new_workspace() const {
172 return new_known_workspace();
173 }
174
175 std::unique_ptr<AdjointWorkspace<EigenVector_> > new_adjoint_workspace() const {
177 }
178
179 std::unique_ptr<RealizeWorkspace<EigenMatrix_> > new_realize_workspace() const {
181 }
182
183public:
187 std::unique_ptr<CenteredWorkspace<EigenVector_, I<decltype(*my_matrix)>, I<decltype(*my_center)> > > new_known_workspace() const {
188 return std::make_unique<CenteredWorkspace<EigenVector_, I<decltype(*my_matrix)>, I<decltype(*my_center)> > >(*my_matrix, *my_center);
189 }
190
194 std::unique_ptr<CenteredAdjointWorkspace<EigenVector_, I<decltype(*my_matrix)>, I<decltype(*my_center)> > > new_known_adjoint_workspace() const {
195 return std::make_unique<CenteredAdjointWorkspace<EigenVector_, I<decltype(*my_matrix)>, I<decltype(*my_center)> > >(*my_matrix, *my_center);
196 }
197
201 std::unique_ptr<CenteredRealizeWorkspace<EigenMatrix_, I<decltype(*my_matrix)>, I<decltype(*my_center)> > > new_known_realize_workspace() const {
202 return std::make_unique<CenteredRealizeWorkspace<EigenMatrix_, I<decltype(*my_matrix)>, I<decltype(*my_center)> > >(*my_matrix, *my_center);
203 }
204};
205
206}
207
208#endif
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