⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hedge.cc

📁 小波分析程序
💻 CC
字号:
//****************************************************************************// Hedge.cc                                         Implementations of classes//                                                      HedgePer and HedgeAper//****************************************************************************#include <iostream.h>#include <fstream.h>#include <assert.h>#include "Hedge.h"/********************** Hedge Periodic **************************************/HedgePer::HedgePer(const integer &DIM, const integer &n, 		   const integer *Levs) : dim(DIM), num_of_levels(n){  assert(dim>0 && num_of_levels>0);  levels=new integer [num_of_levels];  assert(levels);  for(int i=0; i<num_of_levels; i++) levels[i]=Levs[i];  if (levels_consistent())    {      origin=new real [dim];      assert(origin);    }  else    {      cout << "Attempt to declare a hedge with incosistent levels" 	   << endl;      exit(1);    }  integer p=maxlevel();  assert( ((DIM>>p)<<p) == DIM );                       // dim divisible by 2^p ?}//////////////////////////////////////////////////////////////////////////////HedgePer::HedgePer(const HedgePer &Rhs) :   dim(Rhs.dim), num_of_levels(Rhs.num_of_levels){  if(Rhs.levels!=0 && Rhs.origin!=0)    {      levels=new integer [num_of_levels];      assert(levels!=0);      origin=new real [dim];      assert(origin!=0);      integer i;      for(i=0; i<num_of_levels; i++)   levels[i]=Rhs.levels[i];      for(i=0; i<dim; i++)  origin[i]=Rhs.origin[i];    }  else     {      levels=0;      origin=0;    }}//////////////////////////////////////////////////////////////////////////////void HedgePer::DestroyHedge(){  if (origin!=0) delete [] origin;  if (levels!=0) delete [] levels;  origin=0;  levels=0;  dim=0;}//////////////////////////////////////////////////////////////////////////////const HedgePer &HedgePer::operator=(const HedgePer &Rhs){  if(this != &Rhs)    {      DestroyHedge();      dim=Rhs.dim;      num_of_levels=Rhs.num_of_levels;      if(Rhs.levels!=0 && Rhs.origin!=0)	{	  levels=new integer [num_of_levels];	  assert(levels!=0);	  origin=new real [dim];	  assert(origin!=0);	  integer i;	  for(i=0; i<num_of_levels; i++)   levels[i]=Rhs.levels[i];	  for(i=0; i<dim; i++)  origin[i]=Rhs.origin[i];	}      else 	{	  levels=0;	  origin=0;	}    }  return (*this);}//////////////////////////////////////////////////////////////////////////////bool HedgePer::levels_consistent() const{  if (levels!=0)    {      integer p = maxlevel();      integer i, k, sum = 1<<(p - levels[0]);      for(i=1; i<num_of_levels; i++)	{	  k = p - levels[i];	  if( (sum>>k)<<k != sum )  return false;       //sum divisible by 2^k?	  sum += 1<<k;                                            // sum += 2^k	  if( sum > (1<<p) ) return false;	}      if( sum != (1<<p) ) return false;    }  return true;}//////////////////////////////////////////////////////////////////////////////integer HedgePer::maxlevel() const{  if(levels)    {      integer p=0;      for(integer j=0; j<num_of_levels; j++) 	if ( p < levels[j] ) p = levels[j];      return p;    }  else    {      cout << "Levels in hedge empty. Returning zero as maxlevel. " << endl;      return 0;    }}//////////////////////////////////////////////////////////////////////////////integer HedgePer::block_length(const integer &i) const{  assert(0<=i && i<num_of_levels);  return ( dim >> (levels[i]) );         // dim/number of blocks at i-th level }//////////////////////////////////////////////////////////////////////////////real *HedgePer::block_start(const integer &i)  const{  assert(origin);  assert(0<=i && i<num_of_levels);  integer len=0;  for(integer j=0; j<i; j++)  len += dim >> (levels[j]);  return (origin + len);}/********************** Hedge Aperiodic **************************************/HedgeAper::HedgeAper(const integer &n, const integer *Levs) :  num_of_levels(n){  assert(num_of_levels>0);  levels=new integer [num_of_levels];  assert(levels);  for(int i=0; i<num_of_levels; i++) levels[i]=Levs[i];  if (levels_consistent())    {       root = new Interval [num_of_levels];      assert(root);    }  else    {      cout << "Attempt to declare a hedge with incosistent levels" 	   << endl;      exit(1);    }}//////////////////////////////////////////////////////////////////////////////HedgeAper::HedgeAper(const HedgeAper &Rhs) : num_of_levels(Rhs.num_of_levels){  if(Rhs.levels!=0 && Rhs.root!=0)    {      levels=new integer [num_of_levels];      assert(levels);      root = new Interval [num_of_levels];      assert(root);      integer i;      for(i=0; i<num_of_levels; i++)   	{	  levels[i]=Rhs.levels[i];	  root[i]=Rhs.root[i];	}    }  else     {      levels=0;      root=0;    }}//////////////////////////////////////////////////////////////////////////////void HedgeAper::DestroyHedge(){  if (root!=0) delete [] root;  if (levels!=0) delete [] levels;  root=0;  levels=0;}//////////////////////////////////////////////////////////////////////////////const HedgeAper &HedgeAper::operator=(const HedgeAper &Rhs){  if(this != &Rhs)    {      DestroyHedge();      num_of_levels=Rhs.num_of_levels;      if(Rhs.levels!=0 && Rhs.root!=0)	{	  levels=new integer [num_of_levels];	  assert(levels!=0);	  root = new Interval [num_of_levels];	  assert(root);	  for(integer i=0; i<num_of_levels; i++)   	    {	      levels[i]=Rhs.levels[i];	      root[i]=Rhs.root[i];	    }	}      else 	{	  levels=0;	  root=0;	}    }  return (*this);}//////////////////////////////////////////////////////////////////////////////bool HedgeAper::levels_consistent() const{  if (levels!=0)    {      integer p = maxlevel();      integer i, k, sum = 1<<(p - levels[0]);      for(i=1; i<num_of_levels; i++)	{	  k = p - levels[i];	  if( (sum>>k)<<k != sum )  return false;       //sum divisible by 2^k?	  sum += 1<<k;                                            // sum += 2^k	  if( sum > (1<<p) ) return false;	}      if( sum != (1<<p) ) return false;    }  return true;}//////////////////////////////////////////////////////////////////////////////integer HedgeAper::maxlevel() const{  if(levels)    {      integer p=0;      for(integer j=0; j<num_of_levels; j++) 	if ( p < levels[j] ) p = levels[j];      return p;    }  else     {      cout << "Levels in hedge empty. Returning 0 as maxlevel." << endl;      return 0;    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -