RLSCanceller.cpp
Go to the documentation of this file.00001 #include "RLSCanceller.h"
00002
00003 namespace ublas = boost::numeric::ublas;
00004
00005 #include <boost/numeric/bindings/atlas/cblas3.hpp>
00006 #include <boost/numeric/bindings/atlas/cblas2.hpp>
00007 #include <iostream>
00008
00009 namespace gplib
00010 {
00011
00012 namespace atlas = boost::numeric::bindings::atlas;
00013 RLSCanceller::RLSCanceller(const int inputsize) :
00014 LSSOFilter(inputsize), delta(0.9999999), lambda(1), P(inputsize,
00015 inputsize), pi(inputsize), k(inputsize)
00016 {
00017 P = 1. / delta * ublas::identity_matrix<double>(inputsize);
00018 }
00019
00020 RLSCanceller::RLSCanceller(const int inputsize, const double MyDelta,
00021 const double MyLambda) :
00022 LSSOFilter(inputsize), delta(MyDelta), lambda(MyLambda), P(inputsize,
00023 inputsize), pi(inputsize), k(inputsize)
00024 {
00025 P = 1. / delta * ublas::identity_matrix<double>(inputsize);
00026 }
00027
00028 RLSCanceller::~RLSCanceller()
00029 {
00030 }
00031
00032 void RLSCanceller::AdaptFilter(const gplib::rvec &Input,
00033 const gplib::rvec &Desired)
00034 {
00035 SetEpsilon(Desired - GetFilterOutput());
00036
00037 atlas::gemv(P, Input, pi);
00038 k = pi / (lambda + ublas::prec_inner_prod(Input, pi));
00039 SetWeights() += k * GetEpsilon()(0);
00040
00041 gplib::rmat temp1(P);
00042
00043 gplib::rmat temp2(ublas::outer_prod(k, Input));
00044 atlas::gemm(-1.0 / lambda, temp2, temp1, 1.0 / lambda, P);
00045
00046 }
00047
00048 }