32 MATR prod_vectorial(
const MATR &v1,
const MATR &v2);
36 template <
class numero>
43 typedef typename vectorZ_numero::reference reference;
44 typedef typename vectorZ_numero::const_reference const_reference;
45 typedef typename vectorZ_numero::value_type value_type;
46 typedef typename vectorZ_numero::size_type size_type;
47 typedef typename mT_numero::lst_T lst_numero;
51 numero DMGT(
const numero &eps)
const;
54 numero row_sum(size_type i)
const;
55 numero column_sum(size_type j)
const;
57 ZMatrix(
void) : mT_numero(1,1) {}
58 ZMatrix(size_type n_rows,size_type n_columns) : mT_numero(n_rows,n_columns) {}
59 ZMatrix(size_type n_rows,size_type n_columns,numero val) : mT_numero(n_rows,n_columns,val) {}
60 ZMatrix(size_type n_rows,size_type n_columns,
const lst_numero &ln) : mT_numero(n_rows,n_columns)
61 { vectorZ_numero::operator=(vectorZ_numero(ln)); }
63 template <
class InputIterator>
64 ZMatrix(
const size_t &n_rows,
const size_t &n_columns,InputIterator b,InputIterator e);
77 this->check_sto_sum(m);
83 this->check_sto_dif(m);
97 numero row_maximum(size_type i)
const;
98 numero column_maximum(size_type j)
const;
99 void PutSuma(size_type i,size_type j,
const numero &n)
101 { vectorZ_numero::PutSuma(Indice(i,j),n); }
102 void PutResta(size_type i,size_type j,
const numero &n)
104 { vectorZ_numero::PutResta(Indice(i,j),n); }
105 void PutProd(size_type i,size_type j,
const numero &n)
107 { vectorZ_numero::PutProd(Indice(i,j),n); }
108 void swap(size_type f1,size_type c1,size_type f2, size_type c2)
109 { vectorZ_numero::swap(Indice(f1,c1),Indice(f2,c2)); }
123 {
return getBox(iRow,1,iRow,this->n_columns); }
125 {
return getBox(1,col,this->n_rows,col); }
130 numero
GetDet(
const numero &eps= 1e-10)
const;
131 numero
Traza(
void)
const;
132 inline bool Nulo(
const numero &tol= numero())
const 133 {
return (this->
Abs2()<(tol*tol)); }
136 inline void Neg(
void)
139 virtual void Input(std::istream &);
140 virtual void Input(
const std::string &);
143 {
return ((
const mT_numero &) m1 == (
const mT_numero &) m2); }
162 numero
Abs2(
void)
const;
163 numero
Abs(
void)
const;
169 {
return v1.dot(v2); }
195 {
return prod_vectorial(v1,v2); }
199 template <
class numero>
template<
class InputIterator>
203 template <
class numero>
211 template <
class numero>
213 { return ::GetMenor(*
this,f,c); }
215 template <
class numero>
219 for(i=1;i<=box.n_rows;i++)
220 for(j=1;j<=box.n_columns;j++)
221 PutSuma(i+f-1,j+c-1,box(i,j));
224 template <
class numero>
230 vectorZ_numero::Con(numero());
231 for(i= 1;i<=this->n_rows;i++) (*
this)(i,i)= neutro_producto(numero());
237 template <
class MATR>
238 MATR prod_vectorial(
const MATR &v1,
const MATR &v2)
240 MATR v(v1.getNumberOfRows(),v1.getNumberOfColumns());
241 MATR m(v1.getNumberOfRows(),3);
245 menor= GetMenor(m,1,1);
246 v(1,1)= menor.GetDet();
247 menor= GetMenor(m,2,1);
248 v(2,1)= -menor.GetDet();
249 menor= GetMenor(m,3,1);
250 v(3,1)= menor.GetDet();
258 template <
class numero>
262 numero p= neutro_suma(numero());
263 const numero cero= neutro_suma(p);
264 size_type n= this->getNumberOfRows();
273 p= (*this)(1,1)*(*
this)(2,2)-(*
this)(1,2)*(*
this)(2,1);
276 p= (*this)(1,1)*(*
this)(2,2)*(*
this)(3,3);
277 p+= (*this)(1,2)*(*
this)(2,3)*(*
this)(3,1);
278 p+= (*this)(1,3)*(*
this)(2,1)*(*
this)(3,2);
279 p-= (*this)(1,3)*(*
this)(2,2)*(*
this)(3,1);
280 p-= (*this)(1,2)*(*
this)(2,1)*(*
this)(3,3);
281 p-= (*this)(1,1)*(*
this)(2,3)*(*
this)(3,2);
285 for(size_type i= 1;i<= n;i++)
302 template <
class numero>
304 {
return DMGT(eps); }
306 template <
class numero>
307 std::ostream &operator<<(std::ostream &os,const ZMatrix<numero> &m)
310 typename ZMatrix<numero>::size_type i,j;
311 typename ZMatrix<numero>::size_type n_rows= m.getNumberOfRows(),n_columns= m.getNumberOfColumns();
312 for(i= 1;i<=n_rows;i++)
315 if(n_columns > 0) os << m(i,1);
316 for(j= 2;j<=n_columns;j++)
324 template <
class numero>
331 template<
class numero>
340 template<
class numero>
344 ZMatrix<numero> producto(m1.getNumberOfRows(),m2.getNumberOfColumns());
345 size_t n_rows= m1.getNumberOfRows();
346 size_t ncols_m1= m1.getNumberOfColumns();
347 size_t ncols= m2.getNumberOfColumns();
348 typedef typename ZMatrix<numero>::size_type sz_type;
349 for(sz_type i=1;i<=n_rows;i++)
350 for(sz_type j=1;j<=ncols;j++)
352 numero t= m1(i,1) * m2(1,j);
353 for(sz_type k=2;k<= ncols_m1;k++)
354 t+= m1(i,k) * m2(k,j);
360 template<
class numero>
387 const size_t n= this->n_rows;
389 size_t ko,lo; numero po,t0;
393 while (*it==1 && k<n)
395 po=C(k,k); lo=k; ko=k;
398 if(fabs(C(i,j))>fabs(po))
399 { po=C(i,j); lo=i; ko=j; }
404 std::cerr << std::endl
405 <<
"Error: pivot too small!" << std::endl;
411 { t0=C(k,j); C(k,j)=C(lo,j); C(lo,j)=t0; }
414 { t0=C(i,k); C(i,k)=C(i,ko); C(i,ko)=t0; }
415 for(i=k+1; i<=n; i++)
418 for(j=k+1; j<=n; j++)
419 C(i,j)-= C(i,k)*C(k,j);
424 if(*it==1 && fabs(C(n,n))<eps) *it=0;
427 template <
class numero>
452 const size_t n= this->n_rows;
456 const numero cero= neutro_suma(d0);
457 const numero uno= neutro_producto(d0);
461 TSRGT(eps,&it,C,Kp,Lp);
468 for(k=1; k<=n; k++) d0 *= C(k,k);
475 if ((l%2)!=0) d0=-d0;
481 template <
class numero>
484 this->check_get_box(f1,c1,f2,c2);
486 for(size_type i=1;i<=box.n_rows;i++)
487 for(size_type j=1;j<=box.n_columns;j++)
493 template <
class numero>
498 for(size_type i= 1;i<=this->n_rows;i++) n+= (*
this)(i,i);
501 template <
class numero>
504 numero sumaf= (*this)(i,1);
505 for(
size_t j=2;j<=this->n_columns;j++)
506 sumaf+= (*
this)(i,j);
509 template <
class numero>
512 numero sumac= (*this)(1,j);
513 for(
size_t i=2;i<=this->n_columns;i++)
514 sumac+= (*
this)(i,j);
517 template <
class numero>
520 numero maxf= (*this)(i,1);
521 for(
size_t j=2;j<=this->n_columns;j++)
522 maxf= std::max(maxf,(*
this)(i,j));
525 template <
class numero>
528 numero maxc= (*this)(1,j);
529 for(
size_t i=2;i<=this->n_columns;i++)
530 maxc+= std::max(maxc,(*
this)(i,j));
535 template <
class numero>
538 numero maximo= row_sum(1);
539 for(
size_t i=2;i<=this->n_rows;i++) maximo= max(maximo,row_sum(i));
544 template <
class numero>
547 numero maximo= column_sum(1);
548 for(
size_t j=2;j<=this->n_columns;j++) maximo= max(maximo,column_sum(j));
551 template <
class numero>
557 numero retval((*
this)(1,1)*v2(1,1));
558 typename ZMatrix<numero>::size_type i;
559 for(i=2;i<=this->n_columns;i++)
560 { retval+= (*this)(1,i) * v2(i,1); }
565 template <
class numero>
584 template <
class numero>
586 {
return sqrt(
Abs2()); }
589 template <
class numero>
593 typename ZMatrix<numero>::lst_numero ln;
594 size_t n_rows=0,n_columns=1;
598 if(c !=
'[') is.putback(c);
599 std::istream::sentry ipfx(is);
623 if(sigue) n_columns++;
636 template <
class numero>
639 std::istringstream iss(str);
644 template <
class treal>
ZMatrix< numero > getBox(size_t f1, size_t c1, size_t f2, size_t c2) const
Return the box between the indices being passed as parameter.
Definition: ZMatrix.h:482
numero getColumnNorm(void) const
Return the maximum value of the components of the vector obtained by adding the components of the col...
Definition: ZMatrix.h:545
Matrix which element type has estructura de anillo respecto a las operaciones + y *...
Definition: ZMatrix.h:37
TMatrix< numero, vectorZ< numero > > & operator=(const TMatrix< numero, vectorZ< numero > > &m)
Assignment operator.
Definition: TMatrix.h:192
numero Abs(void) const
Return the norm (euclidean norm) of the matrix.
Definition: ZMatrix.h:585
numero getRowNorm(void) const
Return el valor máximo de los elementos del vector que resulta de sumar los rows elements.
Definition: ZMatrix.h:536
virtual void Input(std::istream &)
Lectura desde istream.
Definition: ZMatrix.h:590
numero GetDetLento(void) const
Return el determinante.
Definition: ZMatrix.h:259
numero Traza(void) const
Return the trace of the matrix.
Definition: ZMatrix.h:494
numero GetDet(const numero &eps=1e-10) const
Return el determinante.
Definition: ZMatrix.h:303
numero Abs2(void) const
Return the squared norm (euclidean norm) of the matrix.
Definition: ZMatrix.h:566