75 #ifndef SLIP_LINEAR_LEAST_SQUARES_HPP
76 #define SLIP_LINEAR_LEAST_SQUARES_HPP
150 template<
typename RandomAccessIterator1,
151 typename RandomAccessIterator2,
152 typename RandomAccessIterator3,
153 typename RandomAccessIterator4>
156 RandomAccessIterator1 x_last,
157 RandomAccessIterator2 y_first,
158 RandomAccessIterator3 s_first,
159 RandomAccessIterator4 p_first,
160 RandomAccessIterator4 p_last,
161 slip::EvalBasis<
typename std::iterator_traits<RandomAccessIterator1>::value_type,RandomAccessIterator2>& basis_fun)
163 typedef typename std::iterator_traits<RandomAccessIterator2>::difference_type _Distance;
164 _Distance x_size = x_last - x_first;
165 _Distance p_size = p_last - p_first;
167 assert(x_first != x_last);
168 assert(y_first != (y_first + x_size));
169 assert(s_first != (s_first + x_size));
170 assert(p_first != p_last);
172 typedef typename std::iterator_traits<RandomAccessIterator2>::value_type value_type;
183 for (_Distance i = 0; i < x_size; ++i)
188 double tmp = value_type(1.0) / s_first[i];
190 A.
row_begin(i),std::bind2nd(std::multiplies<value_type>(),tmp));
192 B[i] = y_first[i] * tmp;
202 value_type chisq = value_type(0);
203 for (_Distance i = 0; i < x_size; ++i)
206 chisq += (err * err);
209 return double(chisq);
264 template<
typename Vector1,
276 typename Vector2::iterator,
277 typename Vector3::iterator,
278 typename Vector4::iterator>(X.begin(),X.end(),Y.begin(),S.begin(),P.begin(),P.end(),basis_fun);
339 template<
typename RandomAccessIterator1,
340 typename RandomAccessIterator2,
341 typename RandomAccessIterator3>
344 RandomAccessIterator1 x_last,
345 RandomAccessIterator2 y_first,
346 RandomAccessIterator3 p_first,
347 RandomAccessIterator3 p_last,
348 slip::EvalBasis<
typename std::iterator_traits<RandomAccessIterator1>::value_type,RandomAccessIterator2>& basis_fun)
350 typedef typename std::iterator_traits<RandomAccessIterator2>::difference_type _Distance;
351 _Distance x_size = x_last - x_first;
352 _Distance p_size = p_last - p_first;
354 assert(x_first != x_last);
355 assert(y_first != (y_first + x_size));
356 assert(p_first != p_last);
358 typedef typename std::iterator_traits<RandomAccessIterator3>::value_type value_type;
366 for (_Distance i = 0; i < x_size; ++i)
380 value_type chisq = value_type(0);
381 for (_Distance i = 0; i < x_size; ++i)
384 chisq += (err * err);
387 return double(chisq);
439 template<
typename Vector1,
449 typename Vector2::iterator,
450 typename Vector3::iterator>(X.begin(),X.end(),Y.begin(),P.begin(),P.end(),basis_fun);
544 template<
typename RandomAccessIterator1,
545 typename RandomAccessIterator2,
546 typename RandomAccessIterator3,
547 typename RandomAccessIterator4>
550 RandomAccessIterator1 x_last,
551 RandomAccessIterator2 y_first,
552 RandomAccessIterator3 s_first,
553 RandomAccessIterator4 p_first,
554 RandomAccessIterator4 p_last,
555 const std::size_t order,
556 slip::EvalBasis<
typename std::iterator_traits<RandomAccessIterator1>::value_type,RandomAccessIterator2>& basis_fun)
558 typedef typename std::iterator_traits<RandomAccessIterator2>::difference_type _Distance;
559 _Distance x_size = x_last - x_first;
560 _Distance p_size = p_last - p_first;
562 assert(x_first != x_last);
563 assert(y_first != (y_first + x_size));
564 assert(s_first != (s_first + x_size));
565 assert(p_first != p_last);
567 typedef typename std::iterator_traits<RandomAccessIterator2>::value_type value_type;
577 for (_Distance i = 0; i < x_size; ++i)
584 double tmp = value_type(1.0) / s_first[i];
586 A.
row_begin(i),std::bind2nd(std::multiplies<value_type>(),tmp));
588 B[i] = y_first[i] * tmp;
599 value_type chisq = value_type(0);
600 for (_Distance i = 0; i < x_size; ++i)
603 chisq += (err * err);
606 return double(chisq);
693 template<
typename RandomAccessIterator1,
694 typename RandomAccessIterator2,
695 typename RandomAccessIterator3>
698 RandomAccessIterator1 x_last,
699 RandomAccessIterator2 y_first,
700 RandomAccessIterator3 p_first,
701 RandomAccessIterator3 p_last,
702 const std::size_t order,
703 slip::EvalBasis<
typename std::iterator_traits<RandomAccessIterator1>::value_type,RandomAccessIterator2>& basis_fun)
705 typedef typename std::iterator_traits<RandomAccessIterator2>::difference_type _Distance;
706 _Distance x_size = x_last - x_first;
707 _Distance p_size = p_last - p_first;
709 assert(x_first != x_last);
710 assert(y_first != (y_first + x_size));
711 assert(p_first != p_last);
713 typedef typename std::iterator_traits<RandomAccessIterator2>::value_type value_type;
721 for (_Distance i = 0; i < x_size; ++i)
737 value_type chisq = value_type(0);
738 for (_Distance i = 0; i < x_size; ++i)
741 chisq += (err * err);
744 return double(chisq);
822 template<
typename Vector1,
829 const std::size_t order,
833 typename Vector2::iterator,
834 typename Vector3::iterator>(X.begin(),X.end(),Y.begin(),P.begin(),P.end(),order,basis_fun);
840 #endif //SLIP_LINEAR_LEAST_SQUARES_HPP
Provides a class to manipulate 2d dynamic and generic arrays.
iterator end()
Returns a read/write iterator that points one past the last element in the Vector. Iteration is done in ordinary element order.
void svd_solve(const Matrix1 &U, RandomAccessIterator1 W_first, RandomAccessIterator1 W_last, const Matrix2 &V, RandomAccessIterator2 B_first, RandomAccessIterator2 B_last, RandomAccessIterator3 X_first, RandomAccessIterator3 X_last)
Solve Linear (USV^H).X = B where U, S and V are provided by a svd decomposition.
double svd_least_square_nd(RandomAccessIterator1 x_first, RandomAccessIterator1 x_last, RandomAccessIterator2 y_first, RandomAccessIterator3 s_first, RandomAccessIterator4 p_first, RandomAccessIterator4 p_last, const std::size_t order, slip::EvalBasis< typename std::iterator_traits< RandomAccessIterator1 >::value_type, RandomAccessIterator2 > &basis_fun)
nd Linear Least Square fitting using SVD.
Provides some polynomial algorithms.
Numerical Vector class. This container statisfies the RandomAccessContainer concepts of the Standard ...
row_iterator row_end(const size_type row)
Returns a read/write iterator that points one past the end element of the row row in the Matrix...
Numerical matrix class. This container statisfies the BidirectionnalContainer concepts of the STL...
std::iterator_traits< RandomAccessIterator1 >::value_type inner_product(RandomAccessIterator1 first1, RandomAccessIterator1 last1, RandomAccessIterator2 first2, typename std::iterator_traits< RandomAccessIterator1 >::value_type init=typename std::iterator_traits< RandomAccessIterator1 >::value_type())
Computes the inner_product of two ranges X and Y: .
double svd_least_square(RandomAccessIterator1 x_first, RandomAccessIterator1 x_last, RandomAccessIterator2 y_first, RandomAccessIterator3 s_first, RandomAccessIterator4 p_first, RandomAccessIterator4 p_last, slip::EvalBasis< typename std::iterator_traits< RandomAccessIterator1 >::value_type, RandomAccessIterator2 > &basis_fun)
Linear Least Square fitting using SVD.
Provides a class to manipulate Numerical Matrix.
row_iterator row_begin(const size_type row)
Returns a read/write iterator that points to the first element of the row row in the Matrix...
Provides some Singular Value Decomposition (SVD) algorithms.
Provides a class to manipulate numerical vectors.
iterator begin()
Returns a read/write iterator that points to the first element in the Vector. Iteration is done in or...