75 #ifndef SLIP_GRAM_SCHMIDT_HPP
76 #define SLIP_GRAM_SCHMIDT_HPP
124 template<
class RandomAccessIterator,
class InnerProduct>
126 RandomAccessIterator init_base_end,
127 RandomAccessIterator ortho_base_first,
128 RandomAccessIterator ortho_base_end,
129 InnerProduct inner_prod)
133 assert( (init_base_end - init_base_first) == (ortho_base_end - ortho_base_first));
135 typedef typename std::iterator_traits<RandomAccessIterator>::difference_type _Distance;
136 _Distance init_base_first_size = (init_base_end - init_base_first);
137 ortho_base_first[0] = init_base_first[0] /
std::sqrt(inner_prod(init_base_first[0],init_base_first[0]));
138 for(_Distance k = 1; k < init_base_first_size; ++k)
140 typename RandomAccessIterator::value_type sum = (inner_prod(ortho_base_first[0],init_base_first[k]) / inner_prod(ortho_base_first[0],ortho_base_first[0])) * ortho_base_first[0];
141 for(_Distance q = 1; q < k; ++q)
143 sum += (inner_prod(ortho_base_first[q],init_base_first[k]) / inner_prod(ortho_base_first[q],ortho_base_first[q])) * ortho_base_first[q];
145 ortho_base_first[k] = init_base_first[k] - sum;
146 ortho_base_first[k] = ortho_base_first[k] /
std::sqrt(inner_prod(ortho_base_first[k],ortho_base_first[k]));
188 template<
class RandomAccessIterator,
class InnerProduct>
190 RandomAccessIterator init_base_end,
191 RandomAccessIterator ortho_base_first,
192 RandomAccessIterator ortho_base_end,
193 InnerProduct inner_prod)
196 assert( (init_base_end - init_base_first) == (ortho_base_end - ortho_base_first));
198 typedef typename std::iterator_traits<RandomAccessIterator>::difference_type _Distance;
199 _Distance init_base_first_size = (init_base_end - init_base_first);
201 std::copy(init_base_first,init_base_end,ortho_base_first);
203 for(_Distance k = 0; k < init_base_first_size; ++k)
205 ortho_base_first[k] /=
std::sqrt(inner_prod(ortho_base_first[k],ortho_base_first[k]));
206 for(_Distance q = (k + 1); q < init_base_first_size; ++q)
208 ortho_base_first[q] -= inner_prod(ortho_base_first[q],ortho_base_first[k]) * ortho_base_first[k];
251 template<
class RandomAccessIterator,
class InnerProduct>
253 RandomAccessIterator init_base_end,
254 RandomAccessIterator ortho_base_first,
255 RandomAccessIterator ortho_base_end,
256 InnerProduct inner_prod)
258 assert( (init_base_end - init_base_first) == (ortho_base_end - ortho_base_first));
259 typedef typename std::iterator_traits<RandomAccessIterator>::difference_type _Distance;
260 _Distance init_base_first_size = (init_base_end - init_base_first);
261 ortho_base_first[0] = init_base_first[0];
262 for(_Distance k = 1; k < init_base_first_size; ++k)
264 typename RandomAccessIterator::value_type sum = (inner_prod(ortho_base_first[0],init_base_first[k]) / inner_prod(ortho_base_first[0],ortho_base_first[0])) * ortho_base_first[0];
265 for(_Distance q = 1; q < k; ++q)
267 sum += (inner_prod(ortho_base_first[q],init_base_first[k]) / inner_prod(ortho_base_first[q],ortho_base_first[q])) * ortho_base_first[q];
269 ortho_base_first[k] = init_base_first[k] - sum;
311 template<
class RandomAccessIterator,
class InnerProduct>
313 RandomAccessIterator init_base_end,
314 RandomAccessIterator ortho_base_first,
315 RandomAccessIterator ortho_base_end,
316 InnerProduct inner_prod)
319 assert( (init_base_end - init_base_first) == (ortho_base_end - ortho_base_first));
320 typedef typename std::iterator_traits<RandomAccessIterator>::difference_type _Distance;
321 _Distance init_base_first_size = (init_base_end - init_base_first);
323 std::copy(init_base_first,init_base_end,ortho_base_first);
325 for(_Distance k = 0; k < init_base_first_size; ++k)
327 typedef typename std::iterator_traits<RandomAccessIterator>::value_type BaseElement;
329 BaseElement Bk = ortho_base_first[k] /
std::sqrt(inner_prod(ortho_base_first[k],ortho_base_first[k]));
330 for(_Distance q = (k + 1); q < init_base_first_size; ++q)
332 ortho_base_first[q] -= inner_prod(ortho_base_first[q],Bk) * Bk;
387 template<
typename MatrixIterator1,
388 typename MatrixIterator2,
389 typename MatrixIterator3>
391 MatrixIterator1 A_bot,
392 MatrixIterator2 Q_up,
393 MatrixIterator2 Q_bot,
394 MatrixIterator3 R_up,
395 MatrixIterator3 R_bot)
397 assert((A_bot - A_up)[0] == (Q_bot - Q_up)[0]);
398 assert((A_bot - A_up)[1] == (Q_bot - Q_up)[1]);
399 assert((R_bot - R_up)[0] == (A_bot - A_up)[1]);
400 assert((R_bot - R_up)[1] == (A_bot - A_up)[1]);
401 assert((A_bot - A_up)[0] >= (A_bot - A_up)[1]);
403 typedef typename std::iterator_traits<MatrixIterator1>::value_type value_type;
405 typedef typename MatrixIterator1::size_type size_type;
406 typename MatrixIterator1::difference_type sizeA = A_bot - A_up;
407 typename MatrixIterator2::difference_type sizeQ = Q_bot - Q_up;
408 typename MatrixIterator3::difference_type sizeR = R_bot - R_up;
410 size_type A_cols = sizeA[1];
414 std::fill(Q_up,Q_bot,value_type());
416 std::copy(A_up.col_begin(0),A_up.col_end(0),Q_up.col_begin(0));
418 std::fill(R_up,R_bot,value_type());
419 *R_up = value_type(1);
420 for(size_type k = 0; k < A_cols; ++k)
425 R_up[d] = norm_col_k;
428 std::transform(A_up.col_begin(k),A_up.col_end(k),
429 Q_up.col_begin(k),std::bind2nd(std::divides<value_type>(),norm_col_k));
430 for(size_type q = (k+1); q < A_cols; ++q)
434 A_up.col_begin(q),value_type());
436 Q_up.col_begin(k),(-R_up[d2]));
520 template<
class RandomAccessIterator,
class RandomAccessIterator2d,
class InnerProduct>
522 RandomAccessIterator init_base_end,
523 RandomAccessIterator2d matrix_upper_left,
524 RandomAccessIterator2d matrix_bottom_right,
525 InnerProduct inner_prod)
527 assert((matrix_bottom_right - matrix_upper_left)[0] == (init_base_end - init_base_first));
528 assert((matrix_bottom_right - matrix_upper_left)[1] == (init_base_end - init_base_first));
530 typedef typename std::iterator_traits<RandomAccessIterator>::difference_type _Distance;
531 typedef typename std::iterator_traits<RandomAccessIterator2d>::difference_type _Distance2d;
533 _Distance init_base_first_size = (init_base_end - init_base_first);
534 _Distance2d matrix_size2d = (matrix_bottom_right - matrix_upper_left);
536 for(_Distance i = 0 ; i < init_base_first_size; ++i)
538 for(_Distance j = 0 ; j < init_base_first_size; ++j)
540 *(matrix_upper_left++) = inner_prod(init_base_first[i],init_base_first[j]);
550 #endif //SLIP_GRAM_SCHMIDT_HPP
void gram_schmidt_orthogonalization(RandomAccessIterator init_base_first, RandomAccessIterator init_base_end, RandomAccessIterator ortho_base_first, RandomAccessIterator ortho_base_end, InnerProduct inner_prod)
Gram-Schmidt orthogonalization algorithm.
void reduction(Iterator1 seq1_beg, Iterator1 seq1_end, Iterator2 seq2_beg, U u)
Add u times the second sequence to the first one: seq1 = seq1 + u * seq2.
Provides a class to modelize the difference of slip::Point2d.
void modified_gram_schmidt_normalization(RandomAccessIterator init_base_first, RandomAccessIterator init_base_end, RandomAccessIterator ortho_base_first, RandomAccessIterator ortho_base_end, InnerProduct inner_prod)
Modified Gram-Schmidt orthonormalization algorithm.
slip::lin_alg_traits< typename std::iterator_traits< InputIterator >::value_type >::value_type L22_norm_cplx(InputIterator first, InputIterator last)
Computes the L22 norm of a complex container.
void modified_gram_schmidt(MatrixIterator1 A_up, MatrixIterator1 A_bot, MatrixIterator2 Q_up, MatrixIterator2 Q_bot, MatrixIterator3 R_up, MatrixIterator3 R_bot)
Modified Gram-Schmidt orthogonalization algorithm on a matrix.
Provides common linear algebra algorithms.
void copy(_II first, _II last, _OI output_first)
Copy algorithm optimized for slip iterators.
Difference of Point2D class, specialization of DPoint<CoordType,DIM> with DIM = 2.
HyperVolume< T > sqrt(const HyperVolume< T > &M)
std::iterator_traits< RandomAccessIterator1 >::value_type hermitian_inner_product(RandomAccessIterator1 first1, RandomAccessIterator1 last1, RandomAccessIterator2 first2, typename std::iterator_traits< RandomAccessIterator1 >::value_type init)
Computes the hermitian inner-product of two ranges X and Y: .
void modified_gram_schmidt_orthogonalization(RandomAccessIterator init_base_first, RandomAccessIterator init_base_end, RandomAccessIterator ortho_base_first, RandomAccessIterator ortho_base_end, InnerProduct inner_prod)
Modified Gram-Schmidt orthogonalization algorithm.
void gram_schmidt_normalization(RandomAccessIterator init_base_first, RandomAccessIterator init_base_end, RandomAccessIterator ortho_base_first, RandomAccessIterator ortho_base_end, InnerProduct inner_prod)
Gram-Schmidt orthonormalization algorithm.
void gram_matrix(RandomAccessIterator init_base_first, RandomAccessIterator init_base_end, RandomAccessIterator2d matrix_upper_left, RandomAccessIterator2d matrix_bottom_right, InnerProduct inner_prod)
Compute the Gram matrix from a base.