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 }