MSpin-JCoupling  2.1
mathtools.h
1 /***************************************************************************
2  mathtools.h - description
3  -------------------
4  author : Armando Navarro-Vazquez
5  email : armando.deus@gmail.com
6  ***************************************************************************/
7 
8 /***************************************************************************
9  * *
10  * This program is free software; you can redistribute it and/or modify *
11  * it under the terms of the GNU General Public License as published by *
12  * the Free Software Foundation; either version 2 of the License, or *
13  * (at your option) any later version. *
14  * *
15  ***************************************************************************/
16 
17 #ifndef MAGNESMATHTOOLS_H
18 #define MAGNESMATHTOOLS_H
19 
20 #include <cstring>
21 #include <assert.h>
22 #include <string>
23 #include <iostream>
24 #include "exception.h"
25 
26 #ifndef M_PI
27 #define M_PI 3.14159265358979323846
28 #endif
29 
30 #include "arrays_defines.h"
31 
32 #include "toolsexport.h"
33 
35 namespace magnes
36 {
37 
38 template <class X,int N> class D1StaticArray
39 {
40 private:
41  X m_data[N];
42 public:
44  {
45  assert(N>0);
46  }
48  D1StaticArray(const X& x)
49  {
50  for(size_t i=0;i<N;++i)
51  {
52  m_data[i]=x;
53  }
54  }
56  const X& operator()(size_t i) const
57  {
58  assert(i<N);
59  return m_data[i];
60  }
61 
63  X& operator()(size_t i)
64  {
65  return m_data[i];
66  }
68  operator X*()
69  {
70  return &m_data[0];
71  }
73  operator const X*() const
74  {
75  return &m_data[0];
76  }
77 
79  size_t size() const
80  {
81  return N;
82  }
83 
84 };
89 template <class X> class D1Array
90 {
91 
92 private:
93  X* m_data;
94 public:
96  D1Array() : m_size ( 0 )
97  {
98  m_data=NULL;
99  }
101  explicit D1Array ( size_t i ) : m_size ( i )
102  {
103  m_data= new X[i];
104  }
106  D1Array ( size_t i,const X& x );
108  D1Array ( const D1Array& x );
110  void Initialize ( size_t i )
111  {
112  if ( m_data )
113  delete [] m_data;
114  m_data = new X[i];
115  m_size=i;
116  }
118  void Initialize ( size_t i, const X& x );
121  {
122  if ( m_data )
123  delete [] m_data;
124  }
125  void Clear()
126  {
127  if ( m_data )
128  delete [] m_data;
129  m_data=NULL;
130  m_size=0;
131  }
133  X& operator () ( size_t i );
135  const X& operator() ( size_t i ) const;
137  operator X*()
138  {
139  return m_data;
140  }
142  operator const X*() const
143  {
144  return m_data;
145  }
147  D1Array& operator= ( const D1Array& x );
148 
150  void operator*=(const X& x);
152  void operator/=(const X& x);
154  size_t size() const
155  {
156  return m_size;
157  }
158 
159 private:
160  size_t m_size;
161 
162 };
163 
164 
165 template<class X> D1Array<X>::D1Array ( size_t i, const X& x ) : m_size ( i )
166 {
167  m_data = new X[i];
168  for ( size_t k=0;k<i;k++ )
169  m_data[k]=x;
170 }
171 template <class X> D1Array<X>::D1Array ( const D1Array<X>& x )
172 {
173 
174  m_size=x.size();
175  if ( x.m_data !=NULL )
176  {
177  m_data= new X[m_size];
178 
179  memcpy ( m_data,x,m_size*sizeof ( X ) );
180  }
181  else m_data = NULL;
182 
183 }
184 
185 template <class X> D1Array<X>& D1Array<X>::operator= ( const D1Array<X>& x )
186 {
187  if ( m_data )
188  delete [] m_data;
189  m_size=x.size();
190  if ( x.m_data != NULL )
191  {
192  m_data= new X[m_size];
193  memcpy ( m_data,x,m_size*sizeof ( X ) );
194  }
195  else m_data = NULL;
196  return *this;
197 
198 }
199 template<class X> void D1Array<X>::Initialize ( size_t i, const X& x )
200 {
201  if ( m_data )
202  delete [] m_data;
203  m_size=i;
204  m_data = new X[i];
205  for ( size_t k=0;k<i;k++ )
206  m_data[k]=x;
207 }
208 
209 template <class X> X& D1Array<X>::operator () ( size_t i )
210 {
211  assert ( i < m_size );
212  return m_data[i];
213 }
214 
215 template <class X> const X& D1Array<X>::operator () ( size_t i ) const
216 {
217  assert ( i < m_size );
218  return m_data[i];
219 }
220 
221 template <class X> void D1Array<X>::operator*=(const X& x)
222 {
223  for(size_t i=0;i<this->size();++i)
224  {
225  (*this)[i]*=x;
226  }
227 }
228 
229 template <class X> void D1Array<X>::operator/=(const X& x)
230 {
231  for(size_t i=0;i<this->size();++i)
232  {
233  (*this)[i]/=x;
234  }
235 }
236 
237 
242 template<class X> class D2Array
243 {
244 private:
245  X* m_data;
246 public:
249  {
250  m_rows=m_columns=0;
251  m_data=NULL;
252  }
254  explicit D2Array ( size_t i, size_t j ) : m_rows ( i ), m_columns ( j )
255  {
256  m_data = new X[i*j];
257  }
259  D2Array ( size_t i,size_t j, const X& x );
261  D2Array ( const D2Array& x );
263  D2Array& operator= ( const D2Array& x );
265  void operator+=(const D2Array& x);
267  void operator-=(const D2Array& x);
269  void operator*=(const X& x);
271  void operator /=(const X& x);
273  void Initialize ( size_t i, size_t j )
274  {
275  assert( i > 0 && j > 0 );
276  m_rows=i;
277  m_columns=j;
278  if ( m_data )
279  delete [] m_data;
280  m_data= new X[i*j];
281  }
283  bool Empty() const
284  {
285  return ( m_data == NULL );
286  }
288  void Initialize ( size_t i, size_t j,const X& x );
291  {
292  if ( m_data )
293  delete [] m_data;
294  }
295  void Clear()
296  {
297  if ( m_data )
298  delete [] m_data;
299  m_data=NULL;
300  m_rows=m_columns=0;
301  }
303  X& operator() ( size_t i, size_t j );
305  const X& operator() ( size_t i, size_t j ) const;
307  operator X*()
308  {
309  return m_data;
310  }
312  operator const X*() const
313  {
314  return m_data;
315  }
316  //arithmetic operators
318  size_t NRows() const
319  {
320  return m_rows;
321  }
323  size_t NColumns() const
324  {
325  return m_columns;
326  }
328  void SwapRows ( size_t i, size_t j );
330  void SwapColumns ( size_t i, size_t j );
332  D2Array<X> RemoveRow ( size_t row );
334  D2Array<X> RemoveColumn ( size_t column );
336  D1Array<X> GetRow ( size_t row ) const;
338  D1Array<X> GetColumn ( size_t column ) const;
340  D2Array<X> SymmetricPart() const;
342  D2Array<X> AntiSymmetricPart() const;
344  void Transpose();
346  X Trace() const;
347 
348 private:
349  size_t m_rows;
350  size_t m_columns;
351 };
352 
353 
354 
355 template<class X> D2Array<X>::D2Array ( size_t i, size_t j, const X& x ) : m_rows ( i ), m_columns ( j )
356 {
357  size_t total=i*j;
358  m_data = new X[total];
359  for ( size_t k=0;k<total;++k )
360  m_data[k]=x;
361 }
362 
363 template<class X> void D2Array<X>::Initialize ( size_t i, size_t j, const X& x )
364 {
365  if ( m_data )
366  delete [] m_data;
367  m_rows=i;
368  m_columns=j;
369  size_t total=i*j;
370  m_data = new X[total];
371  for ( size_t k=0;k<total;++k )
372  m_data[k]=x;
373 
374 }
375 
376 template <class X> D2Array<X>::D2Array ( const D2Array<X>& x )
377 {
378  m_rows=x.NRows();
379  m_columns=x.NColumns();
380  if ( x.m_data != NULL )
381  {
382  m_data= new X[m_rows*m_columns];
383  memcpy ( m_data,x,m_rows*m_columns*sizeof ( X ) );
384  }
385  else m_data = NULL;
386 }
387 
388 template <class X> D2Array<X>& D2Array<X>::operator= ( const D2Array& x )
389 {
390  if ( m_data )
391  delete [] m_data;
392  m_rows=x.NRows();
393  m_columns=x.NColumns();
394  if ( x.m_data == NULL )
395  {
396  m_data=NULL;
397  }
398  else
399  {
400  m_data= new X[m_rows*m_columns];
401  memcpy ( m_data,x,m_rows*m_columns*sizeof ( X ) );
402  }
403  return *this;
404 }
405 
406 template <class X> void D2Array<X>::operator += ( const D2Array& x)
407 {
408  assert ( this->m_rows == x.m_rows && this->m_columns == x.m_columns );
409  for(size_t i=0;i<m_rows;++i)
410  for(size_t j=0;j<m_columns;++j)
411  (*this)(i,j)+=x(i,j);
412 }
413 
414 template <class X> void D2Array<X>::operator -= ( const D2Array& x)
415 {
416  assert ( this->m_rows == x.m_rows && this->m_columns == x.m_columns );
417  for(size_t i=0;i<m_rows;++i)
418  for(size_t j=0;j<m_columns;++j)
419  (*this)(i,j)-=x(i,j);
420 }
421 
422 template <class X> void D2Array<X>::operator *=(const X& x)
423 {
424  for(size_t i=0;i<this->NRows();++i)
425  for(size_t j=0;j<this->NColumns();++j)
426  {
427  (*this)(i,j)*=x;
428  }
429 }
430 
431 template <class X> void D2Array<X>::operator /=(const X& x)
432 {
433  for(size_t i=0;i<this->NRows();++i)
434  for(size_t j=0;j<this->NColumns();++j)
435  {
436  (*this)(i,j)/=x;
437  }
438 }
439 
440 template <class X> X& D2Array<X>::operator() ( size_t i, size_t j )
441 {
442  return m_data[j*m_rows+i];
443 }
444 
445 template <class X>
446 const X& D2Array<X>::operator() ( size_t i, size_t j ) const
447 {
448  return m_data[j*m_rows+i];
449 }
450 
451 template <class X> void D2Array<X>::SwapRows ( size_t i, size_t j )
452 {
453 
454  for ( size_t k=0;k<m_columns;++k )
455  {
456  X tmp=m_data[k*m_rows+j];
457  m_data[k*m_rows+j]=m_data[k*m_rows+i];
458  m_data[k*m_rows+i]=tmp;
459  }
460 }
461 
462 template <class X> void D2Array<X>::SwapColumns ( size_t i, size_t j )
463 {
464  for ( size_t k=0;k<m_rows;++k )
465  {
466  X tmp= ( *this ) ( k,i );
467  ( *this ) ( k,i ) = ( *this ) ( k,j );
468  ( *this ) ( k,j ) =tmp;
469  }
470 }
471 
472 
473 template <class X> D2Array<X> D2Array<X>::RemoveRow ( size_t row )
474 {
475  D2Array<X> nmat ( m_rows-1,m_columns );
476  size_t k=0;
477  for ( size_t i=0;i<m_rows;i++ )
478  {
479  if ( i != row )
480  {
481  for ( size_t j=0;j<m_columns;j++ )
482  nmat ( k,j ) = ( *this ) ( i,j );
483  k++;
484  }
485 
486  }
487 
488  return nmat;
489 }
490 
491 
492 template <class X> D2Array<X> D2Array<X>::RemoveColumn ( size_t column )
493 {
494  D2Array<X> nmat ( m_rows,m_columns-1 );
495 
496  for ( size_t i=0;i<m_rows;i++ )
497  {
498  size_t k=0;
499  for ( size_t j=0;j<m_columns;j++ )
500  {
501  if ( j!=column )
502  nmat ( i,k++ ) = ( *this ) ( i,j );
503  }
504  }
505  return nmat;
506 }
507 
508 template <class X> D1Array<X> D2Array<X>::GetRow ( size_t row ) const
509 {
510  D1Array<X> fila ( m_columns );
511  for ( size_t i=0;i<m_columns;i++ )
512  fila ( i ) = ( *this ) ( row,i );
513 
514  return fila;
515 }
516 
517 template <class X> D1Array<X> D2Array<X>::GetColumn ( size_t column ) const
518 {
519  D1Array<X> columna ( m_rows );
520  for ( size_t i=0;i<m_rows;i++ )
521  columna ( i ) = ( *this ) ( i,column );
522 
523  return columna;
524 }
525 
526 template <class X> D2Array<X> D2Array<X>::SymmetricPart() const
527 {
528  D2Array<X> t(*this);
529  for(size_t i=0;i<this->NRows();++i)
530  for(size_t j=i+1;j<this->NColumns();++j)
531  {
532  X mean=(t(i,j)+t(j,i))/2;
533  t(i,j)=t(j,i)=mean;
534  }
535  return t;
536 }
537 
538 template <class X> D2Array<X> D2Array<X>::AntiSymmetricPart() const
539 {
540  D2Array<X> t(*this);
541  for(size_t i=0;i<this->NRows();++i)
542  for(size_t j=i;j<this->NColumns();++j)
543  {
544  if ( i == j )
545  t(i,i)=0;
546  else
547  {
548  X mean=(t(i,j)-t(j,i))/2;
549  t(i,j)=mean;
550  t(j,i)=-mean;
551  }
552  }
553  return t;
554 }
555 
556 
557 template <class X> void D2Array<X>::Transpose()
558 {
559  D2Array<X>& a=(*this);
560  assert ( a.NRows() == a.NColumns() );
561  size_t n=a.NRows();
562  for(size_t i=0;i<n;++i)
563  {
564  for(size_t j=i+1;j<n;++j)
565  {
566  X tmp=a(i,j);
567  a(i,j)=a(j,i);
568  a(j,i)=tmp;
569  }
570  }
571 }
572 
573 template <class X> X D2Array<X>::Trace() const
574 {
575  assert ( this->NRows() == this->NColumns() );
576  X trace=0;
577  for(size_t i=0;i<this->NRows();++i)
578  {
579  trace+=(*this)(i,i);
580  }
581  return trace;
582 }
583 
584 inline double operator * (const D1Array<double>& a, const D1Array<double>& b)
585 {
586  assert ( a.size() == b.size() );
587  double c=0;
588  size_t n=a.size();
589  for(size_t i=0;i<n;++i)
590  c+=a[i]*b[i];
591  return c;
592 }
593 
596 {
597  assert ( a.NColumns() == b.NRows() );
598  D2Array<double> c ( a.NRows(),b.NColumns() );
599 
600 #ifdef WITH_MKL
601  int stride;
602  if ( a.NRows() > a.NColumns() ) stride= a.NRows();
603  else stride=a.NColumns();
604  cblas_dgemm ( CblasColMajor,CblasNoTrans,CblasNoTrans,a.NRows(),b.NColumns(),a.NRows(),1.0,a,stride,b,b.NColumns(),0.0,c,stride );
605 #endif
606 
607 #ifdef WITH_VECLIB
608  long int stride;
609  if ( a.NRows() > a.NColumns() ) stride= a.NRows();
610  else stride=a.NColumns();
611  cblas_dgemm ( CblasColMajor,CblasNoTrans,CblasNoTrans,a.NRows(),b.NColumns(),a.NRows(),1.0,a,stride,b,b.NColumns(),0.0,c,stride );
612 #endif
613 #ifdef WITH_LAPACK
614 
615  char transa='N';
616  char transb='N';
617  int m=a.NRows();
618  int n=b.NColumns();
619  int k=a.NColumns();
620  double alpha=1.0;
621  int lda=a.NRows();
622  int ldb=k;
623  int ldc=m;
624  double beta=0;
625 
626  dgemm(&transa,&transb,&m,&n,&k,&alpha,const_cast<double*> ( static_cast<const double*> ( a )),&lda,const_cast<double*> ( static_cast<const double*> ( b )),&ldb,&beta,c,&ldc);
627 #endif
628 
629  return c;
630 
631 }
632 
634 {
635  assert ( a.NRows() == b.size() );
636  D1Array<double> c ( a.NRows() );
637 
638 
639 #ifdef WITH_MKL
640  cblas_dgemv ( CblasColMajor,CblasNoTrans,a.NRows(),a.NColumns(),1.0,a,a.NRows(),b,1,0.0,c,1 );
641 #endif
642 
643 #ifdef WITH_VECLIB
644  cblas_dgemv ( CblasColMajor,CblasNoTrans,a.NRows(),a.NColumns(),1.0,a,a.NRows(),b,1,0.0,c,1 );
645 #endif
646 #ifdef WITH_LAPACK
647  char trans='N';
648  int nrows=a.NRows();
649  int ncolumns=a.NColumns();
650  double alpha=1.0;
651  int lda=a.NRows();
652  int incx=1;
653  double beta=0.0;
654  int incy=1;
655  dgemv(&trans,&nrows,&ncolumns,&alpha,const_cast<double*> ( static_cast<const double*> ( a ) ),&lda,const_cast<double*> ( static_cast<const double*> ( b ) ),&incx,&beta,c,&incy);
656 #endif
657 
658  return c;
659 }
660 #if defined WITH_MKL || defined WITH_VECLIB || defined WITH_LAPACK
661 
662 inline int Eigen ( D2Array<double>& a, D1Array<double>& e )
663 {
664  char jobz='V';
665  char uplo='U';
666 #ifdef WITH_VECLIB
667  __CLPK_integer ldwork=a.NColumns() *a.NColumns();
668  D1Array<double> work ( ldwork );
669  __CLPK_integer info;
670  __CLPK_integer n=a.NColumns();
671  __CLPK_integer lda=a.NColumns();
672  dsyev_ ( &jobz,&uplo,&n,a,&lda,e,work,&ldwork,&info );
673 #else
674  int ldwork=a.NColumns() *a.NColumns();
675  D1Array<double> work ( ldwork );
676  int info;
677  int n=a.NColumns();
678  int lda=a.NColumns();
679  dsyev ( &jobz,&uplo,&n,a,&lda,e,work,&ldwork,&info );
680 #endif
681  return info;
682 }
683 
684 inline void SVDFit(const D1Array<double>& res, const D2Array<double>& modelmatrix, D1Array<double>& solution)
685 {
686 
687 #if defined WITH_MKL || defined WITH_LAPACK
688  D2Array<double> A=modelmatrix;
689  D1Array<double> b=res;
690  int m=A.NRows();
691  int n=A.NColumns();
692  int nrhs=1;
693  int lda=A.NRows();
694  int ldb=res.size();
695  D1Array<double> work ( 7*m );
696  int ldwork=7*m;
697  int info;
698  D1Array<double> s ( A.NColumns() );
699  int rank;
700  double rcond=-1; //use machine precision
701  dgelss ( &m,&n,&nrhs,A,&lda,b,&ldb,s,&rcond,&rank,work,&ldwork,&info );
702 
703  if ( info < 0 )
704  throw magnes::Exception("Illegal entry to dgelss routine in SVDFit");
705  if ( info > 0 )
706  throw magnes::Exception("dgelss routine has not converged in SVDFit");
707 
708  for(size_t i=0;i<A.NColumns();++i)
709  solution(i)=b(i);
710 
711  return;
712 
713 #endif
714 
715 #ifdef WITH_VECLIB
716  D2Array<double> A=modelmatrix;
717  D1Array<double> b=res;
718  __CLPK_integer m=A.NRows();
719  __CLPK_integer n=A.NColumns();
720  __CLPK_integer nrhs=1;
721  __CLPK_integer lda=A.NRows();
722  __CLPK_integer ldb=b.size();
723  D1Array<double> work ( 7*m );
724  __CLPK_integer ldwork=7*m;
725  __CLPK_integer info;
726  D1Array<double> s ( A.NColumns() );
727  __CLPK_integer rank;
728  double rcond=-1; //use machine precision
729  dgelss_ ( &m,&n,&nrhs,A,&lda,b,&ldb,s,&rcond,&rank,work,&ldwork,&info );
730  if ( info < 0 )
731  throw magnes::Exception("Illegal entry to dgelss routine in SVDFit");
732  if ( info > 0 )
733  throw magnes::Exception("dgelss routine has not converged in SVDFit");
734 
735  for(size_t i=0;i<A.NColumns();++i)
736  solution(i)=b(i);
737 
738  return;
739 #endif
740  throw magnes::Exception("SVD fit not implemented");
741 }
742 
743 inline int Invert ( D2Array<double>& a )
744 {
745 
746 #ifdef WITH_VECLIB
747  __CLPK_integer m=a.NRows();
748  __CLPK_integer n=a.NColumns();
749  __CLPK_integer lda=m;
750  __CLPK_integer info;
751  __CLPK_integer* ipiv = new __CLPK_integer[m];
752  dgetrf_ ( &m,&n,a,&lda,ipiv,&info );
753 #else
754  int m=a.NRows();
755  int n=a.NColumns();
756  int lda=m;
757  int info;
758  int* ipiv = new int[m];
759  dgetrf ( &m,&n,a,&lda,ipiv,&info );
760 #endif
761  // std::cout << "info from dgetrf " << info << std::endl;
762  D1Array<double> work ( n );
763 #ifdef WITH_VECLIB
764  __CLPK_integer lwork=n;
765  dgetri_ ( &n,a,&lda,ipiv,work,&lwork,&info );
766 #else
767  int lwork=n;
768  dgetri ( &n,a,&lda,ipiv,work,&lwork,&info );
769 #endif
770  delete [] ipiv;
771  //std::cout << "info from dgetri " << info << std::endl;
772  return info;
773 
774 }
775 
776 
777 #endif
778 
779 template <class X> class Scalar
780 {
781 public:
782  Scalar() : m_value(NULL) {}
784  ~Scalar() { delete m_value; }
785  X Value() const { return *m_value; }
786 
788  explicit Scalar(X v)
789  {
790  m_value =new X(v);
791  }
793  Scalar(const Scalar& v)
794  {
795 
796  if ( v )
797  {
798  m_value = new X(v.Value());
799 
800  }
801  else m_value=NULL;
802  // if (!m_value && !e) //Do nothing
803 
804 
805  }
808  {
809  if ( &e != this)
810  {
811  if ( m_value && e )
812  {
813  *m_value=e.Value();
814 
815  }
816  if ( m_value && !e)
817  {
818  delete m_value;
819  m_value=NULL;
820  }
821  if ( !m_value && e)
822  {
823  m_value = new X(e.Value());
824 
825  }
826  // if (!m_value && !e) //Do nothing
827 
828  }
829  return *this;
830  }
831 
832 
835  {
836  {
837  if ( m_value ) *m_value=v;
838  else
839  m_value = new X(v);
840  }
841  return *this;
842  }
843 private:
844  typedef void (Scalar::*bool_type) () const;
845  void helperfunction() const {}
846 private:
847  //static unity m_unity;
848  X* m_value;
849 public:
851  operator bool_type () const
852  {
853  if ( m_value != 0 ) return &Scalar::helperfunction;
854  else return 0;
855  }
856 };
857 
866 template <class X> class Tensor
867 {
868 public:
869  Tensor() {}
870  const D2Array<double>& LabFrame() const { return m_lftensor; }
871  D2Array<double>& LabFrame() { return m_lftensor; }
872  D2Array<double>& PrincipalFrame() const { return m_pftensor; }
873  D2Array<double>& PrincipalFrame() { return m_pftensor; }
874  D1Array<double>& EigenValues() { return m_eigenvalues; }
875  D1Array<double>& EigenValues() const { return m_eigenvalues; }
876  void Clear()
877  {
878  m_lftensor.Clear();
879  m_pftensor.Clear();
880  m_eigenvalues.Clear();
881  }
882  bool Empty() const { return m_lftensor.Empty() && m_pftensor.Empty(); }
883 private:
884  D2Array<X> m_lftensor;
885  D2Array<X> m_pftensor;
886  D1Array<X> m_eigenvalues;
887 
890  void SetPrincipalFrame();
891  //void SetLabFrame();
892 
893 };
894 template <class X> void Tensor<X>::SetPrincipalFrame()
895 {
896  Eigen(this->PrincipalFrame(),this->EigenValues());
897  this->PrincipalFrame().Transpose();
898 }
899 
901 inline std::string MathInfo()
902 {
903  std::string library;
904 #ifdef WITH_LAPACK
905  library="lapack";
906  return library;
907 #endif
908 
909 #ifdef WITH_VECLIB
910  library="veclib macosx";
911  return library;
912 #endif
913 
914 #ifdef WITH_MKL
915  library="Intel MKL";
916  return;
917 #endif
918  library="undefined";
919  return library;
920 }
921 
922 }
923 
924 #endif //MAGNESMATHTOOLS_H
monodimensional dynamically allocated array
Definition: mathtools.h:89
void operator/=(const X &x)
Definition: mathtools.h:431
size_t NRows() const
Definition: mathtools.h:318
Scalar(X v)
Definition: mathtools.h:788
void SwapRows(size_t i, size_t j)
Definition: mathtools.h:451
~D2Array()
Definition: mathtools.h:290
void SwapColumns(size_t i, size_t j)
Definition: mathtools.h:462
D1StaticArray(const X &x)
Definition: mathtools.h:48
void operator-=(const D2Array &x)
Definition: mathtools.h:414
size_t size() const
Definition: mathtools.h:79
the global magnes namespace
Definition: ccchequation.h:38
D2Array< X > SymmetricPart() const
Definition: mathtools.h:526
D1Array()
Definition: mathtools.h:96
D1Array< X > GetRow(size_t row) const
Definition: mathtools.h:508
X & operator()(size_t i)
Definition: mathtools.h:63
Definition: mathtools.h:779
void operator*=(const X &x)
Definition: mathtools.h:422
D2Array(size_t i, size_t j)
Definition: mathtools.h:254
monodimensional array
Definition: mathtools.h:242
X & operator()(size_t i, size_t j)
Definition: mathtools.h:440
bool Empty() const
Definition: mathtools.h:283
D2Array< X > RemoveColumn(size_t column)
Definition: mathtools.h:492
D2Array< X > RemoveRow(size_t row)
Definition: mathtools.h:473
const X & operator()(size_t i) const
Definition: mathtools.h:56
void Transpose()
Definition: mathtools.h:557
void Initialize(size_t i, size_t j)
Definition: mathtools.h:273
size_t size() const
Definition: mathtools.h:154
D2Array< X > AntiSymmetricPart() const
Definition: mathtools.h:538
~D1Array()
Definition: mathtools.h:120
D1Array(size_t i)
Definition: mathtools.h:101
D2Array & operator=(const D2Array &x)
Definition: mathtools.h:388
D2Array()
Definition: mathtools.h:248
size_t NColumns() const
Definition: mathtools.h:323
void operator+=(const D2Array &x)
Definition: mathtools.h:406
X Trace() const
Definition: mathtools.h:573
Definition: mathtools.h:38
int Eigen(D2Array< double > &a, D1Array< double > &e)
Definition: mathtools.h:662
Definition: mathtools.h:866
Scalar(const Scalar &v)
Definition: mathtools.h:793
std::string MathInfo()
Definition: mathtools.h:901
Coordinate operator*(float f, Coordinate a)
Definition: coordinate.h:102
D1Array< X > GetColumn(size_t column) const
Definition: mathtools.h:517
void Initialize(size_t i)
Definition: mathtools.h:110