MUQ  0.4.3
SliceOperator.cpp
Go to the documentation of this file.
2 
3 using namespace muq::Modeling;
4 
5 
6 SliceOperator::SliceOperator(unsigned int vecSize,
7  int startIndIn,
8  int endIndIn,
9  int skipIn) : LinearOperator(ComputeRows(vecSize,startIndIn,endIndIn,skipIn),
10  vecSize),
11  startInd(startIndIn),
12  endInd(endIndIn),
13  skip(skipIn)
14 {
15  if(startIndIn<0){
16  startInd = vecSize+startIndIn;
17  }else{
18  startInd = startIndIn;
19  }
20 
21  if(endIndIn<0){
22  endInd = vecSize+endIndIn;
23  }else{
24  endInd = endIndIn;
25  }
26 
27  assert(skipIn!=0);
28  if(skip<0){
29  assert(startInd>endInd);
30  }else{
31  assert(startInd<endInd);
32  }
33 };
34 
35 unsigned int SliceOperator::ComputeRows(unsigned int vecSize, int startIndIn, int endIndIn, int skipIn)
36 {
37  int startInd, endInd;
38 
39  if(startIndIn<0){
40  startInd = vecSize+startIndIn;
41  }else{
42  startInd = startIndIn;
43  }
44 
45  if(endIndIn<0){
46  endInd = vecSize+endIndIn;
47  }else{
48  endInd = endIndIn;
49  }
50 
51  return std::ceil(double(endInd-startInd)/double(skipIn));
52 }
53 
54 
55 Eigen::MatrixXd SliceOperator::Apply(Eigen::Ref<const Eigen::MatrixXd> const& x)
56 {
57  Eigen::MatrixXd output(rows(),x.cols());
58  unsigned int outInd = 0;
59  const int multiplier = (skip<0) ? -1.0 : 1.0;
60  for(unsigned int inInd=startInd; multiplier*inInd<multiplier*endInd; inInd+=skip){
61  output.row(outInd) = x.row(inInd);
62  outInd++;
63  }
64 
65  return output;
66 }
67 
69 Eigen::MatrixXd SliceOperator::ApplyTranspose(Eigen::Ref<const Eigen::MatrixXd> const& x)
70 {
71  Eigen::MatrixXd output = Eigen::MatrixXd::Zero(cols(), x.cols());
72  unsigned int outInd = 0;
73  const int multiplier = (skip<0) ? -1.0 : 1.0;
74  for(unsigned int inInd=startInd; multiplier*inInd<multiplier*endInd; inInd+=skip){
75  output.row(inInd) = x.row(outInd);
76  outInd++;
77  }
78 
79  return output;
80 }
81 
82 Eigen::MatrixXd SliceOperator::GetMatrix()
83 {
84  Eigen::MatrixXd output = Eigen::MatrixXd::Zero(rows(), cols());
85  unsigned int outInd = 0;
86  for(unsigned int inInd=startInd; inInd!=endInd; inInd+=skip){
87  output(outInd,inInd) = 1.0;
88  outInd++;
89  }
90 
91  return output;
92 }
Generic linear operator base class.
virtual Eigen::MatrixXd Apply(Eigen::Ref< const Eigen::MatrixXd > const &x) override
virtual Eigen::MatrixXd ApplyTranspose(Eigen::Ref< const Eigen::MatrixXd > const &x) override
SliceOperator(unsigned int vecSize, int startIndIn, int endIndIn, int skipIn=1)
virtual Eigen::MatrixXd GetMatrix() override
static unsigned int ComputeRows(unsigned int vecSize, int startIndIn, int endIndIn, int skipIn)