MUQ  0.4.3
BlockRowOperator.cpp
Go to the documentation of this file.
2 
3 
4 using namespace muq::Modeling;
5 
6 
7 BlockRowOperator::BlockRowOperator(std::vector<std::shared_ptr<LinearOperator>> const& blocksIn) : LinearOperator(blocksIn.at(0)->rows(), SumCols(blocksIn)), blocks(blocksIn)
8 {
9 
10  for(int i=0; i<blocks.size(); ++i)
11  assert(blocks.at(i)->rows()==nrows);
12 
13 };
14 
15 
16 Eigen::MatrixXd BlockRowOperator::Apply(Eigen::Ref<const Eigen::MatrixXd> const& x)
17 {
18 
19  assert(x.rows() == ncols);
20 
21  int currCol = 0;
22 
23  Eigen::MatrixXd output = Eigen::MatrixXd::Zero(nrows,x.cols());
24 
25  for(int i=0; i<blocks.size(); ++i)
26  {
27  output += blocks.at(i)->Apply( x.block(currCol, 0, blocks.at(i)->cols(), x.cols()) );
28  currCol += blocks.at(i)->cols();
29  }
30 
31  return output;
32 }
33 
34 Eigen::MatrixXd BlockRowOperator::ApplyTranspose(Eigen::Ref<const Eigen::MatrixXd> const& x)
35 {
36 
37  assert(x.rows() == nrows);
38 
39  int currRow = 0;
40  int currCol = 0;
41 
42  Eigen::MatrixXd output = Eigen::MatrixXd::Zero(ncols,x.cols());
43 
44  for(int i=0; i<blocks.size(); ++i)
45  {
46  output.block(currRow, 0, blocks.at(i)->cols(), x.cols()) = blocks.at(i)->ApplyTranspose( x );
47  currRow += blocks.at(i)->cols();
48  currCol += blocks.at(i)->rows();
49  }
50 
51  return output;
52 }
53 
54 Eigen::MatrixXd BlockRowOperator::GetMatrix()
55 {
56 
57  Eigen::MatrixXd output = Eigen::MatrixXd::Zero(nrows,ncols);
58  int currCol = 0;
59 
60  for(int i=0; i<blocks.size(); ++i)
61  {
62  output.block(0, currCol, nrows, blocks.at(i)->cols()) = blocks.at(i)->GetMatrix();
63  currCol += blocks.at(i)->cols();
64  }
65 
66  return output;
67 }
68 
69 int BlockRowOperator::SumCols(std::vector<std::shared_ptr<LinearOperator>> const& blocksIn)
70 {
71  int sum = 0;
72  for(auto& block : blocksIn)
73  sum += block->cols();
74  return sum;
75 }
static int SumCols(std::vector< std::shared_ptr< LinearOperator >> const &blocksIn)
virtual Eigen::MatrixXd GetMatrix() override
virtual Eigen::MatrixXd Apply(Eigen::Ref< const Eigen::MatrixXd > const &x) override
std::vector< std::shared_ptr< LinearOperator > > blocks
BlockRowOperator(std::vector< std::shared_ptr< LinearOperator >> const &blocksIn)
virtual Eigen::MatrixXd ApplyTranspose(Eigen::Ref< const Eigen::MatrixXd > const &x) override
Generic linear operator base class.