Probably i have problem with co/des :
if i call functions wich returns farray, programs go seg fault.
if i comment destructor.. programs work but do not free memory.
Any suggestion?
farray and fmatrix are fast 1-index based array and matrix. f means fortran.
my aim is to write a very simple class faster than TNT (template
numerical toolkit)
// -*-C++-*-
#include <cmath>
using std::sqrt;
namespace tonymatrix
{
template <class T>
class farray
{
T* v_;
int dim_;
public:
explicit inline farray(): dim_(0), v_(0) {};
explicit inline farray (int a): dim_(a) {v_= new T[dim_];}
// inline ~farray() {delete []v_;};
inline farray (const farray &b):dim_(b.size()) { v_= new T[dim_];
for (int i=0;i!=dim_;i++) v_[i]=b.v_[i]; }
inline T& operator() (int i){return v_[i-1];}
inline const T& operator() (int i) const {return v_[i-1];}
inline T& operator[] (int i){return v_[i-1];}
inline const T& operator[] (int i) const {return v_[i-1];}
inline int dim() const {return dim_;}
inline int dim1() const {return dim_;}
inline int size() const{return dim_;}
inline T sum() const {T res; for (int i=0;i!=dim_;i++) res+=v_[i];
return res;}
};
template <class T>
class fmatrix {
T* v_;
int dim1_,dim2_;
public:
explicit fmatrix (int a,int b): dim1_(a), dim2_(b) {v_= new T[a*b]; }
explicit inline fmatrix (const fmatrix &b):
dim1_(b.dim_1),dim2_(b.dim2_) {int dim=dim1_*dim2_;v_= new T[dim]; for
(int i=0;i!=dim;i++) v_[i]=b.v_[i];}
~fmatrix() {delete []v_;}
inline T& operator() (int i, int j){return v_[(i-1)*dim1_+j-1];}
inline const T& operator() (int i, int j) const {return
v_[(i-1)*dim1_+j-1];}
inline int dim1() const {return dim1_;}
inline int dim2() const {return dim2_;}
inline int size() const {return dim1_*dim2_;}
inline T sum() const {T res; int dim=dim1_*dim2_; for (int
i=0;i!=dim;i++) res+=v_[i]; return res;}
};
template <class T> inline T dot_product(const farray<T> &vec1, const
farray<T> &vec2)
{
T res=0;
int a=vec1.size(), b=vec2.size();
if (a>b) a=b;
for (int i=1;i<=a;i++)
{
res+=vec1[i]*vec2[i];
}
return res;
}
template <class T> inline double norm(const farray<T> &vec1)
{
return sqrt((dot_product(vec1,vec1)));
}
template <class T> inline void normalize (farray<T> &vec)
{
int a=vec.size();
double denom= norm(vec);
if (denom!=0) for (int i=1;i<=a;i++) vec[i]/=denom;
}
}
--
Hai recensioni nel cassetto di musica, cinema, letteratura,fumetti??
Ascolta e pentiti e se hai tempo vergognati
http://tonysuper.altervista.org