35 #ifndef AIMS_ESTIMATION_WLMS_ESTIMATOR_H
36 #define AIMS_ESTIMATION_WLMS_ESTIMATOR_H
51 bool verbose =
false )
80 template <
int D >
inline
87 int N = y->getSizeX(), n, k;
88 for ( n = 0; n < N; n++ )
90 error->at( n ) = y->at( n ) - a;
91 for ( k = 0; k < D; k++ )
92 error->at( n ) -= b.
item( k ) * x->at( n ).item( k );
93 error->at( n ) = fabs( error->at( n ) );
99 return 1.4826 * errorbis( N / 2 );
111 int N = y->getSizeX();
113 carto::AllocatorContext::fast() );
115 carto::AllocatorContext::fast() );
117 carto::AllocatorContext::fast() );
125 for ( n = 0; n < N; n++ )
127 weight( n ) = _mfunc.weight( error->at( n ) );
128 mat( 0, 0 ) += weight( n );
131 for ( k = 1; k <= D; k++ )
133 for ( n = 0; n < N; n++ )
134 mat( k, 0 ) += weight( n ) * x->
at( n ).item( k - 1 );
135 mat( 0, k ) = mat( k, 0 );
139 for ( k1 = 1; k1 <= D; k1++ )
140 for ( k2 = 1; k2 <= k1; k2++ )
142 for ( n = 0; n < N; n++ )
143 mat( k1, k2 ) += weight( n ) *
144 x->
at( n ).item( k1 - 1 ) * x->at( n ).item( k2 - 1 );
145 mat( k2, k1 ) = mat( k1, k2 );
149 for ( n = 0; n < N; n++ )
151 vec( 0 ) += weight( n ) * y->
at( n );
152 for ( k = 1; k <= D; k++ )
153 vec( k ) += weight( n ) * y->
at( n ) * x->at( n ).item( k - 1 );
158 for ( k = 1; k <= D; k++ )
159 b.
item( k - 1 ) = res( k );
163 template <
int D >
inline
168 ASSERT( x->getSizeY() == 1 && x->getSizeZ() == 1 && x->getSizeT() == 1 );
169 ASSERT( y->getSizeY() == 1 && y->getSizeZ() == 1 && y->getSizeT() == 1 );
170 ASSERT( x->getSizeX() == y->getSizeX() );
178 lms.
doit( x, y, a, b );
188 _mfunc.setSigma( sigma( x, y, old_a,old_b, error ) );
189 step( x, y, a, b, error );
190 obja = fabs( a - old_a ) / ( fabs( a ) + fabs( old_a ) );
191 objb =
norm( b - old_b ) / (
norm( b ) +
norm( old_b ) );
194 <<
"Obja : " << obja <<
" "
195 <<
"Objb : " << objb <<
" "
196 <<
"a : " << a <<
" "
197 <<
"b : " << b << std::endl;
200 while ( obja > _error || objb > _error );
const T & item(int d) const
void doit(const carto::rc_ptr< carto::Volume< AimsVector< float, D > > > &x, const carto::rc_ptr< carto::Volume< float > > &y, float &a, AimsVector< float, D > &b)
float sigma(const carto::rc_ptr< carto::Volume< AimsVector< float, D > > > &x, const carto::rc_ptr< carto::Volume< float > > &y, float a, const AimsVector< float, D > &b, carto::rc_ptr< carto::Volume< float > > &error)
WLMSEstimator(MEstimatorFunc &mfunc, float error, bool verbose=false)
void doit(const carto::rc_ptr< carto::Volume< AimsVector< float, D > > > &x, const carto::rc_ptr< carto::Volume< float > > &y, float &a, AimsVector< float, D > &b)
void step(const carto::rc_ptr< carto::Volume< AimsVector< float, D > > > &x, const carto::rc_ptr< carto::Volume< float > > &y, float &a, AimsVector< float, D > &b, const carto::rc_ptr< carto::Volume< float > > &error)
const T & at(long x, long y=0, long z=0, long t=0) const
VolumeRef< T > copy() const
carto::VolumeRef< float > AimsLinearResolutionLU(const carto::VolumeRef< float > &matrix, const carto::VolumeRef< float > &b)
void sort(Volume< T > &thing, bool ascending=true)
AIMSDATA_API float norm(const Tensor &thing)