35 bool ready()
const {
return ready_; }
36 int size()
const {
return n_; }
38 void apply(
const T* b,T* x)
const;
63 ? tr(
"Generating linear model")
67 {
return tr(
"Nr points processed"); }
84 :
Executor(
"Generating linear model")
86 , totalnr_(A.info().getSize(0))
90 , croutsidx_(croutsidx)
98 for (
int idx=0; idx<
totalnr_; idx++ )
101 for (
int idy=0; idy<
totalnr_; idy++ )
114 vv_[idx] = 1.0f/maxval;
125 return ErrorOccurred();
127 if ( curidx_ >= totalnr_ )
130 for (
int idx=0; idx<curidx_; idx++ )
132 T sum = croutsmatrix_.get( idx, curidx_ );
133 for (
int idz=0; idz<idx; idz++ )
134 sum -= croutsmatrix_.get(idx,idz) * croutsmatrix_.get(idz,curidx_);
136 croutsmatrix_.set( idx, curidx_, sum );
140 for (
int idx=curidx_; idx<totalnr_; idx++ )
142 T sum = croutsmatrix_.get( idx, curidx_ );
143 for (
int idz=0; idz<curidx_; idz++ )
145 sum -= croutsmatrix_.get(idx,idz)*croutsmatrix_.get(idz,curidx_);
148 croutsmatrix_.set( idx, curidx_, sum );
150 T dum = vv_[idx]*fabs(sum);
159 if ( curidx_ != imax_ )
161 for (
int idz=0; idz<totalnr_; idz++ )
163 const T dum = croutsmatrix_.get( imax_, idz );
164 croutsmatrix_.set( imax_, idz, croutsmatrix_.get(curidx_,idz) );
165 croutsmatrix_.set( curidx_, idz, dum );
168 vv_[imax_] = vv_[curidx_];
171 croutsidx_[curidx_] = imax_;
174 croutsmatrix_.set(curidx_,curidx_,
TINY);
176 if ( curidx_ != totalnr_-1 )
178 const T dum = 1.0f/croutsmatrix_.get(curidx_,curidx_);
179 for (
int idx=curidx_+1; idx<totalnr_; idx++ )
180 croutsmatrix_.set(idx, curidx_, dum*croutsmatrix_.get(idx,curidx_));
183 return ++curidx_>=totalnr_ ? Finished() : MoreToDo();
189 template <
class T>
inline
192 , croutsidx_(new int[A.info().getSize(0)])
193 , n_(A.info().getSize(0))
200 template <
class T>
inline
209 template <
class T>
inline
211 : croutsmatrix_(s.croutsmatrix_)
220 for (
int idx=0; idx<s.
n_; idx++ )
226 template <
class T>
inline
229 delete [] croutsidx_;
233 template <
class T>
inline
238 pErrMsg(
"Cannot apply. Did you forget to call LinSolver::init()?");
242 for (
int idx=0; idx<n_; idx++ )
247 for (
int i=0; i<n_; i++ )
249 int ip=croutsidx_[i];
255 for (
int j=ii; j<=i-1; j++ )
257 sum -= croutsmatrix_.get(i,j)*x[j];
266 for (
int i=n_-1; i>=0; i-- )
269 for (
int j=i+1; j<n_; j++ )
270 sum -= croutsmatrix_.get(i,j)*x[j];
272 x[i]=sum/croutsmatrix_.get(i,i);