AMRLSCanceller.cpp

Go to the documentation of this file.
00001 #include "AMRLSCanceller.h"
00002 #include <algorithm>
00003 
00004 namespace ublas = boost::numeric::ublas;
00005 
00006 namespace gplib
00007   {
00008 
00009     const double maxlambda = 1.0 - 1e-6;
00010 
00011     AMRLSCanceller::AMRLSCanceller(const int inputsize, const double MyDelta,
00012         const double MyLambda, const double MyAlpha) :
00013       RLSCanceller(inputsize, MyDelta, MyLambda), Lambdaplus(maxlambda),
00014           Lambdaminus(MyLambda / 2.0), S(inputsize, inputsize), Psi(inputsize),
00015           Alpha(MyAlpha), factor1(inputsize, inputsize), factor2(inputsize,
00016               inputsize), I(inputsize)
00017       {
00018         std::fill_n(S.data().begin(), inputsize * inputsize, 0.0);
00019         std::fill_n(Psi.begin(), inputsize, 0.0);
00020       }
00021 
00022     AMRLSCanceller::~AMRLSCanceller()
00023       {
00024       }
00025 
00026     void AMRLSCanceller::AdaptFilter(const gplib::rvec &Input,
00027         const gplib::rvec &Desired)
00028       {
00029         RLSCanceller::AdaptFilter(Input, Desired);
00030         SetLambda(GetLambda() + Alpha * GetEpsilon()(0) * prec_inner_prod(Psi,
00031             Input));
00032         SetLambda(std::min(GetLambda(), Lambdaplus));
00033         SetLambda(std::max(GetLambda(), Lambdaminus));
00034 
00035         factor1 = I - ublas::outer_prod(GetK(), Input);
00036         factor2 = I - ublas::outer_prod(Input, GetK());
00037         S = ublas::prec_prod(factor1, S);
00038         S = ublas::prec_prod(S, factor2);
00039         S += ublas::outer_prod(GetK(), GetK());
00040         S -= GetP();
00041         S /= GetLambda();
00042 
00043         Psi = prec_prod(factor1, Psi) + prec_prod(S, Input) * GetEpsilon()(0);
00044       }
00045 
00046   }

Generated on Tue May 4 16:52:14 2010 for GPLIB++ by  doxygen 1.5.8