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