00001
00002
00003
00004
00005
00006
00007
00008 #ifndef SYNAPS_LINALG_SYM2D_H
00009 #define SYNAPS_LINALG_SYM2D_H
00010
00011 #include <synaps/init.h>
00012 #include <synaps/arithm/Norm.h>
00013 #include <synaps/linalg/MethodName.h>
00014 #include <synaps/base/stride_iterator.h>
00015 #include <synaps/linalg/rep1d.h>
00016
00017
00018 __BEGIN_NAMESPACE_SYNAPS
00019
00020
00021 namespace linalg {
00022
00023
00024 typedef unsigned size_type;
00025 unsigned sym2dsz(unsigned i, unsigned j)
00026 {
00027 unsigned m = std::max(i,j);
00028 return ( (m*(m+1))/2 );
00029 }
00030
00031
00032 unsigned sym2dcf(unsigned i, unsigned j)
00033 {
00034
00035 return (i<j ? i + (j*(j+1))/2 : j + (i*(i+1))/2 );
00036 }
00037
00038
00044 template <class C>
00045 struct sym2d : public linalg::rep1d<C> {
00046
00047 typedef C* col_iterator;
00048 typedef stride_iterator<C,C*,size_type> row_iterator;
00049 typedef sym2d<C> self_t;
00050
00051 size_type nbrow_, nbcol_;
00052
00053 sym2d(): linalg::rep1d<C>(){}
00054 sym2d(const self_t & v):
00055 linalg::rep1d<C>(v), nbrow_(v.nbrow_), nbcol_(v.nbcol_) {}
00056 sym2d(size_type i,size_type j):
00057 linalg::rep1d<C>(sym2dsz(i,j)), nbrow_(i),nbcol_(j) {}
00058 sym2d(size_type i, size_type j, C* t):
00059 linalg::rep1d<C>(sym2dsz(i,j),t), nbrow_(i), nbcol_(j) {}
00060 sym2d(size_type i, size_type j, C* t, char c);
00061 sym2d(const char * nm);
00062
00063 sym2d<C> & operator=(const sym2d<C> & v)
00064 {
00065 this->linalg::rep1d<C>::operator=(v);
00066 nbrow_ = v.nbrow(); nbcol_ = v.nbcol();
00067 return *this;
00068 }
00069
00070 C & operator()(size_type i, size_type j)
00071 {return this->tab_[sym2dcf(i,j)];}
00072 const C & operator()(size_type i, size_type j) const
00073 {return this->tab_[sym2dcf(i,j)];}
00074
00075 size_type nbrow() const {return nbrow_;}
00076 size_type nbcol() const {return nbcol_;}
00077
00078
00079 self_t resize(size_type i,size_type j)
00080 {
00081 nbrow_=i; nbcol_=j;
00082 this->linalg::rep1d<C>::resize(sym2dsz(i,j));
00083 return *this;
00084 }
00085
00086 };
00087 }
00088
00089 __END_NAMESPACE_SYNAPS
00090
00091
00092
00093
00094
00095 #endif // SYNAPS_LINALG_SYM2D_H
00096