MUQ  0.4.3
EigenLinearOperator.h
Go to the documentation of this file.
1 #ifndef EIGENLINEAROPERATOR_H
2 #define EIGENLINEAROPERATOR_H
3 
5 
6 #include <Eigen/SparseCore>
7 
8 #include <memory>
9 
10 namespace muq
11 {
12 namespace Modeling
13 {
14 
15 
20 template<typename EigenType>
21 class EigenLinearOperator : public LinearOperator {
22 public:
23 
24  EigenLinearOperator(EigenType const& Ain) : LinearOperator(Ain.rows(), Ain.cols()), A(Ain){}
25 
26  virtual ~EigenLinearOperator(){};
27 
29  virtual Eigen::MatrixXd Apply(Eigen::Ref<const Eigen::MatrixXd> const& x) override {return A*x;};
30 
32  virtual Eigen::MatrixXd ApplyTranspose(Eigen::Ref<const Eigen::MatrixXd> const& x) override {return A.transpose()*x;};
33 
34  virtual Eigen::MatrixXd GetMatrix() override{ return Eigen::MatrixXd(A);};
35 
36 protected:
37  EigenType A;
38 
39 };
40 
41 //template<typename Derived>
42 //std::shared_ptr<LinearOperator> LinearOperator::Create<Eigen::MatrixBase<Derived>>(Eigen::MatrixBase<Derived> const& A)
43 //{
44 // return std::make_shared<EigenLinearOperator>(A);
45 //}
46 
47 template<typename ScalarType>
48 struct LinearOperatorFactory<Eigen::Matrix<ScalarType, Eigen::Dynamic, Eigen::Dynamic>> {
49 
50  static std::shared_ptr<LinearOperator> Create(Eigen::Matrix<ScalarType, Eigen::Dynamic, Eigen::Dynamic> const& A)
51  {
52  return std::make_shared<muq::Modeling::EigenLinearOperator<Eigen::Matrix<ScalarType, Eigen::Dynamic, Eigen::Dynamic>>>(A);
53  }
54 };
55 
56 template<typename ScalarType>
57 struct LinearOperatorFactory<Eigen::SparseMatrix<ScalarType>> {
58 
59  static std::shared_ptr<LinearOperator> Create(Eigen::SparseMatrix<ScalarType> const& A)
60  {
61  return std::make_shared<muq::Modeling::EigenLinearOperator<Eigen::SparseMatrix<ScalarType>>>(A);
62  }
63 };
64 
65 
66 //template<typename Derived>
67 //std::shared_ptr<LinearOperator> muq::Modeling::LinearOperatorFactory<Eigen::MatrixBase<Derived>>::Create(Eigen::MatrixBase<Derived> const& A)
68 //{
69 // return std::make_shared<muq::Modeling::EigenLinearOperator<Eigen::MatrixBase<Derived>>>(A);
70 //}
71 
72 } // namespace Modeling
73 } // namespace MUQ
74 
75 
76 
77 #endif
LinearOperator(int rowsIn, int colsIn, int numInputCols=1)
virtual Eigen::MatrixXd Apply(Eigen::Ref< const Eigen::MatrixXd > const &x)=0
virtual Eigen::MatrixXd ApplyTranspose(Eigen::Ref< const Eigen::MatrixXd > const &x)=0
static std::shared_ptr< LinearOperator > Create(MatrixType const &A)