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

📄 utility.cc

📁 小波分析程序
💻 CC
字号:
//*****************************************************************************// Utility.cc                              Implementations of utility functions//*****************************************************************************#include <iostream.h>#include <fstream.h>#include <stdlib.h>#include <assert.h>#include "Utility.h"/***************************** Periodic case *********************************/void ExtractHedge(HedgePer &H, const ArrayTreePer &A){  assert( H.dim == A.dim );  assert( H.maxlevel() <= A.maxlevel );  integer j, shift=0;  real *Hptr, *Aptr;      for(integer i=0; i < H.num_of_levels; i++)	{ 	  Hptr = H.block_start(i);	  Aptr = A.block_start(H.levels[i], 0) + shift;	  for(j=0; j < H.block_length(i); j++) Hptr[j] = Aptr[j];	  shift += H.block_length(i);	}}///////////////////////////////////////////////////////////////////////////////void SuperposeHedge(const HedgePer &H, ArrayTreePer &A){  assert( H.dim == A.dim );  assert( H.maxlevel() <= A.maxlevel );   integer j, shift=0;   real *Hptr, *Aptr;      for(integer i=0; i < H.num_of_levels; i++)	{ 	  Hptr = H.block_start(i);	  Aptr = A.block_start(H.levels[i], 0) + shift;	  for(j=0; j < H.block_length(i); j++) Aptr[j] += Hptr[j] ;	  shift += H.block_length(i);	}}/////////////////////////////////////////////////////////////////////////////void GetCosts(const ArrayTreePer &A, Tree &T, costFun F, const real &sigma){  GetCostsHelp( A, &(T.root), F, sigma, 0, 0);  T.maxlevel = A.maxlevel;}////////////////////////////////////////////////////////////////////////////void GetCostsHelp(const ArrayTreePer &A,  Node<real> **ptr,		  costFun F, const real &sigma,		  const integer &L, const integer &B )    {  if( L <= A.maxlevel )    {      real cost = F( A.block_start(L, B), A.block_length(L), sigma, A.dim );      (*ptr) = new Node<real>(cost, 0, 0);      assert( *ptr );      if( L < A.maxlevel )	{	  GetCostsHelp( A, &((*ptr)->left), F, sigma, L+1, B<<1 ); 	  GetCostsHelp( A, &((*ptr)->right), F, sigma, L+1, (B<<1)|1 );    	}    }}                                                         ///////////////////////////////////////////////////////////////////////////////void BestBasis(HedgePer &H, const Tree &B){  assert(B.root != 0);  integer *Levs;  Levs = new integer [1<<(B.maxlevel)];  // start with maximal space for levels  integer n = 0;  BestBasisHelp(Levs, n, B.root, 0);  H.num_of_levels = n;  H.levels = new integer [n];  for (integer i=0; i<n; i++) H.levels[i] = Levs[i];  delete [] Levs;}                             ////////////////////////////////////////////////////////////////////////////real BestBasisHelp(integer *Levs, integer &n, Node<real> *ptr, 		   const integer &L){  assert(ptr);  if( !ptr->left && !ptr->right )    // if at the bottom row of the tree    {      Levs[n] = L;      n++;      return (ptr->content);    }  else    {      integer blocks = n;      real cost=0;      if(ptr->left)  cost += BestBasisHelp(Levs, n, ptr->left, L+1);      if(ptr->right) cost += BestBasisHelp(Levs, n, ptr->right, L+1);      if((ptr->content) > cost)  return cost;      else	{	  n = blocks;	  Levs[n] = L;	  n++;	  return (ptr->content);	}   }}////////////////////////////////////////////////////////////////////////////void ExtractBestBasis(const ArrayTreePer &A, HedgePer &H, costFun F, 		      const double &sigma){  assert( A.origin );  Tree B;  GetCosts(A, B, F, sigma);  H.dim = A.dim;  BestBasis(H, B);  H.origin = new real [H.dim];  ExtractHedge(H, A);}/////////////////////////////////////////////////////////////////////////////***************************** Aperiodic case ********************************/void ExtractHedge(HedgeAper &H, const ArrayTreeAper &A){  assert( H.maxlevel() <= A.maxlevel );  H.root[0] = *(A.block(H.levels[0], 0));  integer B=0;  for(integer i=1; i<H.num_of_levels; i++)    {          B = ((B + 1)<<(H.levels[i]))>>(H.levels[i-1]);      H.root[i] = *(A.block(H.levels[i], B));    } }////////////////////////////////////////////////////////////////////////////void SuperposeHedge(const HedgeAper &H, ArrayTreeAper &A){  assert( H.maxlevel() <= A.maxlevel );  *(A.block(H.levels[0], 0)) +=  H.root[0];  integer B=0;  for(integer i=1; i<H.num_of_levels; i++)    {      B = ((B + 1)<<(H.levels[i]))>>(H.levels[i-1]);      *(A.block(H.levels[i], B)) += H.root[i];    } }////////////////////////////////////////////////////////////////////////////void GetCosts(const ArrayTreeAper &A, Tree &B, costFun F,	      const real &sigma){  GetCostsHelp(A, &(B.root), F, sigma, 0, 0);  B.maxlevel = A.maxlevel;}                           void GetCostsHelp(const ArrayTreeAper &A,  Node<real> **ptr,		  costFun F, const real &sigma,		  const integer &L, const integer &B ){  if( L <= A.maxlevel )    {      Interval *ip = A.block(L, B);      real cost = F( ip->origin + ip->beg, ip->length, sigma, A.root->length);      (*ptr) = new Node<real>(cost, 0, 0);      assert( *ptr );      if( L < A.maxlevel )	{	  GetCostsHelp(A, &((*ptr)->left), F, sigma, L+1, B<<1);	  GetCostsHelp(A, &((*ptr)->right), F, sigma, L+1, (B<<1)|1);	}    }}////////////////////////////////////////////////////////////////////////////void BestBasis(HedgeAper &H, const Tree &B){  assert( B.root );  integer *Levs;  Levs = new integer [1<<(B.maxlevel)];  // start with maximal space for levels  integer n=0;  BestBasisHelp(Levs, n, B.root, 0);  H.num_of_levels = n;  H.levels = new integer [n];  for (integer i=0; i<n; i++) H.levels[i] = Levs[i];  delete [] Levs;}                              ////////////////////////////////////////////////////////////////////////////void ExtractBestBasis(const ArrayTreeAper &A, HedgeAper &H, costFun F, 		      const double &sigma){  assert( A.root );  Tree B;  GetCosts(A, B, F, sigma);  BestBasis(H, B);  H.root = new Interval [H.num_of_levels];  ExtractHedge(H, A);}

⌨️ 快捷键说明

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