32 template <
class numero>
    37     typedef typename ZMatrix_number::size_type size_type;
    38     typedef std::map<size_type,numero> map_elem;
    43         typedef typename map_elem::iterator iterator;
    44         typedef typename map_elem::const_iterator const_iterator;
    45         typedef typename map_elem::const_reverse_iterator const_reverse_iterator;
    46         typedef typename map_elem::key_type key_type;
    48         inline int hasRow(
const typename sp_vector::size_type f)
 const    49           { 
return (find(f)!=this->end()); }
    53         void QuitaElem(
const numero &n);
    54         void PutCol(
const typename sp_vector::size_type c,ZMatrix_number &m) 
const;
    55         sp_vector getNumberOfRows(
const typename sp_vector::size_type f1,
const typename sp_vector::size_type f2) 
const;
    56         size_t ndiagL(
const size_t &icol) 
const;
    57         size_t ndiagU(
const size_t &icol) 
const;
    58         void writeCpp(std::ostream &os,
const size_t &icol) 
const;
    59     void PutColBanda(
const size_t &sz,
const size_t &i,
const size_t &ndiagu,numero *vptr) 
const;
    61     typedef std::map<size_type, sp_vector> column_map;
    65     typedef typename sp_vector::const_iterator const_f_iterator;
    66     typedef typename sp_vector::iterator f_iterator;
    67     typedef typename column_map::const_iterator const_c_iterator;
    68     typedef typename column_map::iterator c_iterator;
    71     inline virtual size_type Tam(size_type ,size_type )
    73     inline virtual size_type Indice(
const size_type &iRow,
const size_type &col)
 const    75     inline bool hasColumn(
const size_type &c)
 const    76       { 
return (columns.find(c)!=columns.end()); }
    77     inline const numero &PorDefecto(
void)
 const    78       { 
return (ZMatrix_number::operator()(1,1)); }
    88     matdispZ(size_type n_rows=1,size_type n_columns= 1)
    89       : ZMatrix_number(1,1,numero())
    90       { this->PutDim(n_rows,n_columns); }
    92       : ZMatrix_number(other), columns(other.columns)
    93       { this->PutDim(other.n_rows,other.n_columns); }
    96         ZMatrix_number::operator =(m);
   104     size_t ndiagL(
void) 
const;
   105     size_t ndiagU(
void) 
const;
   108     numero &operator()(
size_t iRow=1,
size_t col=1)
   110         assert(col>0 && col<=this->n_columns);
   111         assert(iRow>0 && iRow<=this->n_rows);
   113     numero &retval= column[iRow];
   116     const numero &operator()(
size_t iRow=1,
size_t col=1)
 const   118         const_c_iterator k1= columns.find(col);
   119         if(k1!=columns.end())
   121         const_f_iterator k2= (k1->second).find(iRow);
   122             if(k2!= (k1->second).end())
   130     const_c_iterator columns_begin(
void)
 const   131       { 
return columns.begin(); }
   132     const_c_iterator columns_end(
void)
 const   133       { 
return columns.end(); }
   134     c_iterator columns_begin(
void)
   135       { 
return columns.begin(); }
   136     c_iterator columns_end(
void)
   137       { 
return columns.end(); }
   138     const_f_iterator rows_begin(
const const_c_iterator &ci)
 const   139       { 
return ci->second.begin(); }
   140     const_f_iterator find_row(
const const_c_iterator &ci,
size_t f)
 const   141       { 
return ci->second.find(f); }
   142     const_f_iterator rows_end(
const const_c_iterator &ci)
 const   143       { 
return ci->second.end(); }
   144     f_iterator find_row(
const c_iterator &ci,
size_t f)
   145       { 
return ci->second.find(f); }
   146     sp_vector &getColumn(
const c_iterator &ci)
   147       { 
return ci->second; }
   149     size_type size(
void) 
const;
   153     inline bool Cuadrada(
void)
 const   154       { 
return (this->n_rows == this->n_columns); }
   164       { 
return getBox(iRow,1,iRow,this->n_columns); }
   166       { 
return getBox(1,col,this->n_rows,col); }
   168     numero Traza(
void) 
const;
   169     ZMatrix_number GetCompleta(
void) 
const;
   171     void writeCpp(std::ostream &os) 
const;
   174     numero dot(
const V &v2) 
const   179         return (this->Post(v2))(1,1);
   186         return (this->Post(v2))(1,1);
   205       { 
return m1.EqualTo(m2); }
   210       { 
return v1.dot(v2); }
   212       { 
return v1.dot(v2); }
   253 template<
class numero>
   257     for(f= v.begin();f!=v.end();f++)
   259         (*
this)[f->first]+= f->second;
   261         (*
this)[f->first]= f->second;
   264 template<
class numero>
   268     for(f= v.begin();f!=v.end();f++)
   270         (*
this)[f->first]-= f->second;
   272         (*
this)[f->first]= f->second;
   275 template<
class numero>
   278     std::deque<key_type> markedForDeath;
   279     for(const_iterator f= this->begin();f!=this->end();f++)
   281     markedForDeath.push_back(f->first);
   282     for(
auto i= markedForDeath.begin();i!=markedForDeath.end();i++)
   285 template<
class numero>
   289     for(f= this->begin();f!=this->end();f++)
   290       m(f->first,c)= f->second;
   292 template<
class numero>
   296     if(f2<f1) 
return retval;
   298     for(f= this->begin();f!=this->end();f++)
   299       if((f->first>=f1) && (f->first<=f2))
   300         retval[f->first-f1+1]= f->second;
   306 template<
class numero>
   312         const numero zero= numero();
   313         for(const_reverse_iterator f= this->rbegin();f!=this->rend();f++)
   315             const size_t iRow= f->first;
   318                 if(f->second != zero) 
   333 template<
class numero>
   339         const numero zero= numero();
   340         for(const_iterator f= this->begin();f!=this->end();f++)
   342             const size_t iRow= f->first;
   345                 if(f->second != zero) 
   359 template<
class numero>
   364         const numero zero= numero();
   365         for(const_iterator f= this->begin();f!=this->end();f++)
   366           if(f->second != zero)
   367             os << 
"mtx(" << f->first << 
',' << icol << 
")= " << f->second << 
"; ";
   377 template<
class numero>
   382         const numero zero= numero();
   383         const int offset= (icol-1)*sz-icol+ndiagu;
   384         for(const_iterator f= this->begin();f!=this->end();f++)
   386             const size_t iRow_banda= f->first+offset;
   387             if(f->second != zero)
   388               vptr[iRow_banda]= f->second;
   394 template <
class numero>
   398     for(c= m.columns.begin();c!=m.columns.end();c++)
   399       if(hasColumn(c->first))
   400         columns[c->first]+= c->second;
   402         columns[c->first]= c->second;
   406 template <
class numero>
   410     for(c= m.columns.begin();c!=m.columns.end();c++)
   411       if(hasColumn(c->first))
   412         columns[c->first]-= c->second;
   414         columns[c->first]= c->second;
   418 template <
class numero>
   423     for(c= columns.begin();c!=columns.end();c++)
   424       retval+=c->second.size();
   428 template <
class numero>
   431     const numero &n= PorDefecto();
   432     typename column_map::iterator c;
   433     for(c= columns.begin();c!=columns.end();c++)
   434       c->second.QuitaElem(n);
   437 template <
class numero>
   439   { columns.erase(columns.begin(),columns.end()); }
   441 template <
class numero>
   445     if(this->n_rows!=this->n_columns)
   446       std::cerr << 
"matdispZ::" << __FUNCTION__
   447             << 
"not a square matrix: "   448             << this->n_rows << 
" x " << this->n_columns << std::endl;
   449     const size_t sz= std::min(this->n_rows,this->n_columns);
   450     for(
size_t i=1;i<=sz;i++)
   455 template <
class numero>
   458     ZMatrix_number::Trn();
   461     for(c= columns.begin();c!=columns.end();c++)
   462       for(f= c->second.find(c->first+1);f!=c->second.end();f++)
   463         std::swap((*
this)(f->first,c->first),(*
this)(c->first,f->first));
   468 template <
class numero>
   473     for(c= columns.begin();c!=columns.end();c++)
   474       retval= std::max(retval,c->second.ndiagL(c->first));
   477 template <
class numero>
   482     for(c= columns.begin();c!=columns.end();c++)
   483       retval= std::max(retval,c->second.ndiagU(c->first));
   488 template<
class numero>
   491     const size_t ndiagu= 
ndiagU();
   492     const size_t ndiagl= 
ndiagL();
   493     const size_t ancho_banda= ndiagl+ndiagu+1;
   494     for(const_c_iterator c= columns.begin();c!=columns.end();c++)
   495       c->second.PutColBanda(ancho_banda,c->first,ndiagu,vptr);
   499 template<
class numero>
   502     for(const_c_iterator c= columns.begin();c!=columns.end();c++)
   503       c->second.writeCpp(os,c->first);
   507 template <
class numero>
   511     this->check_get_box(f1,c1,f2,c2);
   515     for(c= columns.begin();c!=columns.end();c++)
   516       for(f= c->second.begin();f!=c->second.end();f++)
   517         if( (c->first>=c1) && (c->first<=c2) &&
   518             (f->first>=f1) && (f->first<=f2))
   519           box(f->first-f1+1,c->first-c1+1)= f->second;
   523 template <
class numero>
   526     check_put_box(f,c,box);
   528     for (i=1;i<=box.n_rows;i++)
   529       for (j=1;j<=box.n_columns;j++)
   530         (*
this)(i+f-1,j+c-1)= box(i,j);
   534 template<
class numero>
   541     for(c= columns.begin();c!=columns.end();c++)
   542       if((f= c->second.find(c->first)) != c->second.end())
   547 template<
class numero>
   552     for(c= columns.begin();c!=columns.end();c++)
   553       c->second.PutCol(c->first,retval);
   557 template<
class numero>
   560     if(!CompDim(*
this,other)) 
return false;
   561     typename matdispZ<numero>::const_c_iterator c;
   562     for(c= this->columns.begin();c!=this->columns.end();c++)
   564         typename matdispZ<numero>::const_f_iterator f;
   565         for(f= c->second.begin();f!=c->second.end();f++)
   566           if(f->second != other(f->first,c->first)) 
return false;
   571 template<
class numero>
   580     for(bc= b.columns.begin();bc!=b.columns.end();bc++)
   581       for(c= columns.begin();c!=columns.end();c++)
   582         for(f= c->second.begin();f!=c->second.end();f++)
   583           ret(f->first,bc->first)+= f->second*b(c->first,bc->first);
   587 template<
class numero>
   597     for(bc= 1;bc<=b.getNumberOfColumns();bc++)
   598       for(c= columns.begin();c!=columns.end();c++)
   599         for(f= c->second.begin();f!=c->second.end();f++)
   600           ret(f->first,bc)+= f->second*b(c->first,bc);
 Definition: matdispZ.h:33
Matrix which element type has estructura de anillo respecto a las operaciones + y *...
Definition: ZMatrix.h:37
void writeCpp(std::ostream &os) const
Writes the matrix in C++ format (only non-zero components). 
Definition: matdispZ.h:500
void PutColBanda(const size_t &sz, const size_t &i, const size_t &ndiagu, numero *vptr) const
Coloca los elementos de the column que forman parte de la banda en el vector que is being passed as p...
Definition: matdispZ.h:378
void writeCpp(std::ostream &os, const size_t &icol) const
Escribe los elementos no nulos de the column en formato de C++. 
Definition: matdispZ.h:360
size_t ndiagL(const size_t &icol) const
Return el número de diagonales, con algún elemento no nulo, que tiene the column por debajo de la dia...
Definition: matdispZ.h:307
void FillVectorBanda(numero *vptr) const
Rellena el vector en banda que is being passed as parameter para su empleo en Arpack++. 
Definition: matdispZ.h:489
size_t ndiagU(const size_t &icol) const
Return el número de diagonales, con algún elemento no nulo, que tiene the column por encima de la dia...
Definition: matdispZ.h:334
Definition: matdispZ.h:40