19#ifndef _GIMLI_BLOCKMATRIX__H
20#define _GIMLI_BLOCKMATRIX__H
25 #include "sparsematrix.h"
42template <
class ValueType >
45 BlockMatrix(
bool verbose=
false)
49 virtual ~BlockMatrix(){
54 virtual uint
rtti()
const {
return GIMLI_BLOCKMATRIX_RTTI; }
56 virtual const Vector < ValueType > operator [] (Index r)
const {
return this->row(r); }
58 virtual Index
rows()
const { recalcMatrixSize();
return rows_; }
60 virtual Index
cols()
const { recalcMatrixSize();
return cols_; }
62 virtual const Vector < ValueType > row(Index r)
const {
63 ASSERT_RANGE(r, 0, rows())
64 Vector < ValueType > b(rows(), 0.0);
69 virtual const
Vector < ValueType > col(Index r)
const{
70 ASSERT_RANGE(r, 0, cols())
71 Vector < ValueType > b(cols(), 0.0);
81 for (Index i = 0; i < matrices_.size(); i ++ ){
82 matrices_[i]->clean();
87 ASSERT_SIZE(matrices_, idx)
88 return matrices_[idx];
91 MatrixBase & matRef(Index idx)
const {
92 ASSERT_SIZE(matrices_, idx)
93 return *matrices_[idx];
96 std::vector< BlockMatrixEntry > entries()
const {
101 return addMatrix(matrix, rowStart, colStart);
109 matrices_.push_back(matrix);
110 return matrices_.size() - 1;
115 ValueType scale=1.0){
129 ValueType scale,
bool transpose=
false){
130 if (matrixID > matrices_.size()){
131 throwLengthError(WHERE_AM_I +
" matrix entry to large: " +
132 str(matrixID) +
" " + str(matrices_.size()));
135 entry.rowStart = rowStart;
136 entry.colStart = colStart;
137 entry.matrixID = matrixID;
139 entry.transpose = transpose;
141 entries_.push_back(entry);
145 void recalcMatrixSize()
const {
146 for (Index i = 0; i < entries_.size(); i++){
150 rows_ = max(rows_, entry.rowStart + mat->
rows());
151 cols_ = max(cols_, entry.colStart + mat->
cols());
155 virtual Vector < ValueType > mult(
const Vector < ValueType > & b)
const;
157 virtual Vector < ValueType > transMult(
const Vector < ValueType > & b)
const;
159 RSparseMapMatrix sparseMapMatrix()
const;
161 virtual void save(
const std::string & filename)
const {
162 std::cerr << WHERE_AM_I <<
"WARNING " <<
" don't save blockmatrix." << std::endl;
167 std::vector< MatrixBase * > matrices_;
168 std::vector< BlockMatrixEntry > entries_;
177template <> DLLEXPORT RVector BlockMatrix< double >::
178 mult(
const RVector & b)
const;
180template <> DLLEXPORT RVector BlockMatrix< double >::
181 transMult(
const RVector & b)
const;
183template <> DLLEXPORT RSparseMapMatrix BlockMatrix< double >::
184 sparseMapMatrix()
const;
186inline RVector transMult(
const BlockMatrix < double > & A,
const RVector & b){
187 return A.transMult(b);
189inline RVector operator * (
const BlockMatrix < double > & A,
const RVector & b){
199 H2SparseMapMatrix(){}
201 virtual ~H2SparseMapMatrix(){}
203 virtual Index
rows()
const {
return H1_.rows(); }
205 virtual Index
cols()
const {
return H1_.cols() + H2_.cols(); }
210 virtual RVector
mult(
const RVector & a)
const {
216 return cat(
H1_.transMult(a), H2_.transMult(a));
220 inline const RSparseMapMatrix &
H1()
const {
return H1_; }
221 inline const RSparseMapMatrix & H2()
const {
return H2_; }
222 inline RSparseMapMatrix & H1() {
return H1_; }
223 inline RSparseMapMatrix & H2() {
return H2_; }
227 RSparseMapMatrix
H1_, H2_;
231inline void rank1Update(
H2SparseMapMatrix & A,
const RVector & u,
const RVector & v) {
236inline bool save(
const H2SparseMapMatrix & A,
const std::string & filename, IOFormat format = Ascii){
251template<
class Matrix1,
class Matrix2 >
class H2Matrix{
255 virtual ~H2Matrix(){}
258 virtual Index
rows()
const {
return H1_.rows(); }
259 virtual Index cols()
const {
return H1_.cols() + H2_.cols(); }
262 virtual RVector
mult(
const RVector & a)
const {
263 return H1_ * a(0, H1_.cols()) + H2_ * a(H1_.cols(), cols());
268 return cat(H1_.transMult(a), H2_.transMult(a));
286 virtual ~HNMatrix(){}
288 void push_back(
Matrix Mat){
289 if (Mats_.size() > 0 && Mats_[0].nrows() == Mat.
rows()) {
290 Mats_.push_back(Mat);
292 throwLengthError(WHERE_AM_I +
" matrix rows do not match " +
293 toStr(Mats_[0].nrows()) +
" " + toStr(Mat.nrows()));
298 if (Mats_.size() > 0)
return Mats_[0].rows();
303 for (Index i=0 ; i < Mats_.cols() ; i++) ncols += Mats_[i].
cols();
308 std::vector < Matrix > Mats_;
322 HRMatrix(
const Matrix & Mat, Index nmats) : Mat_(Mat), nmats_(nmats){}
326 void setNumber(Index nmats){ nmats_ = nmats; }
328 virtual Index
rows()
const {
return Mat_.rows(); }
329 virtual Index
cols()
const {
return Mat_.cols() * nmats_; }
331 inline const Matrix & Mat()
const {
return Mat_; }
332 inline Matrix & Mat() {
return Mat_; }
Block matrices for easier inversion, see appendix E in GIMLi tutorial.
Definition blockmatrix.h:33
virtual void clean()
Definition blockmatrix.h:80
Index addMatrix(MatrixBase *matrix)
Definition blockmatrix.h:107
void addMatrixEntry(Index matrixID, Index rowStart, Index colStart)
Definition blockmatrix.h:122
virtual uint rtti() const
Definition blockmatrix.h:54
virtual void clear()
Definition blockmatrix.h:76
virtual void save(const std::string &filename) const
Definition blockmatrix.h:161
virtual Index cols() const
Definition blockmatrix.h:60
Index add(MatrixBase *matrix, Index rowStart, Index colStart)
Definition blockmatrix.h:100
virtual Index rows() const
Definition blockmatrix.h:58
void addMatrixEntry(Index matrixID, Index rowStart, Index colStart, ValueType scale, bool transpose=false)
Definition blockmatrix.h:128
Index addMatrix(MatrixBase *matrix, Index rowStart, Index colStart, ValueType scale=1.0)
Definition blockmatrix.h:114
Definition blockmatrix.h:279
Definition blockmatrix.h:314
Definition blockmatrix.h:341
virtual RVector mult(const RVector &a) const
Definition blockmatrix.h:262
virtual Index rows() const
Definition blockmatrix.h:258
virtual RVector transMult(const RVector &a) const
Definition blockmatrix.h:267
Definition blockmatrix.h:196
virtual Index rows() const
Definition blockmatrix.h:203
virtual Index cols() const
Definition blockmatrix.h:205
RSparseMapMatrix H1_
create inplace (or better hold references of it?)
Definition blockmatrix.h:227
virtual RVector transMult(const RVector &a) const
Definition blockmatrix.h:215
virtual RVector mult(const RVector &a) const
Definition blockmatrix.h:210
const RSparseMapMatrix & H1() const
Definition blockmatrix.h:220
virtual void clear()
Definition blockmatrix.h:207
virtual Index rows() const
Definition blockmatrix.h:297
virtual Index cols() const
Definition blockmatrix.h:301
Definition blockmatrix.h:317
virtual Index rows() const
Definition blockmatrix.h:328
virtual Index cols() const
Definition blockmatrix.h:329
HRMatrix()
Definition blockmatrix.h:320
Interface class for matrices.
Definition matrix.h:137
MatrixBase(bool verbose=false)
Definition matrix.h:141
virtual Index cols() const
Definition matrix.h:163
virtual Index rows() const
Definition matrix.h:157
Simple row-based dense matrix based on Vector.
Definition matrix.h:324
Index rows() const
Definition matrix.h:422
Definition blockmatrix.h:277
Definition blockmatrix.h:312
Definition blockmatrix.h:339
One dimensional array aka Vector of limited size.
Definition vector.h:186
GIMLi main namespace for the Geophyiscal Inversion and Modelling Library.
Definition baseentity.h:24
H2Matrix< RMatrix, RMatrix > RH2Matrix
nomenclature: Type(R/S)+Alignment(H/V/D)+Number(2/N/R)+Matrix
Definition blockmatrix.h:345
H2Matrix< IdentityMatrix, IdentityMatrix > TwoModelsCMatrix
Some examples useful for special inversions.
Definition blockmatrix.h:351