74 #ifndef SLIP_LINEAR_ALGEBRA_HPP
75 #define SLIP_LINEAR_ALGEBRA_HPP
100 template <
class RandomAccessIterator2d,
101 class RandomAccessIterator1,
102 class RandomAccessIterator2>
104 RandomAccessIterator2d M_bottom_right,
105 RandomAccessIterator1 first1,
106 RandomAccessIterator1 last1,
107 RandomAccessIterator2 result_first,
108 RandomAccessIterator2 result_last);
161 template <
typename _F,
typename _S,
typename _RT,
typename _AT>
162 struct saxpy :
public std::binary_function<_F, _S, _RT>
173 return a_ * __x + __y;
194 struct z1conjz2 :
public std::binary_function<_Tp, _Tp, _Tp>
218 struct conjz1z2 :
public std::binary_function<_Tp, _Tp, _Tp>
267 template <
typename RandomAccessIterator1,
268 typename RandomAccessIterator2>
270 typename std::iterator_traits<RandomAccessIterator1>::value_type
272 RandomAccessIterator1 last1,
273 RandomAccessIterator2 first2,
274 typename std::iterator_traits<RandomAccessIterator1>::value_type init)
276 typedef typename std::iterator_traits<RandomAccessIterator1>::value_type value_type;
281 std::plus<value_type>(),
319 template <
typename RandomAccessIterator1,
320 typename RandomAccessIterator2>
322 typename std::iterator_traits<RandomAccessIterator1>::value_type
324 RandomAccessIterator1 last1,
325 RandomAccessIterator2 first2,
326 typename std::iterator_traits<RandomAccessIterator1>::value_type init =
typename std::iterator_traits<RandomAccessIterator1>::value_type())
328 typedef typename std::iterator_traits<RandomAccessIterator1>::value_type value_type;
377 template <
typename Vector1,
380 typename Vector1::value_type
384 assert(V1.size() >= V2.size());
437 template <
typename RandomAccessIterator1,
438 typename RandomAccessIterator2d,
439 typename RandomAccessIterator2>
441 typename std::iterator_traits<RandomAccessIterator2>::value_type
443 RandomAccessIterator1 last1,
444 RandomAccessIterator2d A_upper_left,
445 RandomAccessIterator2d A_bottom_right,
446 RandomAccessIterator2 first2,
447 RandomAccessIterator2 last2,
448 typename std::iterator_traits<RandomAccessIterator2>::value_type init =
typename std::iterator_traits<RandomAccessIterator2>::value_type())
450 typedef typename std::iterator_traits<RandomAccessIterator1>::value_type value_type;
504 template <
typename Vector1,
508 typename Vector2::value_type
517 typename Vector2::value_type());
553 template <
typename RandomAccessIterator1,
554 typename RandomAccessIterator2d>
556 typename std::iterator_traits<RandomAccessIterator1>::value_type
558 RandomAccessIterator1 last1,
559 RandomAccessIterator2d A_upper_left,
560 RandomAccessIterator2d A_bottom_right)
563 typedef typename std::iterator_traits<RandomAccessIterator1>::value_type value_type;
565 A_upper_left,A_bottom_right,
599 template <
typename Vector,
628 template <
typename AT,
629 typename RandomAccessIterator1,
630 typename RandomAccessIterator2>
633 RandomAccessIterator1 first1,
634 RandomAccessIterator1 last1,
635 RandomAccessIterator2 first2)
637 typedef typename std::iterator_traits<RandomAccessIterator1>::value_type value_type1;
638 typedef typename std::iterator_traits<RandomAccessIterator2>::value_type value_type2;
639 std::transform(first1,last1,
684 template <
typename RandomAccessIterator1,
686 typename RandomAccessIterator2>
689 RandomAccessIterator1 V_last,
691 RandomAccessIterator2 result_first)
695 typedef typename std::iterator_traits<RandomAccessIterator1>::value_type value_type1;
697 for ( ; V_first != V_last; ++V_first, ++result_first)
699 *result_first = *V_first * scal;
729 template <
typename Vector1,
737 assert(Result.size() <= V.size());
770 template <
typename RandomAccessIterator1,
772 typename RandomAccessIterator2>
775 RandomAccessIterator1 V_last,
777 RandomAccessIterator2 result_first)
779 for ( ; V_first != V_last; ++V_first, ++result_first)
811 template <
typename Vector1,
852 template <
class RandomAccessIterator2d1,
854 class RandomAccessIterator2d2>
857 RandomAccessIterator2d1 M_bottom_right,
859 RandomAccessIterator2d2 R_upper_left,
860 RandomAccessIterator2d2 R_bottom_right)
864 typedef typename RandomAccessIterator2d1::size_type size_type;
865 size_type M_rows = (M_bottom_right - M_upper_left)[0];
867 assert((M_bottom_right - M_upper_left)[0] == (R_bottom_right - R_upper_left)[0]);
868 assert((M_bottom_right - M_upper_left)[1] == (R_bottom_right - R_upper_left)[1]);
871 for(std::size_t i = 0; i < M_rows; ++i)
874 M_upper_left.row_end(i),
876 R_upper_left.row_begin(i));
906 template <
class Matrix1,
918 R.upper_left(),R.bottom_right());
959 template <
class RandomAccessIterator2d,
960 class RandomAccessIterator1,
961 class RandomAccessIterator2>
964 RandomAccessIterator2d M_bottom_right,
965 RandomAccessIterator1 first1,
966 RandomAccessIterator1 last1,
967 RandomAccessIterator2 result_first,
968 RandomAccessIterator2 result_last)
970 assert((M_bottom_right - M_upper_left)[1] == (last1 - first1));
971 assert((M_bottom_right - M_upper_left)[0] == (result_last - result_first));
974 typedef typename RandomAccessIterator2d::size_type size_type;
978 typedef typename std::iterator_traits<RandomAccessIterator2>::value_type value_type;
983 for(; result_first!=result_last; ++result_first, ++i)
986 M_upper_left.row_end(i),
1026 template <
class Matrix,
1036 Result.begin(), Result.end());
1074 template <
class RandomAccessIterator2d,
1075 class RandomAccessIterator1,
1076 class RandomAccessIterator2>
1079 RandomAccessIterator1 V_last,
1080 RandomAccessIterator2d M_up,
1081 RandomAccessIterator2d M_bot,
1082 RandomAccessIterator2 result_first,
1083 RandomAccessIterator2 result_last)
1085 typename RandomAccessIterator2d::difference_type size2d =
1087 typedef typename RandomAccessIterator2d::size_type size_type;
1088 size_type nb_rows = size2d[0];
1089 size_type nb_cols = size2d[1];
1090 typename std::iterator_traits<RandomAccessIterator1>::difference_type size1d =
1093 typedef typename std::iterator_traits<RandomAccessIterator2>::value_type value_type;
1095 assert(nb_rows == (std::size_t)size1d);
1096 assert(nb_cols == (std::size_t)(result_last - result_first));
1099 for(; result_first!=result_last; ++result_first, ++j)
1139 template <
class Vector1,
1185 template <
class RandomAccessIterator2d,
1186 class RandomAccessIterator1,
1187 class RandomAccessIterator2>
1190 RandomAccessIterator1 V_last,
1191 RandomAccessIterator2d M_up,
1192 RandomAccessIterator2d M_bot,
1193 RandomAccessIterator2 result_first,
1194 RandomAccessIterator2 result_last)
1199 result_first,result_last);
1233 template <
class Vector1,
1285 template <
class RandomAccessIterator2d1,
1286 class RandomAccessIterator2d2,
1287 class RandomAccessIterator2d3>
1290 RandomAccessIterator2d1 M1_bot,
1291 RandomAccessIterator2d2 M2_up,
1292 RandomAccessIterator2d2 M2_bot,
1293 RandomAccessIterator2d3 result_up,
1294 RandomAccessIterator2d3 result_bot)
1296 assert((M1_bot-M1_up)[0] == (M2_bot-M2_up)[0]);
1297 assert((result_bot-result_up)[0] == (M1_bot-M1_up)[1]);
1298 assert((result_bot-result_up)[1] == (M2_bot-M2_up)[1]);
1301 typedef typename RandomAccessIterator2d1::size_type size_type;
1302 size_type rows =
static_cast<size_type
>((M1_bot-M1_up)[1]);
1303 size_type cols =
static_cast<size_type
>((M2_bot-M2_up)[1]);
1306 typedef typename std::iterator_traits<RandomAccessIterator2d3>::value_type value_type;
1309 for(size_type i = 0; i < rows; ++i)
1312 for(size_type j = 0; j < cols; ++j)
1355 template <
class Matrix1,
1364 M2.upper_left(),M2.bottom_right(),
1365 Result.upper_left(),Result.bottom_right());
1399 template <
class RandomAccessIterator2d,
1400 class RandomAccessIterator1,
1401 class RandomAccessIterator2>
1404 RandomAccessIterator2d M_bot,
1405 RandomAccessIterator1 V_first,
1406 RandomAccessIterator1 V_last,
1407 RandomAccessIterator2 R_first,
1408 RandomAccessIterator2 R_last)
1410 assert((M_bot-M_up)[0] == (V_last-V_first));
1412 typedef typename RandomAccessIterator2d::size_type size_type;
1413 size_type cols =
static_cast<size_type
>((M_bot-M_up)[1]);
1416 typedef typename std::iterator_traits<RandomAccessIterator2>::value_type value_type;
1418 for(size_type j = 0; j < cols; ++j)
1456 template <
class Matrix,
1506 template <
typename RandomAccessIterator2d,
1507 typename RandomAccessIterator1,
1508 typename RandomAccessIterator2>
1511 RandomAccessIterator2d M_bot,
1512 RandomAccessIterator1 V_first,
1513 RandomAccessIterator1 V_last,
1514 RandomAccessIterator2 Y_first,
1515 RandomAccessIterator2 Y_last)
1517 assert((M_bot - M_up)[1] == (V_last - V_first));
1518 assert((Y_last - Y_first) == (M_bot - M_up)[0]);
1520 typedef typename std::iterator_traits<RandomAccessIterator2d>::value_type value_type;
1521 typedef typename RandomAccessIterator2d::size_type size_type;
1522 typedef RandomAccessIterator2 iterator;
1524 iterator it = Y_first;
1525 iterator ite = Y_last;
1527 for(; it!=ite; ++it, ++i)
1570 template <
class Matrix,
1616 template <
typename MatrixIterator1,
1617 typename MatrixIterator2,
1618 typename MatrixIterator3>
1622 MatrixIterator2 M2_up, MatrixIterator2 M2_bot,
1623 MatrixIterator3 R_up, MatrixIterator3 R_bot)
1626 assert((M1_bot - M1_up)[1] == (M2_bot - M2_up)[0]);
1627 assert((M1_bot - M1_up)[0] == (R_bot - R_up)[0]);
1628 assert((M2_bot - M2_up)[1] == (R_bot - R_up)[1]);
1629 typedef typename MatrixIterator1::value_type value_type;
1630 typedef typename MatrixIterator1::size_type size_type;
1631 size_type M1_rows =
static_cast<size_type
>((M1_bot - M1_up)[0]);
1632 size_type M2_cols =
static_cast<size_type
>((M2_bot - M2_up)[1]);
1634 for(size_type i = 0; i < M1_rows; ++i)
1636 for(size_type j = 0; j < M2_cols; ++j)
1684 template <
class Matrix1,
1693 M2.upper_left(),M2.bottom_right(),
1694 Result.upper_left(),Result.bottom_right());
1737 template <
typename RandomAccessIterator2d1,
1738 typename RandomAccessIterator2d2,
1739 typename RandomAccessIterator2d3>
1742 RandomAccessIterator2d1 A_bot,
1743 RandomAccessIterator2d2 B_up,
1744 RandomAccessIterator2d2 B_bot,
1745 RandomAccessIterator2d3 C_up,
1746 RandomAccessIterator2d3 C_bot)
1748 assert((A_bot-A_up)[1] == (B_bot-B_up)[0]);
1749 assert((A_bot-A_up)[0] == (C_bot-C_up)[0]);
1750 assert((B_bot-B_up)[1] == (C_bot-C_up)[1]);
1753 typedef typename std::iterator_traits<RandomAccessIterator2d1>::value_type value_type;
1754 typedef typename RandomAccessIterator2d1::size_type size_type;
1755 size_type A_rows = (A_bot-A_up)[0];
1756 size_type B_cols = (B_bot-B_up)[1];
1757 for(size_type i = 0; i < A_rows; ++i)
1759 for(size_type j = 0; j < B_cols; ++j)
1807 template <
class Matrix1,
1816 B.upper_left(),B.bottom_right(),
1817 C.upper_left(),C.bottom_right());
1844 template <
class Matrix1,
class Matrix2,
class Matrix3>
1847 const std::size_t nr1,
1848 const std::size_t nc1,
1850 const std::size_t nr2,
1851 const std::size_t nc2,
1853 const std::size_t nr3,
1854 const std::size_t nc3)
1860 for(std::size_t i = 0; i < nr1; ++i)
1862 for(std::size_t j = 0; j < nc2; ++j)
1865 for(std::size_t k = 0; k < nc1; ++k)
1867 Result[i][j] += M1[i][k] * M2[k][j];
1894 template <
class Matrix1,
class Matrix2,
class Matrix3>
1897 const std::size_t nrm,
1898 const std::size_t ncm,
1900 const std::size_t nrv,
1902 const std::size_t nrr)
1907 for(std::size_t i = 0; i < nrm; ++i)
1910 for(std::size_t k = 0; k < ncm; ++k)
1912 Result[i] += M[i][k] * V[k];
1948 template <
class Matrix1,
class Matrix2,
class Matrix3>
1954 assert(M1.cols() == M2.rows());
1955 assert(M1.rows() == Result.rows());
1956 assert(M2.cols() == Result.cols());
1957 std::size_t nr1 = M1.rows();
1958 std::size_t nc1 = M1.cols();
1959 std::size_t nc2 = M2.cols();
1983 template <
typename MatrixIterator1,
1984 typename MatrixIterator2,
1985 typename MatrixIterator3>
1988 MatrixIterator2 A2_up, MatrixIterator2 A2_bot,
1989 MatrixIterator3 Res_up, MatrixIterator3 Res_bot)
1991 typedef typename std::iterator_traits<MatrixIterator1>::value_type _T;
1992 typename MatrixIterator1::difference_type sizeA1= A1_bot - A1_up;
1993 typename MatrixIterator2::difference_type sizeA2= A2_bot - A2_up;
1994 typename MatrixIterator3::difference_type sizeRes= Res_bot - Res_up;
1995 assert(sizeRes[0] == sizeA1[0]);
1996 assert(sizeRes[1] == sizeA2[1]);
1997 assert(sizeA1[1] == sizeA2[0]);
1999 for(
int i = 0; i < sizeRes[0]; ++i)
2001 for(
int j = 0; j < sizeRes[1]; ++j)
2004 *(Res_up + ij) = _T(0);
2005 for(
int k = 0; k < sizeA1[1]; ++k)
2009 *(Res_up + ij) += (*(A1_up + ik)) * (*(A2_up + kj));
2044 template <
class RandomAccessIterator2d1,
2045 class RandomAccessIterator2d2>
2048 RandomAccessIterator2d1 M1_bot,
2049 RandomAccessIterator2d2 Res_up,
2050 RandomAccessIterator2d2 Res_bot)
2052 assert((Res_bot-Res_up)[0] == (M1_bot-M1_up)[0]);
2053 assert((Res_bot-Res_up)[1] == (M1_bot-M1_up)[0]);
2056 typedef typename RandomAccessIterator2d1::size_type size_type;
2057 size_type rows =
static_cast<size_type
>((M1_bot-M1_up)[0]);
2059 typedef typename std::iterator_traits<RandomAccessIterator2d2>::value_type value_type;
2062 for(size_type i = 0; i < rows; ++i)
2065 for(size_type j = 0; j < rows; ++j)
2100 template <
class Matrix1,
2107 result.upper_left(),result.bottom_right());
2142 template <
class RandomAccessIterator2d1,
2144 class RandomAccessIterator2d2>
2147 RandomAccessIterator2d1 M_bottom_right,
2149 RandomAccessIterator2d2 R_upper_left,
2150 RandomAccessIterator2d2 R_bottom_right)
2152 assert((M_bottom_right - M_upper_left)[0] == (M_bottom_right - M_upper_left)[1]);
2153 assert((M_bottom_right - M_upper_left)[0] == (R_bottom_right - R_upper_left)[0]);
2154 assert((M_bottom_right - M_upper_left)[1] == (R_bottom_right - R_upper_left)[1]);
2155 typename RandomAccessIterator2d1::difference_type size2d_M =
2156 M_bottom_right - M_upper_left;
2157 typename RandomAccessIterator2d2::difference_type size2d_R =
2158 R_bottom_right - R_upper_left;
2159 typedef typename RandomAccessIterator2d1::size_type size_type;
2160 size_type M_rows = size2d_M[0];
2164 typedef typename std::iterator_traits<RandomAccessIterator2d2>::value_type value_type;
2166 std::copy(M_upper_left,M_bottom_right,R_upper_left);
2168 for(size_type i = 0; i < M_rows; ++i)
2170 *R_upper_left = value_type(*M_upper_left) - value_type(lambda);
2203 template <
class RandomAccessIterator2d1,
2207 RandomAccessIterator2d1 M_bottom_right,
2210 typename RandomAccessIterator2d1::difference_type size2d_M =
2211 M_bottom_right - M_upper_left;
2212 typedef typename RandomAccessIterator2d1::size_type size_type;
2213 size_type M_rows = size2d_M[0];
2214 size_type M_cols = size2d_M[1];
2215 assert(M_rows == M_cols);
2217 typedef typename std::iterator_traits<RandomAccessIterator2d1>::value_type value_type;
2220 for(size_type i = 0; i < M_rows; ++i)
2222 *M_upper_left -= value_type(lambda);
2255 template <
class Matrix1,
2265 R.upper_left(),R.bottom_right());
2292 template <
class Matrix,
2341 template <
typename RandomAccessIterator2d1,
2343 typename RandomAccessIterator1,
2344 typename RandomAccessIterator2>
2347 RandomAccessIterator2d1 A_bot,
2349 RandomAccessIterator1 X_first,
2350 RandomAccessIterator1 X_last,
2351 RandomAccessIterator2 Y_first,
2352 RandomAccessIterator2 Y_last)
2356 assert((A_bot - A_up)[0] == (X_last - X_first));
2357 assert((A_bot - A_up)[1] == (Y_last - Y_first));
2359 typename RandomAccessIterator2d1::difference_type size2d_A =
2361 typedef typename RandomAccessIterator2d1::size_type size_type;
2362 size_type A_rows = size2d_A[0];
2364 typedef typename std::iterator_traits<RandomAccessIterator1>::difference_type _Difference;
2365 _Difference y_size = Y_last - Y_first;
2368 typedef typename std::iterator_traits<RandomAccessIterator2d1>::value_type value_type;
2374 for(size_type i = 0; i < A_rows; ++i, ++X_first)
2416 template <
typename Matrix,
2446 template <
typename Iterator1,
typename Iterator2,
typename U>
2449 Iterator2 seq2_beg, U u)
2451 typedef typename std::iterator_traits<Iterator1>::value_type _T1;
2452 typedef typename std::iterator_traits<Iterator2>::value_type _T2;
2453 std::transform(seq2_beg,seq2_beg + (seq1_end - seq1_beg),
2474 template <
class Matrix1,
class Matrix2>
2478 assert(M.rows() == TM.cols());
2479 assert(M.cols() == TM.rows());
2480 typedef typename Matrix1::value_type _T;
2481 std::size_t M_rows = M.rows();
2482 std::size_t M_cols = M.cols();
2483 for (std::size_t i = 0; i < M_rows; ++i)
2485 for (std::size_t j = 0; j < M_cols; ++j)
2514 template <
class Matrix1,
class Matrix2>
2517 const std::size_t nr1,
2518 const std::size_t nc1,
2520 const std::size_t nr2,
2521 const std::size_t nc2)
2526 for (std::size_t i = 0; i < nr1; ++i)
2528 for (std::size_t j = 0; j < nc1; ++j)
2560 template <
class Matrix1,
class Matrix2>
2601 template <
class Matrix1,
class Matrix2>
2603 void conj(
const Matrix1 & M, Matrix2 & CM)
2605 assert(M.rows() == CM.rows());
2606 assert(M.cols() == CM.cols());
2641 template <
class Matrix1,
class Matrix2>
2643 void real(
const Matrix1 & C, Matrix2 & R)
2645 assert(R.rows() == C.rows());
2646 assert(R.cols() == C.cols());
2682 template <
class Matrix1,
class Matrix2>
2684 void imag(
const Matrix1 & C, Matrix2 & I)
2686 assert(I.rows() == C.rows());
2687 assert(I.cols() == C.cols());
2735 template <
typename VectorIterator1,
2736 typename VectorIterator2,
2737 typename MatrixIterator>
2740 VectorIterator2 W_begin, VectorIterator2 W_end,
2741 MatrixIterator R_up, MatrixIterator R_bot)
2744 typename MatrixIterator::difference_type sizeR = R_bot - R_up;
2745 std::size_t R_rows = sizeR[0];
2747 assert(sizeR[0] == (V_end - V_begin));
2748 assert(sizeR[1] == (W_end - W_begin));
2750 for(std::size_t i = 0; i < R_rows; ++i, ++V_begin)
2856 template<
class RandomAccessIterator1,
2857 class RandomAccessIterator2,
2858 class RandomAccessIterator2d>
2860 RandomAccessIterator1 base1_end,
2861 RandomAccessIterator2 base2_first,
2862 RandomAccessIterator2 base2_end,
2863 RandomAccessIterator2d matrix_upper_left,
2864 RandomAccessIterator2d matrix_bottom_right)
2866 assert((matrix_bottom_right - matrix_upper_left)[0] == (base1_end - base1_first));
2867 assert((matrix_bottom_right - matrix_upper_left)[1] == (base2_end - base2_first));
2869 typedef typename std::iterator_traits<RandomAccessIterator1>::difference_type _Distance1;
2870 typedef typename std::iterator_traits<RandomAccessIterator2>::difference_type _Distance2;
2872 typedef typename std::iterator_traits<RandomAccessIterator2d>::difference_type _Distance2d;
2874 _Distance1 base1_first_size = (base1_end - base1_first);
2875 _Distance2 base2_first_size = (base2_end - base2_first);
2877 _Distance2d matrix_size2d = (matrix_bottom_right - matrix_upper_left);
2879 for(_Distance2 i = 0 ; i < base1_first_size; ++i)
2881 for(_Distance1 j = 0 ; j < base2_first_size; ++j)
2883 *(matrix_upper_left++) = base1_first[i] * base2_first[j];
3033 template<
class RandomAccessIterator1,
3034 class RandomAccessIterator2,
3035 class RandomAccessIterator3,
3036 class RandomAccessIterator3d>
3038 RandomAccessIterator1 base1_end,
3039 RandomAccessIterator2 base2_first,
3040 RandomAccessIterator2 base2_end,
3041 RandomAccessIterator3 base3_first,
3042 RandomAccessIterator3 base3_end,
3043 RandomAccessIterator3d base_front_upper_left,
3044 RandomAccessIterator3d base_back_bottom_right)
3046 assert((base_back_bottom_right - base_front_upper_left)[0] == (base1_end - base1_first));
3047 assert((base_back_bottom_right - base_front_upper_left)[1] == (base2_end - base2_first));
3048 assert((base_back_bottom_right - base_front_upper_left)[2] == (base3_end - base3_first));
3050 typedef typename std::iterator_traits<RandomAccessIterator1>::difference_type _Distance1;
3051 typedef typename std::iterator_traits<RandomAccessIterator2>::difference_type _Distance2;
3052 typedef typename std::iterator_traits<RandomAccessIterator3>::difference_type _Distance3;
3054 typedef typename std::iterator_traits<RandomAccessIterator3d>::difference_type _Distance3d;
3056 _Distance1 base1_first_size = (base1_end - base1_first);
3057 _Distance2 base2_first_size = (base2_end - base2_first);
3058 _Distance2 base3_first_size = (base3_end - base3_first);
3060 _Distance3d base_size3d = (base_back_bottom_right - base_front_upper_left);
3061 for(_Distance3 k = 0 ; k < base1_first_size; ++k)
3063 for(_Distance2 i = 0 ; i < base2_first_size; ++i)
3065 for(_Distance1 j = 0 ; j < base3_first_size; ++j)
3067 *(base_front_upper_left++) = base1_first[k]*base2_first[i] * base3_first[j];
3102 template<
typename InputIterator>
3109 typedef typename std::iterator_traits<InputIterator>::value_type _T;
3111 for (; first != last; ++first)
3139 template <
typename RandomAccessIterator2d>
3143 assert(((bottom_right - upper_left)[0] != 0) && ((bottom_right - upper_left)[1] != 0));
3146 typedef typename RandomAccessIterator2d::size_type size_type;
3147 size_type rows = (bottom_right - upper_left)[0];
3148 value_type
max = slip::L1_norm<value_type>(upper_left.row_begin(0),
3149 upper_left.row_end(0));
3151 for(std::size_t i = 1; i < rows; ++i)
3153 value_type tmp = slip::L1_norm<value_type>(upper_left.row_begin(i),
3154 upper_left.row_end(i));
3184 template <
typename Container2d>
3188 return slip::row_norm(container.upper_left(),container.bottom_right());
3212 template <
typename RandomAccessIterator2d>
3216 assert(((bottom_right - upper_left)[0] != 0) && ((bottom_right - upper_left)[1] != 0));
3219 typedef typename RandomAccessIterator2d::size_type size_type;
3220 size_type cols = (bottom_right - upper_left)[1];
3221 value_type
max = slip::L1_norm<value_type>(upper_left.col_begin(0),
3222 upper_left.col_end(0));
3224 for(std::size_t j = 1; j < cols; ++j)
3226 value_type tmp = slip::L1_norm<value_type>(upper_left.col_begin(j),
3227 upper_left.col_end(j));
3256 template <
typename Container2d>
3260 return slip::col_norm(container.upper_left(),container.bottom_right());
3284 template <
typename RandomAccessIterator2d>
3288 assert(((bottom_right - upper_left)[0] != 0) && ((bottom_right - upper_left)[1] != 0));
3313 template <
typename Container2d>
3368 template<
typename Container2d,
3369 typename RandomAccessIterator1>
3371 RandomAccessIterator1 diag_first, RandomAccessIterator1 diag_last,
3372 const int diag_number = 0)
3375 assert(container.dim1() == container.dim2());
3376 assert(
std::abs(diag_number) <
int(container.dim1()));
3377 assert((diag_last - diag_first) <=
int(container.dim1()));
3380 if(diag_number >= 0)
3391 for(; diag_first != diag_last; ++diag_first)
3393 *diag_first = container[i][j];
3440 template<
typename Container2d,
3441 typename RandomAccessIterator1>
3442 void set_diagonal(RandomAccessIterator1 diag_first, RandomAccessIterator1 diag_last,
3443 Container2d& container,
3444 const int diag_number = 0)
3447 assert(container.dim1() == container.dim2());
3448 assert(
std::abs(diag_number) <
int(container.dim1()));
3449 assert((diag_last - diag_first) <=
int(container.dim1()));
3452 if(diag_number >= 0)
3463 for(; diag_first != diag_last; ++diag_first)
3465 container[i][j] = *diag_first;
3502 template<
typename Container2d>
3504 const typename Container2d::value_type& val,
3505 const int diag_number = 0)
3508 assert(container.dim1() == container.dim2());
3509 assert(
std::abs(diag_number) <
int(container.dim1()));
3513 if(diag_number >= 0)
3524 int n = int(container.dim1()) -
std::abs(diag_number);
3525 for(
int k = 0; k < n; ++k)
3527 container[i][j] = val;
3555 template<
typename MatrixIterator>
3557 MatrixIterator M_bot,
3558 const typename MatrixIterator::value_type& val,
3559 const int diag_number = 0)
3563 assert(
std::abs(diag_number) <
int((M_bot-M_up)[0]));
3567 if(diag_number >= 0)
3578 int n = int((M_bot-M_up)[0]) -
std::abs(diag_number);
3581 for(
int k = 0; k < n; ++k)
3606 template <
typename Matrix>
3612 for(std::size_t i = 0; i < nr; ++i)
3637 template <
typename MatrixIterator>
3640 MatrixIterator A_bot)
3642 typedef typename MatrixIterator::value_type value_type;
3643 int A_rows = int((A_bot - A_up)[0]);
3644 int A_cols = int((A_bot - A_up)[1]);
3646 std::fill(A_up,A_bot,value_type(0));
3648 for (
int i = 0; i < n; ++i)
3650 *A_up = value_type(1);
3670 template <
typename Matrix>
3675 std::size_t A_rows = A.
rows();
3676 std::size_t A_cols = A.
cols();
3677 for(std::size_t i = 0; i < A_rows; ++i)
3681 for(std::size_t j = 0; j < i; ++j)
3686 for(std::size_t j = i+1; j < A_cols; ++j)
3693 for(std::size_t j = 0; j < A_cols; ++j)
3715 template <
typename Matrix>
3720 std::size_t A_rows = A.
rows();
3721 std::size_t A_cols = A.
cols();
3722 for(std::size_t i = 0; i < A_rows; ++i)
3724 for(std::size_t j = 0; j < A_cols; ++j)
3726 A(i,j) = value_type(1) / value_type((i + j) + 1);
3756 template <
typename RandomAccessIterator,
typename Matrix>
3758 void toeplitz(RandomAccessIterator first, RandomAccessIterator last,
3761 typedef typename std::iterator_traits<RandomAccessIterator>::value_type value_type;
3762 typedef typename std::iterator_traits<RandomAccessIterator>::difference_type _Difference;
3764 _Difference size = last -first;
3768 assert(
int(size) ==
int(A.
rows()));
3772 for(
int i = 1; i < n; ++i, ++first)
3798 template <
typename Matrix>
3821 template <
typename MatrixIterator1>
3824 MatrixIterator1 A_bot)
3826 return ((A_bot - A_up)[0] == (A_bot - A_up)[1]);
3846 template <
typename Matrix>
3850 = slip::epsilon<typename Matrix::value_type>())
3858 for(std::size_t i = 0; i < A.
rows(); ++i)
3860 if(
std::abs(A[i][i] - value_type(1)) > tol)
3864 for(std::size_t j = 0; j < i; ++j)
3897 template <
typename MatrixIterator1>
3900 MatrixIterator1 A_bot,
3901 const typename slip::lin_alg_traits<
typename std::iterator_traits<MatrixIterator1>::value_type>::value_type tol
3902 =
slip::epsilon<
typename std::iterator_traits<MatrixIterator1>::value_type>())
3909 typedef typename std::iterator_traits<MatrixIterator1>::value_type value_type;
3910 const std::size_t A_rows = (std::size_t)(A_bot - A_up)[0];
3914 for(std::size_t i = 0; i < A_rows; ++i)
3916 for(std::size_t j = 0; j < i; ++j)
3950 template <
typename Matrix>
3954 = slip::epsilon<typename Matrix::value_type>())
3984 template <
typename MatrixIterator1>
3987 MatrixIterator1 A_bot,
3988 const typename slip::lin_alg_traits<
typename std::iterator_traits<MatrixIterator1>::value_type>::value_type tol
3989 =
slip::epsilon<
typename std::iterator_traits<MatrixIterator1>::value_type>())
3996 typedef typename std::iterator_traits<MatrixIterator1>::value_type value_type;
3997 std::size_t A_rows = (std::size_t)(A_bot - A_up)[0];
4001 for(std::size_t i = 0; i < A_rows; ++i)
4003 for(std::size_t j = 0; j <= i; ++j)
4038 template <
typename Matrix>
4042 = slip::epsilon<typename Matrix::value_type>())
4082 template <
typename MatrixIterator1>
4085 MatrixIterator1 A_bot,
4086 const typename slip::lin_alg_traits<
typename std::iterator_traits<MatrixIterator1>::value_type>::value_type tol
4087 =
slip::epsilon<
typename std::iterator_traits<MatrixIterator1>::value_type>())
4094 typedef typename std::iterator_traits<MatrixIterator1>::value_type value_type;
4095 std::size_t A_rows = (std::size_t)(A_bot - A_up)[0];
4099 for(std::size_t i = 0; i < A_rows; ++i)
4101 for(std::size_t j = 0; j <= i; ++j)
4148 template <
typename Matrix>
4152 = slip::epsilon<typename Matrix::value_type>())
4187 template <
typename MatrixIterator1>
4190 MatrixIterator1 A_bot,
4191 const typename slip::lin_alg_traits<
typename std::iterator_traits<MatrixIterator1>::value_type>::value_type tol
4192 =
slip::epsilon<
typename std::iterator_traits<MatrixIterator1>::value_type>())
4194 if(
slip::is_complex(
typename std::iterator_traits<MatrixIterator1>::value_type()))
4227 template <
typename Matrix>
4231 = slip::epsilon<typename Matrix::value_type>())
4264 template <
typename MatrixIterator1>
4267 MatrixIterator1 A_bot,
4268 const typename MatrixIterator1::size_type lower_band_width,
4269 const typename MatrixIterator1::size_type upper_band_width,
4270 const typename slip::lin_alg_traits<
typename std::iterator_traits<MatrixIterator1>::value_type>::value_type tol
4271 =
slip::epsilon<
typename std::iterator_traits<MatrixIterator1>::value_type>())
4274 assert(
typename MatrixIterator1::size_type(lower_band_width) <
typename MatrixIterator1::size_type((A_bot - A_up)[0]));
4275 assert(
typename MatrixIterator1::size_type(upper_band_width) <
typename MatrixIterator1::size_type((A_bot - A_up)[0]));
4276 assert(lower_band_width >=
typename MatrixIterator1::size_type(0));
4277 assert(upper_band_width >=
typename MatrixIterator1::size_type(0));
4283 typedef typename std::iterator_traits<MatrixIterator1>::value_type value_type;
4284 std::size_t A_rows = (std::size_t)(A_bot - A_up)[0];
4288 for(std::size_t i = 0; i < (A_rows - upper_band_width); ++i)
4290 for(std::size_t j = (i + upper_band_width + 1); j < A_rows; ++j)
4300 for(std::size_t i = (lower_band_width + 1); i < A_rows; ++i)
4302 for(std::size_t j = 0; j < (i-lower_band_width); ++j)
4331 template <
typename Matrix>
4337 = slip::epsilon<typename Matrix::value_type>())
4341 lower_band_width,upper_band_width,
4362 template <
typename MatrixIterator1>
4365 MatrixIterator1 A_bot,
4366 const typename slip::lin_alg_traits<
typename std::iterator_traits<MatrixIterator1>::value_type>::value_type tol
4367 =
slip::epsilon<
typename std::iterator_traits<MatrixIterator1>::value_type>())
4388 template <
typename Matrix>
4392 = slip::epsilon<typename Matrix::value_type>())
4416 template <
typename MatrixIterator1>
4419 MatrixIterator1 A_bot,
4420 const typename slip::lin_alg_traits<
typename std::iterator_traits<MatrixIterator1>::value_type>::value_type tol
4421 =
slip::epsilon<
typename std::iterator_traits<MatrixIterator1>::value_type>())
4440 template <
typename Matrix>
4444 = slip::epsilon<typename Matrix::value_type>())
4468 template <
typename MatrixIterator1>
4471 MatrixIterator1 A_bot,
4472 const typename slip::lin_alg_traits<
typename std::iterator_traits<MatrixIterator1>::value_type>::value_type tol
4473 =
slip::epsilon<
typename std::iterator_traits<MatrixIterator1>::value_type>())
4493 template <
typename Matrix>
4497 = slip::epsilon<typename Matrix::value_type>())
4519 template <
typename MatrixIterator1>
4522 MatrixIterator1 A_bot,
4523 const typename slip::lin_alg_traits<
typename std::iterator_traits<MatrixIterator1>::value_type>::value_type tol
4524 =
slip::epsilon<
typename std::iterator_traits<MatrixIterator1>::value_type>())
4545 template <
typename Matrix>
4549 = slip::epsilon<typename Matrix::value_type>())
4573 template <
typename MatrixIterator1>
4576 MatrixIterator1 A_bot,
4577 const typename slip::lin_alg_traits<
typename std::iterator_traits<MatrixIterator1>::value_type>::value_type tol
4578 =
slip::epsilon<
typename std::iterator_traits<MatrixIterator1>::value_type>())
4599 template <
typename Matrix>
4603 = slip::epsilon<typename Matrix::value_type>())
4626 template <
typename MatrixIterator1>
4629 MatrixIterator1 A_bot,
4630 const typename slip::lin_alg_traits<
typename std::iterator_traits<MatrixIterator1>::value_type>::value_type tol
4631 =
slip::epsilon<
typename std::iterator_traits<MatrixIterator1>::value_type>())
4651 template <
typename Matrix>
4655 = slip::epsilon<typename Matrix::value_type>())
4677 template <
typename MatrixIterator1>
4680 MatrixIterator1 A_bot,
4681 const typename slip::lin_alg_traits<
typename std::iterator_traits<MatrixIterator1>::value_type>::value_type tol
4682 =
slip::epsilon<
typename std::iterator_traits<MatrixIterator1>::value_type>())
4701 template <
typename Matrix>
4705 = slip::epsilon<typename Matrix::value_type>())
4728 template <
typename MatrixIterator1>
4731 MatrixIterator1 A_bot,
4733 const typename slip::lin_alg_traits<
typename std::iterator_traits<MatrixIterator1>::value_type>::value_type tol
4734 =
slip::epsilon<
typename std::iterator_traits<MatrixIterator1>::value_type>())
4737 int rows = int((A_bot - A_up)[0]);
4738 int cols = int((A_bot - A_up)[1]);
4744 if(diag_number >= 0)
4755 MatrixIterator1 A_up_start = A_up + dstart;
4756 for(
int k = 0; k < iterations; ++k)
4783 template <
typename MatrixIterator1>
4786 MatrixIterator1 A_bot,
4787 const typename slip::lin_alg_traits<
typename std::iterator_traits<MatrixIterator1>::value_type>::value_type tol
4788 =
slip::epsilon<
typename std::iterator_traits<MatrixIterator1>::value_type>())
4790 int rows = int((A_bot - A_up)[0]);
4791 int cols = int((A_bot - A_up)[1]);
4793 int up_band_number = (cols - 1);
4794 int low_band_number = (rows - 1);
4796 int k = -low_band_number;
4809 if((up_band_number == low_band_number) && (up_band_number = 0))
4820 else if((up_band_number == (cols-1)) && (low_band_number == rows - 1))
4824 else if((up_band_number == 1) && (low_band_number == 0))
4828 else if((up_band_number == 0) && (low_band_number == 1))
4832 else if((up_band_number == 1) && (low_band_number == 1))
4836 else if((up_band_number == (cols-1)) && (low_band_number == 0))
4840 else if((up_band_number == 0) && (low_band_number == (rows-1)))
4844 else if((up_band_number == (cols-1)) && (low_band_number == 1))
4848 else if((up_band_number == 1) && (low_band_number == (rows-1)))
4875 template <
typename MatrixIterator>
4879 typedef typename std::iterator_traits<MatrixIterator>::value_type _T;
4881 typename MatrixIterator::difference_type sizeM= M_bot - M_up;
4886 while(M_up.x1() < M_bot.x1())
4907 template <
typename MatrixIterator>
4911 typedef typename std::iterator_traits<MatrixIterator>::value_type _T;
4917 MatrixIterator it = M_up + d10;
4918 int istop = int((M_bot - M_up)[0]);
4919 for(
int i = 1; i < istop; ++i, it+=d10)
4933 ind = ind + M_up.x1();
4961 template <
class Matrix1,
class Matrix2>
4964 const std::size_t nr1,
4965 const std::size_t nc1,
4967 const std::size_t nr2,
4968 const std::size_t nc2)
4976 typedef typename Matrix2::value_type _T;
4988 Mcopy[i][j]=M[i][j];
4993 std::fill(IM.begin(),IM.end(),_T(0));
5003 if (Mcopy[i][i]==_T(0))
5006 while ( k<nr1 && Mcopy[k][i]==_T(0) )
5013 std::cerr<<
"Singular Matrix - can not invert it"<<std::endl;
5016 for ( j = i ; j < nr1;++j)
5018 Mcopy[i][j]+= Mcopy[k][j] / Mcopy[k][i];
5020 for ( j = 0 ; j < nr2;++j)
5022 IM[i][j]+= IM[k][j] / Mcopy[k][i];
5028 for ( j = i ; j < nr1;++j)
5030 Mcopy[i][j]/=tmpval;
5032 for ( j = 0 ; j < nr1;++j)
5037 for ( k = 0 ; k < nr1;++k)
5042 for ( j = i ; j < nr1;++j)
5044 Mcopy[k][j]-=tmpval/Mcopy[i][i]*Mcopy[i][j];
5046 for ( j = 0 ; j < nr2;++j)
5048 IM[k][j]-=tmpval/Mcopy[i][i]*IM[i][j];
5081 template <
class Matrix1,
class Matrix2>
5162 template <
class Matrix1,
class Matrix2,
class Vector>
5164 int lu(
const Matrix1 & M,
5168 assert(M.rows()==M.cols());
5169 assert(LU.rows()==LU.cols());
5170 assert(M.rows()==LU.rows());
5171 assert(M.rows()==Indx.
size());
5173 std::size_t nr = M.rows();
5174 std::size_t nc = M.cols();
5177 typedef typename Matrix1::value_type value_type;
5183 for(std::size_t i = 0; i < nr; ++i)
5185 for(std::size_t j = 0; j < nc; ++j)
5192 for(std::size_t i = 0; i < nr; ++i)
5195 for(std::size_t j = 1; j < nc; ++j)
5208 Vv[i] = norm_type(1) /
max;
5211 for (std::size_t j = 0; j < nr; ++j)
5213 for (std::size_t i = 0; i < j; ++i)
5215 value_type sum = LU[i][j];
5216 for (std::size_t k = 0; k < i; ++k)
5218 sum -= LU[i][k] * LU[k][j];
5223 std::size_t imax = 0;
5224 for (std::size_t i = j; i < nr; ++i)
5226 value_type sum = LU[i][j];
5227 for (std::size_t k = 0; k < j; ++k)
5229 sum -= LU[i][k] * LU[k][j];
5232 norm_type tmp = Vv[i] *
std::abs(sum);
5242 for (std::size_t k = 0; k < nr; ++k)
5244 std::swap(LU[imax][k],LU[j][k]);
5248 std::swap(Indx[j],Indx[imax]);
5253 if (LU[j][j] == value_type(0))
5259 value_type scal = value_type(1) / LU[j][j];
5260 for (std::size_t i =j+1; i < nr; ++i)
5351 template <
class Matrix1,
class Matrix2>
5353 int lu(
const Matrix1 & M,
5358 assert(M.rows() == M.cols());
5359 assert(L.rows() == L.cols());
5360 assert(U.rows() == U.cols());
5361 assert(P.rows() == P.cols());
5362 assert(M.rows() == L.rows());
5363 assert(M.rows() == U.rows());
5364 assert(M.rows() == P.cols());
5366 std::size_t nr = M.rows();
5371 for (std::size_t i = 0; i < nr; ++i)
5373 for (std::size_t j=0; j < i; ++j)
5380 for (std::size_t i = 0; i < nr; ++i)
5419 template <
class Matrix,
class Vector1,
class Vector2,
class Vector3>
5422 const std::size_t nr,
5423 const std::size_t nc,
5424 const Vector1 & Indx,
5425 const std::size_t nv1,
5427 const std::size_t nv2,
5429 const std::size_t nv3)
5437 for (std::size_t i = 0; i < nr; ++i)
5442 for (std::size_t j = 0; j < i; ++j)
5444 X[i] -= LU[i][j] * X[j];
5449 for (std::size_t i = nr-1; i < nr; i--)
5451 for (std::size_t j=i+1;j<nr;++j)
5453 X[i] -= LU[i][j] * X[j];
5493 template <
class Matrix,
class Vector1,
class Vector2>
5499 std::size_t nr = A.
rows();
5500 std::size_t nc = A.
cols();
5506 for (std::size_t i = 0; i < nr; ++i)
5511 for (std::size_t j = 0; j < i; ++j)
5513 X[i] -= LU[i][j] * X[j];
5517 for (std::size_t i = nr-1; i < nr; i--)
5519 for (std::size_t j = i+1;j < nr; ++j)
5521 X[i] -= LU[i][j] * X[j];
5556 template <
class Matrix1,
class Matrix2>
5561 assert(M.rows() == M.cols());
5562 assert(IM.rows() == IM.cols());
5563 assert(M.rows() == IM.rows());
5565 std::size_t nr1 = M.rows();
5566 std::size_t nc1 = M.cols();
5568 typedef typename Matrix1::value_type value_type;
5579 for (std::size_t j = 0; j < nc1; ++j)
5581 for (std::size_t i = 0; i < nr1; ++i)
5583 B[i] = value_type(0.0);
5585 B[j] = value_type(1.0);
5586 lu_solve(LU,nr1,nc1,permut,nr1,B,nr1,X,nr1);
5587 for (std::size_t i = 0;i < nr1; ++i)
5616 template <
class Matrix1>
5618 typename Matrix1::value_type
5621 assert(M.rows() == M.cols());
5622 std::size_t nr1 = M.rows();
5623 std::size_t nc1 = M.cols();
5625 typedef typename Matrix1::value_type value_type;
5626 value_type det = 1.0;
5630 sign =
lu(M,LU,permut);
5631 for (std::size_t i=0;i<nr1;++i)
5720 template <
typename MatrixIterator,
typename RandomAccessIterator1,
typename RandomAccessIterator2>
5723 MatrixIterator U_bot,
5724 RandomAccessIterator1 X_first,
5725 RandomAccessIterator1 X_last,
5726 RandomAccessIterator2 B_first,
5727 RandomAccessIterator2 B_last,
5730 assert((U_bot - U_up)[0] == (U_bot - U_up)[1]);
5731 assert((U_bot - U_up)[1] == (X_last - X_first));
5732 assert((X_last - X_first) == (B_last - B_first));
5735 typedef typename MatrixIterator::value_type _T;
5737 int U_rows_m1 = int((U_bot - U_up)[0]) - 1;
5738 int U_rows_m2 = U_rows_m1 - 1;
5749 *(--X_last) = *(--B_last) / botr;
5752 for(
int i = U_rows_m2; i >= 0 ; i--, X_last--, B_last--)
5756 _T inv_uii = _T(1.0)/uii;
5763 X_first + istart,_T());
5764 *X_last = (*B_last - sum) * inv_uii;
5834 template <
class Matrix,
class Vector1,
class Vector2>
5892 template <
typename MatrixIterator1,
5893 typename MatrixIterator2>
5896 MatrixIterator1 A_bot,
5897 MatrixIterator2 Ainv_up,
5898 MatrixIterator2 Ainv_bot,
5901 assert((A_bot - A_up)[0] == (A_bot - A_up)[1]);
5902 assert((Ainv_bot - Ainv_up)[0] == (Ainv_bot - Ainv_up)[1]);
5903 assert((A_bot - A_up)[0] == (Ainv_bot - Ainv_up)[0]);
5904 assert((A_bot - A_up)[1] == (Ainv_bot - Ainv_up)[1]);
5907 typedef typename MatrixIterator1::value_type value_type;
5908 std::size_t n = std::size_t((A_bot - A_up)[0]);
5914 for(std::size_t k = 0; k < n; ++k)
5919 Ainv_up.col_begin(k),
5921 Ainv_up.col_begin(k),
5967 template <
typename Matrix1,
5975 Ainv.upper_left(),Ainv.bottom_right(),
6046 template <
typename MatrixIterator,
typename RandomAccessIterator1,
typename RandomAccessIterator2>
6049 MatrixIterator L_bot,
6050 RandomAccessIterator1 X_first,
6051 RandomAccessIterator1 X_last,
6052 RandomAccessIterator2 B_first,
6053 RandomAccessIterator2 B_last,
6056 assert((L_bot - L_up)[0] == (L_bot - L_up)[1]);
6057 assert((L_bot - L_up)[1] == (X_last - X_first));
6058 assert((X_last - X_first) == (B_last - B_first));
6061 typedef typename MatrixIterator::value_type _T;
6063 RandomAccessIterator1 X_first_tmp = X_first;
6064 int rows = int((L_bot - L_up)[0]);
6071 *(X_first++) = *(B_first++) / L00;
6072 for(
int i = 1; i < rows ; ++i, ++X_first, ++B_first)
6076 _T inv_Lii = _T(1.0)/Lii;
6083 *X_first = (*B_first - sum) * inv_Lii;
6151 template <
class Matrix,
class Vector1,
class Vector2>
6209 template <
typename MatrixIterator1,
6210 typename MatrixIterator2>
6213 MatrixIterator1 A_bot,
6214 MatrixIterator2 Ainv_up,
6215 MatrixIterator2 Ainv_bot,
6218 assert((A_bot - A_up)[0] == (A_bot - A_up)[1]);
6219 assert((Ainv_bot - Ainv_up)[0] == (Ainv_bot - Ainv_up)[1]);
6220 assert((A_bot - A_up)[0] == (Ainv_bot - Ainv_up)[0]);
6221 assert((A_bot - A_up)[1] == (Ainv_bot - Ainv_up)[1]);
6224 typedef typename MatrixIterator1::value_type value_type;
6225 std::size_t n = std::size_t((A_bot - A_up)[0]);
6231 for(std::size_t k = 0; k < n; ++k)
6236 Ainv_up.col_begin(k),
6238 Ainv_up.col_begin(k),
6282 template <
typename Matrix1,
6290 Ainv.upper_left(),Ainv.bottom_right(),
6361 template <
typename MatrixIterator,
typename RandomAccessIterator1,
typename RandomAccessIterator2>
6364 MatrixIterator U_bot,
6365 RandomAccessIterator1 X_first,
6366 RandomAccessIterator1 X_last,
6367 RandomAccessIterator2 B_first,
6368 RandomAccessIterator2 B_last)
6370 assert((U_bot - U_up)[0] == (U_bot - U_up)[1]);
6371 assert((U_bot - U_up)[1] == (X_last - X_first));
6372 assert((X_last - X_first) == (B_last - B_first));
6375 typedef typename MatrixIterator::value_type _T;
6377 int U_rows_m1 = int((U_bot - U_up)[0]) - 1;
6378 int U_rows_m2 = U_rows_m1 - 1;
6383 *(--X_last) = *(--B_last);
6386 for(
int i = U_rows_m2; i >= 0 ; i--, X_last--, B_last--)
6393 X_first + istart,_T());
6394 *X_last = (*B_last - sum) ;
6459 template <
class Matrix,
class Vector1,
class Vector2>
6537 template <
typename MatrixIterator,
typename RandomAccessIterator1,
typename RandomAccessIterator2>
6540 MatrixIterator L_bot,
6541 RandomAccessIterator1 X_first,
6542 RandomAccessIterator1 X_last,
6543 RandomAccessIterator2 B_first,
6544 RandomAccessIterator2 B_last)
6546 assert((L_bot - L_up)[0] == (L_bot - L_up)[1]);
6547 assert((L_bot - L_up)[1] == (X_last - X_first));
6548 assert((X_last - X_first) == (B_last - B_first));
6551 typedef typename MatrixIterator::value_type _T;
6553 RandomAccessIterator1 X_first_tmp = X_first;
6554 int rows = int((L_bot - L_up)[0]);
6557 *(X_first++) = *(B_first++);
6558 for(
int i = 1; i < rows ; ++i, ++X_first, ++B_first)
6564 *X_first = (*B_first - sum);
6629 template <
class Matrix,
class Vector1,
class Vector2>
6712 template <
typename RandomAccessIterator1,
6713 typename RandomAccessIterator2,
6714 typename RandomAccessIterator3>
6717 RandomAccessIterator1 last,
6718 RandomAccessIterator2 X_first,
6719 RandomAccessIterator2 X_last,
6720 RandomAccessIterator3 B_first,
6721 RandomAccessIterator3 B_last,
6722 typename slip::lin_alg_traits<
typename std::iterator_traits<RandomAccessIterator1>::value_type>::value_type precision)
6725 assert((last - first) == (X_last - X_first));
6726 assert((B_last - B_first) == (X_last - X_first));
6730 for(; first != last; ++first, ++X_first, ++B_first)
6737 *X_first = *B_first / *first;
6770 template <
typename MatrixIterator1,
6771 typename RandomAccessIterator>
6774 MatrixIterator1 A_bot,
6777 RandomAccessIterator Ind_first,
6778 RandomAccessIterator Ind_last,
6781 assert((A_bot - A_up)[0] == (A_bot - A_up)[1]);
6782 assert((A_bot - A_up)[1] == (Ind_last - Ind_first));
6783 assert(p <
int((A_bot - A_up)[0]));
6784 assert(q <
int((A_bot - A_up)[0]));
6786 typedef typename MatrixIterator1::value_type value_type;
6788 int A_rows = int((A_bot - A_up)[0]);
6789 int A_rows_m1 = A_rows - 1;
6798 for(
int k = 0; k < A_rows_m1; ++k)
6802 int istop =
std::min(k+p,A_rows_m1) + 1;
6803 int jstart = istart;
6804 int jstop =
std::min(k+p+q,A_rows_m1) + 1;
6815 if((pivot > 0) && (pivot != k))
6817 std::swap_ranges(A_up.row_begin(k),A_up.row_end(k),
6818 A_up.row_begin(pivot));
6820 std::swap(Ind_first[k],Ind_first[pivot]);
6822 value_type Akk = A_up[d];
6827 value_type inv_Akk = value_type(1) / Akk;
6829 A_up.col_begin(k)+istop,
6831 A_up.col_begin(k)+istart);
6833 for(
int i = istart; i < istop; ++i)
6837 A_up.row_begin(i)+jstop,
6838 A_up.row_begin(k)+jstart,
6900 template <
class Matrix1,
class Matrix2,
class Matrix3,
class Matrix4>
6910 assert(M.rows() == M.cols());
6911 assert(L.rows() == L.cols());
6912 assert(U.rows() == U.cols());
6913 assert(P.rows() == P.cols());
6914 assert(M.rows() == L.rows());
6915 assert(M.rows() == U.rows());
6916 assert(M.rows() == P.cols());
6918 std::size_t nr = M.rows();
6930 for (std::size_t i = 0; i < nr; ++i)
6932 for (std::size_t j=0; j < i; ++j)
6939 for (std::size_t i = 0; i < nr; ++i)
7023 template <
typename MatrixIterator,
typename RandomAccessIterator1,
typename RandomAccessIterator2>
7026 MatrixIterator U_bot,
7028 RandomAccessIterator1 X_first,
7029 RandomAccessIterator1 X_last,
7030 RandomAccessIterator2 B_first,
7031 RandomAccessIterator2 B_last,
7034 assert((U_bot - U_up)[0] == (U_bot - U_up)[1]);
7035 assert((U_bot - U_up)[1] == (X_last - X_first));
7036 assert((X_last - X_first) == (B_last - B_first));
7037 assert( q <
int((U_bot - U_up)[0]));
7040 typedef typename MatrixIterator::value_type _T;
7042 int U_rows_m1 = int((U_bot - U_up)[0]) - 1;
7043 int U_rows_m2 = U_rows_m1 - 1;
7054 *(--X_last) = *(--B_last) / botr;
7057 for(
int i = U_rows_m2; i >= 0 ; i--, X_last--, B_last--)
7061 _T inv_uii = _T(1.0)/uii;
7067 int istop =
std::min(i+q,U_rows_m1) + 1;
7068 _T sum =
std::inner_product(U_up.row_begin(i) + istart,U_up.row_begin(i) + istop,X_first + istart,_T());
7069 *X_last = (*B_last - sum) * inv_uii;
7152 template <
typename MatrixIterator,
typename RandomAccessIterator1,
typename RandomAccessIterator2>
7155 MatrixIterator U_bot,
7157 RandomAccessIterator1 X_first,
7158 RandomAccessIterator1 X_last,
7159 RandomAccessIterator2 B_first,
7160 RandomAccessIterator2 B_last,
7163 assert((U_bot - U_up)[0] == (U_bot - U_up)[1]);
7164 assert((U_bot - U_up)[1] == (X_last - X_first));
7165 assert((X_last - X_first) == (B_last - B_first));
7166 assert( q <
int((U_bot - U_up)[0]));
7169 typedef typename MatrixIterator::value_type _T;
7171 int U_rows_m1 = int((U_bot - U_up)[0]) - 1;
7172 int U_rows_m2 = U_rows_m1 - 1;
7177 *(--X_last) = *(--B_last);
7180 for(
int i = U_rows_m2; i >= 0 ; i--, X_last--, B_last--)
7184 int istop =
std::min(i+q,U_rows_m1) + 1;
7185 _T sum =
std::inner_product(U_up.row_begin(i) + istart,U_up.row_begin(i) + istop,X_first + istart,_T());
7186 *X_last = (*B_last - sum);
7271 template <
typename MatrixIterator,
typename RandomAccessIterator1,
typename RandomAccessIterator2>
7274 MatrixIterator L_bot,
7276 RandomAccessIterator1 X_first,
7277 RandomAccessIterator1 X_last,
7278 RandomAccessIterator2 B_first,
7279 RandomAccessIterator2 B_last,
7282 assert((L_bot - L_up)[0] == (L_bot - L_up)[1]);
7283 assert((L_bot - L_up)[1] == (X_last - X_first));
7284 assert((X_last - X_first) == (B_last - B_first));
7285 assert( p <
int((L_bot - L_up)[0]));
7288 typedef typename MatrixIterator::value_type _T;
7290 RandomAccessIterator1 X_first_tmp = X_first;
7291 int rows = int((L_bot - L_up)[0]);
7298 *(X_first++) = *(B_first++) / L00;
7299 for(
int i = 1; i < rows ; ++i, ++X_first, ++B_first)
7303 _T inv_Lii = _T(1.0)/Lii;
7310 _T sum =
std::inner_product(L_up.row_begin(i)+istart,L_up.row_begin(i)+i,X_first_tmp+istart,_T());
7312 *X_first = (*B_first - sum) * inv_Lii;
7398 template <
typename MatrixIterator,
typename RandomAccessIterator1,
typename RandomAccessIterator2>
7401 MatrixIterator L_bot,
7403 RandomAccessIterator1 X_first,
7404 RandomAccessIterator1 X_last,
7405 RandomAccessIterator2 B_first,
7406 RandomAccessIterator2 B_last)
7408 assert((L_bot - L_up)[0] == (L_bot - L_up)[1]);
7409 assert((L_bot - L_up)[1] == (X_last - X_first));
7410 assert((X_last - X_first) == (B_last - B_first));
7411 assert( p <
int((L_bot - L_up)[0]));
7414 typedef typename MatrixIterator::value_type _T;
7416 RandomAccessIterator1 X_first_tmp = X_first;
7417 int rows = int((L_bot - L_up)[0]);
7420 *(X_first++) = *(B_first++);
7421 for(
int i = 1; i < rows ; ++i, ++X_first, ++B_first)
7427 _T sum =
std::inner_product(L_up.row_begin(i)+istart,L_up.row_begin(i)+i,X_first_tmp+istart,_T());
7429 *X_first = (*B_first - sum);
7564 template <
class Matrix,
class Vector1,
class Vector2>
7573 int M_rows = int(M.
rows());
7574 int M_cols = int(M.
cols());
7575 int M_rows_m1 = M_rows - 1;
7576 int M_cols_m1 = M_cols - 1;
7578 int M_cols_p1 = M_cols + 1;
7581 Matrix S(M_rows, M_cols_p1);
7597 if(
std::abs(S[nbpivot][nbr]) < precision)
7606 for(
int i = nbr+1; i < M_rows; ++i)
7608 _T u = - S[i][nbr] / S[nbr][nbr];
7615 if(
std::abs(S[M_rows_m1][M_cols_m1]) < precision)
7683 template <
class Matrix,
7693 int M_rows = int(M.
rows());
7694 int M_cols = int(M.
cols());
7695 int M_rows_m1 = M_rows - 1;
7696 int M_cols_m1 = M_cols - 1;
7698 int M_cols_p1 = M_cols + 1;
7701 Matrix S(M_rows, M_cols_p1);
7720 if(
std::abs(S[nbpivot][nbr]) < precision)
7723 S[nbpivot][nbr] = precision;
7730 for(
int i = nbr+1; i < M_rows; ++i)
7732 _T u = - S[i][nbr] / S[nbr][nbr];
7739 if(
std::abs(S[M_rows_m1][M_cols_m1]) < precision)
7742 S[M.
rows()-1][M.
cols()-1] = precision;
7843 template<
typename RandomAccessIterator1,
7844 typename RandomAccessIterator2,
7845 typename RandomAccessIterator3>
7846 void tridiagonal_lu(RandomAccessIterator1 diag_first, RandomAccessIterator1 diag_last,
7847 RandomAccessIterator1 up_diag_first, RandomAccessIterator1 up_diag_last,
7848 RandomAccessIterator1 low_diag_first, RandomAccessIterator1 low_diag_last,
7849 RandomAccessIterator2 L_low_first, RandomAccessIterator2 L_low_last,
7850 RandomAccessIterator3 U_up_first, RandomAccessIterator3 U_up_last,
7851 typename slip::lin_alg_traits<
typename std::iterator_traits<RandomAccessIterator1>::value_type>::value_type precision =
typename slip::lin_alg_traits<
typename std::iterator_traits<RandomAccessIterator1>::value_type>::value_type(1.0E-6))
7853 assert(diag_last != diag_first);
7854 assert((diag_last - diag_first) == (up_diag_last - up_diag_first + 1));
7855 assert((diag_last - diag_first) == (low_diag_last - low_diag_first + 1));
7856 assert((L_low_last-L_low_first) == (diag_last - diag_first - 1));
7857 assert((U_up_last-U_up_first) == (diag_last - diag_first));
7860 *U_up_first = *diag_first;
7861 for(; L_low_first != L_low_last; ++L_low_first, ++U_up_first, ++diag_first, ++up_diag_first, ++low_diag_first)
7863 if(
std::abs(*U_up_first) < precision)
7867 *L_low_first = *low_diag_first / *U_up_first;
7868 *(U_up_first + 1) = *(diag_first + 1) - (*L_low_first * *up_diag_first);
7943 template<
typename RandomAccessIterator1,
7944 typename RandomAccessIterator2,
7945 typename RandomAccessIterator3>
7947 RandomAccessIterator2 X_first, RandomAccessIterator2 X_last,
7948 RandomAccessIterator3 B_first, RandomAccessIterator3 B_last)
7950 assert(low_diag_last != low_diag_first);
7951 assert((low_diag_last - low_diag_first) == (X_last - X_first - 1));
7952 assert((low_diag_last - low_diag_first) == (B_last - B_first - 1));
7954 *X_first++ = *B_first++;
7955 for(; X_first != X_last; ++X_first, ++B_first, ++low_diag_first)
7957 *X_first = (*B_first - (*low_diag_first * *(X_first - 1)) );
8005 template<
typename RandomAccessIterator1,
8006 typename RandomAccessIterator2d>
8008 RandomAccessIterator1 low_diag_last,
8009 RandomAccessIterator2d Ainv_up,
8010 RandomAccessIterator2d Ainv_bot)
8013 assert((Ainv_bot - Ainv_up)[0] == (Ainv_bot - Ainv_up)[1]);
8014 assert((Ainv_bot - Ainv_up)[0] == (low_diag_last - low_diag_first + 1));
8016 typedef typename std::iterator_traits<RandomAccessIterator1>::value_type value_type;
8017 int n =
static_cast<int>((Ainv_bot - Ainv_up)[0]);
8021 for(
int i = 0; i < n; ++i)
8024 Ainv_up.col_begin(i),Ainv_up.col_end(i),
8025 Ainv_up.col_begin(i),Ainv_up.col_end(i));
8099 template<
typename RandomAccessIterator1,
typename RandomAccessIterator2,
8100 typename RandomAccessIterator3>
8102 RandomAccessIterator1 low_diag_first, RandomAccessIterator1 low_diag_last,
8103 RandomAccessIterator2 X_first, RandomAccessIterator2 X_last,
8104 RandomAccessIterator3 B_first, RandomAccessIterator3 B_last,
8105 typename slip::lin_alg_traits<
typename std::iterator_traits<RandomAccessIterator1>::value_type>::value_type precision =
typename slip::lin_alg_traits<
typename std::iterator_traits<RandomAccessIterator1>::value_type>::value_type(1.0E-6))
8107 assert(diag_last != diag_first);
8108 assert((diag_last - diag_first) == (X_last - X_first));
8109 assert((diag_last - diag_first) == (B_last - B_first));
8110 assert((diag_last - diag_first) == (low_diag_last - low_diag_first + 1));
8112 if(
std::abs(*diag_first) < precision)
8116 *X_first++ = *B_first++ / *diag_first++;
8117 for(; X_first != X_last; ++X_first, ++B_first, ++diag_first, ++low_diag_first)
8119 if(
std::abs(*diag_first) < precision)
8123 *X_first = (*B_first - (*low_diag_first * *(X_first - 1)) ) / *diag_first;
8180 template<
typename RandomAccessIterator1,
8181 typename RandomAccessIterator2d>
8183 RandomAccessIterator1 diag_last,
8184 RandomAccessIterator1 low_diag_first,
8185 RandomAccessIterator1 low_diag_last,
8186 RandomAccessIterator2d Ainv_up,
8187 RandomAccessIterator2d Ainv_bot,
8188 typename slip::lin_alg_traits<
typename std::iterator_traits<RandomAccessIterator1>::value_type>::value_type precision =
typename slip::lin_alg_traits<
typename std::iterator_traits<RandomAccessIterator1>::value_type>::value_type(1.0E-6))
8190 assert(diag_last != diag_first);
8191 assert((diag_last - diag_first) == (low_diag_last - low_diag_first + 1));
8192 assert((Ainv_bot - Ainv_up)[0] == (Ainv_bot - Ainv_up)[1]);
8193 assert((Ainv_bot - Ainv_up)[0] == (diag_last - diag_first));
8195 typedef typename std::iterator_traits<RandomAccessIterator1>::value_type value_type;
8196 int n =
static_cast<int>(diag_last - diag_first);
8200 for(
int i = 0; i < n; ++i)
8203 low_diag_first,low_diag_last,
8204 Ainv_up.col_begin(i),Ainv_up.col_end(i),
8205 Ainv_up.col_begin(i),Ainv_up.col_end(i),
8257 template<
typename Container2d1,
8258 typename Container2d2>
8264 assert(A.dim1() == A.dim2());
8265 assert(Ainv.dim1() == Ainv.dim2());
8268 typedef typename Container2d1::value_type value_type;
8269 typedef typename Container2d1::size_type size_type;
8272 size_type n = A.dim1();
8280 Ainv.bottom_right(),
8358 template<
typename RandomAccessIterator1,
typename RandomAccessIterator2,
8359 typename RandomAccessIterator3>
8361 RandomAccessIterator1 up_diag_first, RandomAccessIterator1 up_diag_last,
8362 RandomAccessIterator2 X_first, RandomAccessIterator2 X_last,
8363 RandomAccessIterator3 B_first, RandomAccessIterator3 B_last,
8364 typename slip::lin_alg_traits<
typename std::iterator_traits<RandomAccessIterator1>::value_type>::value_type precision =
typename slip::lin_alg_traits<
typename std::iterator_traits<RandomAccessIterator1>::value_type>::value_type(1.0E-6))
8367 assert(diag_last != diag_first);
8368 assert((diag_last - diag_first) == (X_last - X_first));
8369 assert((diag_last - diag_first) == (B_last - B_first));
8370 assert((diag_last - diag_first) == (up_diag_last - up_diag_first + 1));
8373 typedef typename std::iterator_traits<RandomAccessIterator1>::value_type value_type;
8374 value_type d = *(--diag_last);
8379 *(--X_last) = *(--B_last) / d;
8386 for(; X_last >= X_first; --X_last, --B_last, --up_diag_last, --diag_last)
8388 if(
std::abs(*diag_last) < precision)
8392 *X_last = (*B_last - (*(X_last + 1) * *up_diag_last)) / *diag_last;
8449 template<
typename RandomAccessIterator1,
8450 typename RandomAccessIterator2d>
8452 RandomAccessIterator1 diag_last,
8453 RandomAccessIterator1 up_diag_first,
8454 RandomAccessIterator1 up_diag_last,
8455 RandomAccessIterator2d Ainv_up,
8456 RandomAccessIterator2d Ainv_bot,
8457 typename slip::lin_alg_traits<
typename std::iterator_traits<RandomAccessIterator1>::value_type>::value_type precision =
typename slip::lin_alg_traits<
typename std::iterator_traits<RandomAccessIterator1>::value_type>::value_type(1.0E-6))
8459 assert(diag_last != diag_first);
8460 assert((diag_last - diag_first) == (up_diag_last - up_diag_first + 1));
8461 assert((Ainv_bot - Ainv_up)[0] == (Ainv_bot - Ainv_up)[1]);
8462 assert((Ainv_bot - Ainv_up)[0] == (diag_last - diag_first));
8464 typedef typename std::iterator_traits<RandomAccessIterator1>::value_type value_type;
8465 int n =
static_cast<int>(diag_last - diag_first);
8469 for(
int i = 0; i < n; ++i)
8472 up_diag_first,up_diag_last,
8473 Ainv_up.col_begin(i),Ainv_up.col_end(i),
8474 Ainv_up.col_begin(i),Ainv_up.col_end(i),
8524 template<
typename Container2d1,
8525 typename Container2d2>
8531 assert(A.dim1() == A.dim2());
8532 assert(Ainv.dim1() == Ainv.dim2());
8535 typedef typename Container2d1::value_type value_type;
8536 typedef typename Container2d1::size_type size_type;
8539 size_type n = A.dim1();
8549 Ainv.bottom_right(),
8618 template<
typename RandomAccessIterator1,
typename RandomAccessIterator2,
8619 typename RandomAccessIterator3>
8621 RandomAccessIterator2 X_first, RandomAccessIterator2 X_last,
8622 RandomAccessIterator3 B_first, RandomAccessIterator3 B_last
8626 assert(X_last != X_first);
8627 assert((X_last - X_first) == (B_last - B_first));
8628 assert((X_last - X_first) == (up_diag_last - up_diag_first + 1));
8631 typedef typename std::iterator_traits<RandomAccessIterator1>::value_type value_type;
8632 *(--X_last) = *(--B_last);
8638 for(; X_last >= X_first; --X_last, --B_last, --up_diag_last)
8640 *X_last = (*B_last - (*(X_last + 1) * *up_diag_last));
8688 template<
typename RandomAccessIterator1,
8689 typename RandomAccessIterator2d>
8691 RandomAccessIterator1 up_diag_last,
8692 RandomAccessIterator2d Ainv_up,
8693 RandomAccessIterator2d Ainv_bot)
8695 assert((Ainv_bot - Ainv_up)[0] == (Ainv_bot - Ainv_up)[1]);
8696 assert((Ainv_bot - Ainv_up)[0] == (up_diag_last - up_diag_first + 1));
8698 typedef typename std::iterator_traits<RandomAccessIterator1>::value_type value_type;
8699 int n =
static_cast<int>((Ainv_bot - Ainv_up)[0]);
8703 for(
int i = 0; i < n; ++i)
8706 Ainv_up.col_begin(i),Ainv_up.col_end(i),
8707 Ainv_up.col_begin(i),Ainv_up.col_end(i));
8792 template<
typename RandomAccessIterator1,
8793 typename RandomAccessIterator2,
8794 typename RandomAccessIterator3>
8795 void thomas_solve(RandomAccessIterator1 diag_first, RandomAccessIterator1 diag_last,
8796 RandomAccessIterator1 up_diag_first, RandomAccessIterator1 up_diag_last,
8797 RandomAccessIterator1 low_diag_first, RandomAccessIterator1 low_diag_last,
8798 RandomAccessIterator2 X_first, RandomAccessIterator2 X_last,
8799 RandomAccessIterator3 B_first, RandomAccessIterator3 B_last,
8800 typename slip::lin_alg_traits<
typename std::iterator_traits<RandomAccessIterator1>::value_type>::value_type precision =
typename slip::lin_alg_traits<
typename std::iterator_traits<RandomAccessIterator1>::value_type>::value_type(1.0E-6))
8802 assert(diag_last != diag_first);
8803 assert((diag_last - diag_first) == (X_last - X_first));
8804 assert((diag_last - diag_first) == (B_last - B_first));
8805 assert((diag_last - diag_first) == (up_diag_last - up_diag_first + 1));
8806 assert((low_diag_last - low_diag_first) == (up_diag_last - up_diag_first));
8808 typedef typename std::iterator_traits<RandomAccessIterator1>::difference_type _Difference;
8809 typedef typename std::iterator_traits<RandomAccessIterator1>::value_type value_type;
8810 _Difference n = (diag_last - diag_first);
8816 up_diag_first,up_diag_last,
8817 low_diag_first,low_diag_last,
8908 template<
typename Container2d,
8917 assert(A.dim1() == A.dim2());
8918 assert(X.size() == A.dim1());
8919 assert(B.size() == A.dim1());
8921 typedef typename Container2d::value_type value_type;
8922 typedef typename Container2d::size_type size_type;
8925 size_type n = A.dim1();
8937 B.begin(),B.end(),precision);
8998 template<
typename RandomAccessIterator1,
8999 typename RandomAccessIterator2d>
9000 void thomas_inv(RandomAccessIterator1 diag_first, RandomAccessIterator1 diag_last,
9001 RandomAccessIterator1 up_diag_first, RandomAccessIterator1 up_diag_last,
9002 RandomAccessIterator1 low_diag_first, RandomAccessIterator1 low_diag_last,
9003 RandomAccessIterator2d Ainv_up, RandomAccessIterator2d Ainv_bot,
9004 typename slip::lin_alg_traits<
typename std::iterator_traits<RandomAccessIterator1>::value_type>::value_type precision =
typename slip::lin_alg_traits<
typename std::iterator_traits<RandomAccessIterator1>::value_type>::value_type(1.0E-6))
9006 assert(diag_last != diag_first);
9007 assert((diag_last - diag_first) == (up_diag_last - up_diag_first + 1));
9008 assert((low_diag_last - low_diag_first) == (up_diag_last - up_diag_first));
9009 assert((Ainv_bot - Ainv_up)[0] == (Ainv_bot - Ainv_up)[1]);
9010 assert((Ainv_bot - Ainv_up)[0] == (diag_last - diag_first));
9011 typedef typename std::iterator_traits<RandomAccessIterator1>::difference_type _Difference;
9012 typedef typename std::iterator_traits<RandomAccessIterator1>::value_type value_type;
9013 _Difference n = (diag_last - diag_first);
9017 for(_Difference i = 0; i < n; ++i)
9020 up_diag_first,up_diag_last,
9021 low_diag_first,low_diag_last,
9022 Ainv_up.col_begin(i),Ainv_up.col_end(i),
9023 Ainv_up.col_begin(i),Ainv_up.col_end(i),
9076 template<
typename Container2d1,
9077 typename Container2d2>
9083 assert(A.dim1() == A.dim2());
9084 assert(Ainv.dim1() == Ainv.dim2());
9087 typedef typename Container2d1::value_type value_type;
9088 typedef typename Container2d1::size_type size_type;
9091 size_type n = A.dim1();
9102 Ainv.bottom_right(),
9200 template<
typename RandomAccessIterator1,
9201 typename RandomAccessIterator2,
9202 typename RandomAccessIterator3>
9204 RandomAccessIterator1 up_diag_first, RandomAccessIterator1 up_diag_last,
9206 RandomAccessIterator2 R_diag_first, RandomAccessIterator2 R_diag_last,
9207 RandomAccessIterator3 R_low_first, RandomAccessIterator3 R_low_last)
9209 assert(diag_last != diag_first);
9210 assert((diag_last - diag_first) == (up_diag_last - up_diag_first + 1));
9211 assert((R_diag_last-R_diag_first) == (diag_last - diag_first));
9212 assert((R_diag_last-R_diag_first) == (R_low_last - R_low_first + 1));
9215 typedef typename std::iterator_traits<RandomAccessIterator1>::value_type value_type;
9216 if(
std::real(*diag_first) <= real_type(0))
9222 for(; R_low_first != R_low_last; ++R_low_first, ++up_diag_first, ++diag_first, ++R_diag_first)
9226 *R_low_first =
slip::conj(*up_diag_first / *R_diag_first);
9227 value_type proj = *(diag_first + 1) -
slip::conj(*R_low_first) * *R_low_first;
9318 template<
typename RandomAccessIterator1,
9319 typename RandomAccessIterator2,
9320 typename RandomAccessIterator3>
9322 RandomAccessIterator1 up_diag_first, RandomAccessIterator1 up_diag_last,
9323 RandomAccessIterator2 X_first, RandomAccessIterator2 X_last,
9324 RandomAccessIterator3 B_first, RandomAccessIterator3 B_last)
9326 assert((X_last - X_first) == (B_last - B_first));
9327 assert((diag_last - diag_first) == (X_last - X_first));
9328 assert((diag_last - diag_first) == (up_diag_last - up_diag_first + 1));
9329 typedef typename std::iterator_traits<RandomAccessIterator1>::difference_type _Difference;
9330 typedef typename std::iterator_traits<RandomAccessIterator1>::value_type value_type;
9331 _Difference n = (diag_last - diag_first);
9337 up_diag_first,up_diag_last,
9434 template<
typename Container2d,
9442 assert(A.dim1() == A.dim2());
9443 assert(X.size() == A.dim1());
9444 assert(B.size() == A.dim1());
9446 typedef typename Container2d::value_type value_type;
9447 typedef typename Container2d::size_type size_type;
9450 size_type n = A.dim1();
9514 template<
typename RandomAccessIterator1,
9515 typename RandomAccessIterator2d>
9517 RandomAccessIterator1 up_diag_first, RandomAccessIterator1 up_diag_last,
9518 RandomAccessIterator2d Ainv_up, RandomAccessIterator2d Ainv_bot)
9520 assert(diag_last != diag_first);
9521 assert((diag_last - diag_first) == (up_diag_last - up_diag_first + 1));
9522 assert((Ainv_bot - Ainv_up)[0] == (Ainv_bot - Ainv_up)[1]);
9523 assert((Ainv_bot - Ainv_up)[0] == (diag_last - diag_first));
9524 typedef typename std::iterator_traits<RandomAccessIterator1>::difference_type _Difference;
9525 typedef typename std::iterator_traits<RandomAccessIterator1>::value_type value_type;
9526 _Difference n = (diag_last - diag_first);
9529 for(_Difference i = 0; i < n; ++i)
9532 up_diag_first,up_diag_last,
9533 Ainv_up.col_begin(i),Ainv_up.col_end(i),
9534 Ainv_up.col_begin(i),Ainv_up.col_end(i));
9587 template<
typename Container2d1,
9588 typename Container2d2>
9593 assert(A.dim1() == A.dim2());
9594 assert(Ainv.dim1() == Ainv.dim2());
9597 typedef typename Container2d1::value_type value_type;
9598 typedef typename Container2d1::size_type size_type;
9601 size_type n = A.dim1();
9611 Ainv.bottom_right());
9632 template<
typename Container2d>
9635 typedef typename Container2d::value_type value_type;
9636 typedef typename Container2d::size_type size_type;
9637 int n = int(A.dim1());
9639 value_type proj = value_type();
9640 for(
int i = 0; i < n; ++i)
9643 for(
int j = 0; j < i; ++j)
9645 R[j] = A[i][j] * A[j][j];
9651 R[i] = A[i][i] - proj;
9655 for(
int k = (i+1); k < n; ++k)
9660 A[k][i] = (A[k][i] - proj) / R[i];
9679 template<
typename Matrix1,
9688 typedef typename Matrix1::value_type value_type;
9689 typedef typename Matrix1::size_type size_type;
9690 int n = int(A.dim1());
9692 value_type proj = value_type();
9693 for(
int i = 0; i < n; ++i)
9696 for(
int j = 0; j < i; ++j)
9698 R[j] = L[i][j] * D[j];
9704 R[i] = A[i][i] - proj;
9706 L[i][i] = value_type(1);
9707 LT[i][i] = value_type(1);
9711 for(
int k = (i+1); k < n; ++k)
9716 L[k][i] = (A[k][i] - proj) / R[i];
9735 template<
typename Matrix1,
9742 typedef typename Matrix1::value_type value_type;
9743 typedef typename Matrix1::size_type size_type;
9744 size_type n = A.dim1();
9818 template <
typename MatrixIterator1,
9819 typename MatrixIterator2,
9820 typename MatrixIterator3>
9823 MatrixIterator1 A_bot,
9824 MatrixIterator2 L_up,
9825 MatrixIterator2 L_bot,
9826 MatrixIterator3 LH_up,
9827 MatrixIterator3 LH_bot)
9829 assert((A_bot - A_up)[0] == (A_bot - A_up)[1]);
9830 assert((L_bot - L_up)[0] == (L_bot - L_up)[1]);
9831 assert((LH_bot - LH_up)[0] == (LH_bot - LH_up)[1]);
9832 assert((A_bot - A_up)[0] == (L_bot - L_up)[0]);
9833 assert((A_bot - A_up)[0] == (LH_bot - LH_up)[0]);
9834 assert((L_bot - L_up)[0] == (LH_bot - LH_up)[0]);
9836 typedef typename MatrixIterator1::value_type value_type;
9838 std::size_t A_rows = std::size_t((A_bot - A_up)[0]);
9843 value_type proj = value_type();
9844 for(std::size_t i = 0; i < A_rows; ++i)
9848 L_up.row_begin(i)+i,
9851 value_type Aup_m_proj = A_up[d] - proj;
9852 if(
std::real(Aup_m_proj) <= real_type())
9859 for(std::size_t j = (i+1); j < A_rows; ++j)
9862 L_up.row_begin(j)+i,
9867 L_up[d2] = (A_up[d2] -
slip::conj(proj))/Lii;
9868 L_up[d3] = value_type();
9870 LH_up[d2] = value_type();
9911 template <
typename MatrixIterator1>
9914 MatrixIterator1 A_bot)
9917 assert((A_bot - A_up)[0] == (A_bot - A_up)[1]);
9919 typedef typename MatrixIterator1::value_type value_type;
9921 std::size_t A_rows = std::size_t((A_bot - A_up)[0]);
9926 value_type proj = value_type();
9927 for(std::size_t i = 0; i < A_rows; ++i)
9931 A_up.row_begin(i)+i,
9934 value_type Aup_m_proj = A_up[d] - proj;
9935 if(
std::real(Aup_m_proj) <= real_type())
9942 for(std::size_t j = (i+1); j < A_rows; ++j)
9945 A_up.row_begin(j)+i,
9950 A_up[d2] = (A_up[d2] -
slip::conj(proj))/Aii;
10004 template <
typename MatrixIterator1,
10005 typename MatrixIterator2,
10006 typename MatrixIterator3>
10009 MatrixIterator1 A_bot,
10010 MatrixIterator2 L_up,
10011 MatrixIterator2 L_bot,
10012 MatrixIterator3 LH_up,
10013 MatrixIterator3 LH_bot)
10015 assert((A_bot - A_up)[0] == (A_bot - A_up)[1]);
10016 assert((L_bot - L_up)[0] == (L_bot - L_up)[1]);
10017 assert((LH_bot - LH_up)[0] == (LH_bot - LH_up)[1]);
10018 assert((A_bot - A_up)[0] == (L_bot - L_up)[0]);
10019 assert((A_bot - A_up)[0] == (LH_bot - LH_up)[0]);
10020 assert((L_bot - L_up)[0] == (LH_bot - LH_up)[0]);
10022 typedef typename MatrixIterator1::value_type value_type;
10024 std::size_t A_rows = std::size_t((A_bot - A_up)[0]);
10029 value_type proj = value_type();
10030 for(std::size_t i = 0; i < A_rows; ++i)
10034 L_up.row_begin(i)+i,
10037 value_type Aup_m_proj = A_up[d] - proj;
10038 if(Aup_m_proj <= real_type())
10042 value_type Lii =
std::sqrt(Aup_m_proj);
10046 for(std::size_t j = (i+1); j < A_rows; ++j)
10049 L_up.row_begin(j)+i,
10054 L_up[d2] = (A_up[d2] - proj)/Lii;
10055 L_up[d3] = value_type();
10056 LH_up[d3] = L_up[d2];
10057 LH_up[d2] = value_type();
10091 template <
typename MatrixIterator1>
10094 MatrixIterator1 A_bot)
10096 assert((A_bot - A_up)[0] == (A_bot - A_up)[1]);
10098 typedef typename MatrixIterator1::value_type value_type;
10100 std::size_t A_rows = std::size_t((A_bot - A_up)[0]);
10106 value_type proj = value_type();
10107 for(std::size_t i = 0; i < A_rows; ++i)
10111 A_up.row_begin(i)+i,
10114 value_type Aup_m_proj = A_up[d] - proj;
10115 if(
std::real(Aup_m_proj) <= real_type(0))
10119 value_type Aii =
std::sqrt(Aup_m_proj);
10122 for(std::size_t j = (i+1); j < A_rows; ++j)
10125 A_up.row_begin(j)+i,
10130 A_up[d2] = (A_up[d2] - proj)/Aii;
10131 A_up[d3] = A_up[d2];
10176 template <
class Matrix1,
10185 L.upper_left(),L.bottom_right(),
10186 LT.upper_left(),LT.bottom_right());
10231 template <
class Matrix1,
10240 L.upper_left(),L.bottom_right(),
10241 LT.upper_left(),LT.bottom_right());
10286 template <
class Matrix1,
10297 L.upper_left(),L.bottom_right(),
10298 LT.upper_left(),LT.bottom_right());
10303 L.upper_left(),L.bottom_right(),
10304 LT.upper_left(),LT.bottom_right());
10346 template <
class Matrix1>
10408 template <
typename MatrixIterator,
10409 typename RandomAccessIterator1,
10410 typename RandomAccessIterator2>
10413 MatrixIterator A_bot,
10414 RandomAccessIterator1 X_first,
10415 RandomAccessIterator1 X_last,
10416 RandomAccessIterator2 B_first,
10417 RandomAccessIterator2 B_last,
10420 assert((A_bot - A_up)[0] == (A_bot - A_up)[1]);
10421 assert((A_bot - A_up)[1] == (X_last - X_first));
10422 assert((X_last - X_first) == (B_last - B_first));
10424 typedef typename std::iterator_traits<MatrixIterator>::value_type value_type;
10425 typedef typename MatrixIterator::size_type size_type;
10426 size_type n = size_type((A_bot - A_up)[0]);
10436 B_first,B_last,precision);
10486 template <
class Matrix1,
10547 template <
typename MatrixIterator1,
10548 typename MatrixIterator2>
10551 MatrixIterator1 A_bot,
10552 MatrixIterator2 Ainv_up,
10553 MatrixIterator2 Ainv_bot,
10556 assert((A_bot - A_up)[0] == (A_bot - A_up)[1]);
10557 assert((Ainv_bot - Ainv_up)[0] == (Ainv_bot - Ainv_up)[1]);
10558 assert((A_bot - A_up)[0] == (Ainv_bot - Ainv_up)[0]);
10559 assert((A_bot - A_up)[1] == (Ainv_bot - Ainv_up)[1]);
10562 typedef typename MatrixIterator1::value_type value_type;
10563 std::size_t n = std::size_t((A_bot - A_up)[0]);
10581 for(std::size_t k = 0; k < n; ++k)
10586 Ainv_up.col_begin(k),Ainv_up.col_end(k),
10590 Ainv_up.
col_begin(k),Ainv_up.col_end(k),
10634 template <
typename Matrix1,
10642 Ainv.upper_left(),Ainv.bottom_right(),
10662 template <
typename Real >
10718 template <
typename Real>
10759 template <
typename Complex>
10762 Complex&
sin,
typename Complex::value_type&
cos)
10764 typedef typename Complex::value_type Real;
10766 Real n =
std::sqrt(std::norm(xi) + std::norm(xk));
10767 cos =
std::abs(xi) / (epsilon * n);
10796 template <
typename Matrix,
typename SizeType,
typename Real>
10799 const SizeType& row1,
10800 const SizeType& row2,
10802 const Real& cosinus,
10803 const SizeType& col1,
10804 const SizeType& col2)
10807 for(SizeType j = col1; j <= col2; ++j)
10809 value_type t1 = M(row1,j);
10810 value_type t2 = M(row2,j);
10811 M(row1,j) = cosinus * t1 + sinus * t2;
10812 M(row2,j) = - sinus * t1 + cosinus * t2;
10839 template <
typename Matrix,
typename SizeType,
typename Real>
10842 const SizeType& col1,
10843 const SizeType& col2,
10845 const Real& cosinus,
10846 const SizeType& row1,
10847 const SizeType& row2)
10850 for(SizeType i = row1; i <= row2; ++i)
10852 value_type t1 = M(i,col1);
10853 value_type t2 = M(i,col2);
10854 M(i,col1) = cosinus * t1 + sinus * t2;
10855 M(i,col2) = - sinus * t1 + cosinus * t2;
10883 template <
typename Matrix,
typename SizeType,
typename Complex>
10886 const SizeType& row1,
10887 const SizeType& row2,
10888 const Complex& sinus,
10889 const typename Complex::value_type& cosinus,
10890 const SizeType& col1,
10891 const SizeType& col2)
10893 for(SizeType j = col1; j <= col2; ++j)
10895 Complex t1 = M(row1,j);
10896 Complex t2 = M(row2,j);
10897 M(row1,j) = cosinus * t1 +
slip::conj(sinus) * t2;
10898 M(row2,j) = -sinus * t1 + cosinus * t2;
10926 template <
typename Matrix,
typename SizeType,
typename Complex>
10929 const SizeType& col1,
10930 const SizeType& col2,
10931 const Complex& sinus,
10932 const typename Complex::value_type& cosinus,
10933 const SizeType& row1,
10934 const SizeType& row2)
10936 for(SizeType i = row1; i <= row2; ++i)
10938 Complex t1 = M(i,col1);
10939 Complex t2 = M(i,col2);
10940 M(i,col1) = cosinus * t1 + sinus * t2;
10941 M(i,col2) = -
slip::conj(sinus) * t1 + cosinus * t2;
10979 template <
typename VectorIterator1,
typename VectorIterator2>
10981 void housegen(VectorIterator1 a_begin, VectorIterator1 a_end,
10982 VectorIterator2 u_begin,VectorIterator2 u_end,
10983 typename std::iterator_traits<VectorIterator1>::value_type &nu)
10987 assert((a_end - a_begin) == (u_end - u_begin));
10988 typedef typename std::iterator_traits<VectorIterator1>::value_type value_type;
10990 value_type rho = value_type(0);
10994 if(
std::abs(nu) == value_type(0.0))
10996 *(u_begin) = value_type(
std::sqrt(2.0));
10999 if(*(u_begin) != value_type(0.0))
11005 rho = value_type(1.0);
11007 value_type scal = (rho/nu);
11009 *u_begin = value_type(1.0) + *u_begin;
11047 template <
typename RandomAccessIterator,
11048 typename MatrixIterator1>
11052 RandomAccessIterator V_last,
11053 MatrixIterator1 M_up,
11054 MatrixIterator1 M_bot)
11057 typedef typename std::iterator_traits<RandomAccessIterator>::value_type value_type;
11059 typename MatrixIterator1::difference_type sizeM = M_bot - M_up;
11060 std::size_t M_rows = sizeM[0];
11063 assert(sizeM[1] == (V_last - V_first));
11107 template <
typename RandomAccessIterator,
11108 typename MatrixIterator1>
11112 RandomAccessIterator V_last,
11113 MatrixIterator1 M_up,
11114 MatrixIterator1 M_bot)
11117 typedef typename std::iterator_traits<RandomAccessIterator>::value_type value_type;
11119 typename MatrixIterator1::difference_type sizeM = M_bot - M_up;
11121 std::size_t M_cols = sizeM[1];
11123 assert(sizeM[0] == (V_last - V_first));
11127 for(std::size_t j = 0; j < M_cols; ++j)
11151 template <
typename Matrix1,
typename Vector1,
typename Matrix2>
11159 typedef typename Matrix1::value_type value_type;
11161 std::size_t M_rows = M.rows();
11162 std::size_t M_cols = M.cols();
11163 int M_rows_m1 = int(M_rows) - 1;
11164 int M_cols_m1 = int(M_cols) - 1;
11170 for(
int j = M_rows-1; j > -1; --j)
11173 V[j] = value_type(V0[j]);
11175 box.
set_coord(j,j,M_rows_m1,M_cols_m1);
11177 Q.upper_left(box),Q.bottom_right(box));
11209 template <
typename Matrix1>
11215 assert(M.rows() == M.cols());
11216 typedef typename Matrix1::value_type value_type;
11218 std::size_t M_rows = M.rows();
11219 std::size_t M_cols = M.cols();
11225 for(std::size_t j = 0; j < (M_cols-1); ++j)
11228 box.
set_coord(
int(j+1),
int(j),
int(M_rows-1),
int(M_cols-1));
11229 value_type beta = value_type(0);
11232 M.upper_left(box).col_end(0),
11238 M.upper_left(box),M.bottom_right(box));
11239 box2.
set_coord(
int(0),
int(j+1),
int(M_rows-1),
int(M_cols-1));
11242 M.upper_left(box2),M.bottom_right(box2));
11276 template <
typename Matrix1,
typename Matrix2>
11282 assert(M.rows() == M.cols());
11283 assert(M.rows() == H.rows());
11284 assert(M.cols() == H.cols());
11286 typedef typename Matrix2::value_type value_type;
11334 template <
typename Matrix1,
typename Matrix2,
typename Matrix3>
11340 assert(M.rows() == M.cols());
11341 assert(H.rows() == H.cols());
11342 assert(Q.rows() == Q.cols());
11343 assert(M.rows() == H.rows());
11344 assert(M.rows() == Q.cols());
11346 typedef typename Matrix2::value_type value_type;
11351 std::size_t M_rows = M.rows();
11352 std::size_t M_cols = M.cols();
11359 std::copy(M.begin(),M.end(),H.begin());
11360 for(std::size_t j = 0; j < (M_cols-1); ++j)
11363 box.
set_coord(
int(j+1),
int(j),
int(M_rows-1),
int(M_cols-1));
11364 value_type beta = value_type(0);
11367 H.upper_left(box).col_end(0),
11372 H.upper_left(box),H.bottom_right(box));
11373 std::fill(H.col_begin(j)+(j+2),H.col_end(j),value_type(0));
11374 box2.
set_coord(
int(0),
int(j+1),
int(M_rows-1),
int(M_cols-1));
11377 H.upper_left(box2),H.bottom_right(box2));
11380 Q.upper_left(box2),Q.bottom_right(box2));
11391 #endif //SLIP_LINEAR_ALGEBRA_HPP
Provides a class to manipulate 2d dynamic and generic arrays.
void hmatrix_matrix_multiplies(RandomAccessIterator2d1 M1_up, RandomAccessIterator2d1 M1_bot, RandomAccessIterator2d2 M2_up, RandomAccessIterator2d2 M2_bot, RandomAccessIterator2d3 result_up, RandomAccessIterator2d3 result_bot)
Computes the hermitian left multiplication of a matrix: .
void diagonal_solve(RandomAccessIterator1 first, RandomAccessIterator1 last, RandomAccessIterator2 X_first, RandomAccessIterator2 X_last, RandomAccessIterator3 B_first, RandomAccessIterator3 B_last, typename slip::lin_alg_traits< typename std::iterator_traits< RandomAccessIterator1 >::value_type >::value_type precision)
Solve the linear system D*X=B when D a diagonal matrix .
bool is_skew_hermitian(MatrixIterator1 A_up, MatrixIterator1 A_bot, const typename slip::lin_alg_traits< typename std::iterator_traits< MatrixIterator1 >::value_type >::value_type tol=slip::epsilon< typename std::iterator_traits< MatrixIterator1 >::value_type >())
Test if a matrix is skew hermitian.
bool is_band_matrix(MatrixIterator1 A_up, MatrixIterator1 A_bot, const typename MatrixIterator1::size_type lower_band_width, const typename MatrixIterator1::size_type upper_band_width, const typename slip::lin_alg_traits< typename std::iterator_traits< MatrixIterator1 >::value_type >::value_type tol=slip::epsilon< typename std::iterator_traits< MatrixIterator1 >::value_type >())
Test if a matrix is a band matrix.
bool is_complex(const T &val)
Test if an element is complex.
void lower_band_solve(MatrixIterator L_up, MatrixIterator L_bot, int p, RandomAccessIterator1 X_first, RandomAccessIterator1 X_last, RandomAccessIterator2 B_first, RandomAccessIterator2 B_last, typename slip::lin_alg_traits< typename MatrixIterator::value_type >::value_type precision)
Solve the linear system L*X=B when L is p lower banded .
void set_coord(const CoordType &x11, const CoordType &x12, const CoordType &x21, const CoordType &x22)
Mutator of the coordinates of the Box2d.
void cholesky_real(MatrixIterator1 A_up, MatrixIterator1 A_bot, MatrixIterator2 L_up, MatrixIterator2 L_bot, MatrixIterator3 LH_up, MatrixIterator3 LH_bot)
cholesky decomposition of a square real symmetric and positive definite Matrix. with L a lower trian...
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.
DENSE_MATRIX_TYPE
Indicate the type of a dense matrix.
iterator2d upper_left()
Returns a read/write iterator2d that points to the first element of the Array2d. It points to the upp...
void imag(const Matrix1 &C, Matrix2 &I)
Extract the imaginary Matrix of a complex Matrix. .
T sign(T a)
Computes the sign of a.
iterator2d upper_left()
Returns a read/write iterator2d that points to the first element of the Matrix. It points to the uppe...
void right_householder_update(RandomAccessIterator V_first, RandomAccessIterator V_last, MatrixIterator1 M_up, MatrixIterator1 M_bot)
right multiplies the matrix M with the Householder matrix P:
_RT operator()(const _F &__x, const _S &__y) const
void lu_solve(const Matrix LU, const std::size_t nr, const std::size_t nc, const Vector1 &Indx, const std::size_t nv1, const Vector2 &B, const std::size_t nv2, Vector3 &X, const std::size_t nv3)
Solve Linear Equation using LU decomposition.
int band_lu(MatrixIterator1 A_up, MatrixIterator1 A_bot, const int p, const int q, RandomAccessIterator Ind_first, RandomAccessIterator Ind_last, typename slip::lin_alg_traits< typename MatrixIterator1::value_type >::value_type precision)
in place Band LU decomposition a square band Matrix A with L a p lower band matrix and U a q upper b...
void matrix_matrixt_multiplies(RandomAccessIterator2d1 M1_up, RandomAccessIterator2d1 M1_bot, RandomAccessIterator2d2 Res_up, RandomAccessIterator2d2 Res_bot)
Computes the multiplication of a matrix with its transposate A^T .
void set_diagonal(RandomAccessIterator1 diag_first, RandomAccessIterator1 diag_last, Container2d &container, const int diag_number=0)
Set the diagonal [diag_first,diag_last) in the diagonal diag_number of a 2d container.
size_type dim1() const
Returns the number of rows (first dimension size) in the Matrix.
void lu_inv(const Matrix1 &M, Matrix2 &IM)
Computes the inverse of a matrix using LU decomposition.
int x1() const
Access to the first index of the current iterator2d_box.
void givens_sin_cos(const Real &xi, const Real &xk, Real &sin, Real &cos)
Computes the Givens sinus and cosinus. .
Container2D::col_iterator col_begin(size_type col)
iterator2d_box element assignment operator.
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 fill_diagonal(Container2d &container, const typename Container2d::value_type &val, const int diag_number=0)
Fill the diagonal diag_number of a 2d container with the value val.
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.
iterator2d bottom_right()
Returns a read/write iterator2d that points to the past the end element of the Matrix. It points to past the end element of the bottom right element of the Matrix.
T & min(const GrayscaleImage< T > &M1)
Returns the min element of a GrayscaleImage.
void lower_bidiagonal_solve(RandomAccessIterator1 diag_first, RandomAccessIterator1 diag_last, RandomAccessIterator1 low_diag_first, RandomAccessIterator1 low_diag_last, RandomAccessIterator2 X_first, RandomAccessIterator2 X_last, RandomAccessIterator3 B_first, RandomAccessIterator3 B_last, typename slip::lin_alg_traits< typename std::iterator_traits< RandomAccessIterator1 >::value_type >::value_type precision=typename slip::lin_alg_traits< typename std::iterator_traits< RandomAccessIterator1 >::value_type >::value_type(1.0E-6))
solve Ax = B with A lower bidiagonal
bool is_null_diagonal(MatrixIterator1 A_up, MatrixIterator1 A_bot, int diag_number, const typename slip::lin_alg_traits< typename std::iterator_traits< MatrixIterator1 >::value_type >::value_type tol=slip::epsilon< typename std::iterator_traits< MatrixIterator1 >::value_type >())
Test if a matrix has a nul diagonal.
void LDLT_solve(const Matrix1 &A, Vector1 &X, const Vector2 &B)
LDLT solve of system AX = B with A a square symmetric Matrix. with L a lower triangular matrix...
void unit_upper_bidiagonal_inv(RandomAccessIterator1 up_diag_first, RandomAccessIterator1 up_diag_last, RandomAccessIterator2d Ainv_up, RandomAccessIterator2d Ainv_bot)
Invert an unit upper bidiagonal matrix: .
int lu(const Matrix1 &M, Matrix2 &LU, Vector &Indx)
Computes the LU decomposition according to rows permutations of a matrix using Crout method LU is co...
slip::lin_alg_traits< T >::value_type epsilon()
Returns the epsilon value of a real or a complex.
void rotgen(Real &a, Real &b, Real &cos, Real &sin)
Computes the Givens sinus and cosinus.
iterator begin()
Returns a read/write iterator that points to the first element in the Array. Iteration is done in ord...
void cholesky_cplx(MatrixIterator1 A_up, MatrixIterator1 A_bot, MatrixIterator2 L_up, MatrixIterator2 L_bot, MatrixIterator3 LH_up, MatrixIterator3 LH_bot)
cholesky decomposition of a square hermitian positive definite Matrix. with L a lower triangular mat...
iterator2d bottom_right()
Returns a read/write iterator2d that points to the past the end element of the Array2d. It points to past the end element of the bottom right element of the Array2d.
bool is_lower_bidiagonal(MatrixIterator1 A_up, MatrixIterator1 A_bot, const typename slip::lin_alg_traits< typename std::iterator_traits< MatrixIterator1 >::value_type >::value_type tol=slip::epsilon< typename std::iterator_traits< MatrixIterator1 >::value_type >())
Test if a matrix is lower_bidiagonal.
bool is_squared(const Matrix &A)
Test if a matrix is squared.
size_type cols() const
Returns the number of columns (second dimension size) in the Matrix.
bool is_tridiagonal(MatrixIterator1 A_up, MatrixIterator1 A_bot, const typename slip::lin_alg_traits< typename std::iterator_traits< MatrixIterator1 >::value_type >::value_type tol=slip::epsilon< typename std::iterator_traits< MatrixIterator1 >::value_type >())
Test if a matrix is tridiagonal.
slip::DENSE_MATRIX_TYPE analyse_matrix(MatrixIterator1 A_up, MatrixIterator1 A_bot, const typename slip::lin_alg_traits< typename std::iterator_traits< MatrixIterator1 >::value_type >::value_type tol=slip::epsilon< typename std::iterator_traits< MatrixIterator1 >::value_type >())
Analyse the type of a matrix.
Computes the complex operation: ( ) between two complex values z1 and z2.
_Tp operator()(const _Tp &z1, const _Tp &z2) const
bool is_upper_bidiagonal(MatrixIterator1 A_up, MatrixIterator1 A_bot, const typename slip::lin_alg_traits< typename std::iterator_traits< MatrixIterator1 >::value_type >::value_type tol=slip::epsilon< typename std::iterator_traits< MatrixIterator1 >::value_type >())
Test if a matrix is upper_bidiagonal.
void hmatrix_vector_multiplies(RandomAccessIterator2d M_up, RandomAccessIterator2d M_bot, RandomAccessIterator1 V_first, RandomAccessIterator1 V_last, RandomAccessIterator2 R_first, RandomAccessIterator2 R_last)
Computes the hermitian matrix left multiplication of a vector: .
bool is_upper_triangular(MatrixIterator1 A_up, MatrixIterator1 A_bot, const typename slip::lin_alg_traits< typename std::iterator_traits< MatrixIterator1 >::value_type >::value_type tol=slip::epsilon< typename std::iterator_traits< MatrixIterator1 >::value_type >())
Test if a matrix is upper_triangular.
void matrix_vector_multiplies(RandomAccessIterator2d M_upper_left, RandomAccessIterator2d M_bottom_right, RandomAccessIterator1 first1, RandomAccessIterator1 last1, RandomAccessIterator2 result_first, RandomAccessIterator2 result_last)
Computes the multiplication of a Matrix and a Vector: Result=MV.
void upper_triangular_inv(MatrixIterator1 A_up, MatrixIterator1 A_bot, MatrixIterator2 Ainv_up, MatrixIterator2 Ainv_bot, typename slip::lin_alg_traits< typename MatrixIterator1::value_type >::value_type precision=typename slip::lin_alg_traits< typename MatrixIterator1::value_type >::value_type(1.0E-6))
Invert an upper triangular Matrix .
void lower_triangular_inv(MatrixIterator1 A_up, MatrixIterator1 A_bot, MatrixIterator2 Ainv_up, MatrixIterator2 Ainv_bot, typename slip::lin_alg_traits< typename MatrixIterator1::value_type >::value_type precision=typename slip::lin_alg_traits< typename MatrixIterator1::value_type >::value_type(1.0E-6))
Invert a lower triangular Matrix .
void thomas_inv(RandomAccessIterator1 diag_first, RandomAccessIterator1 diag_last, RandomAccessIterator1 up_diag_first, RandomAccessIterator1 up_diag_last, RandomAccessIterator1 low_diag_first, RandomAccessIterator1 low_diag_last, RandomAccessIterator2d Ainv_up, RandomAccessIterator2d Ainv_bot, typename slip::lin_alg_traits< typename std::iterator_traits< RandomAccessIterator1 >::value_type >::value_type precision=typename slip::lin_alg_traits< typename std::iterator_traits< RandomAccessIterator1 >::value_type >::value_type(1.0E-6))
Invert a tridiagonal squared matrix A with the Thomas method .
void upper_triangular_solve(MatrixIterator U_up, MatrixIterator U_bot, RandomAccessIterator1 X_first, RandomAccessIterator1 X_last, RandomAccessIterator2 B_first, RandomAccessIterator2 B_last, typename slip::lin_alg_traits< typename MatrixIterator::value_type >::value_type precision)
Solve the linear system U*X=B when U is upper triangular .
void iota(ForwardIterator first, ForwardIterator last, T value, T step=T(1))
Iota assigns sequential increasing values based on a predefined step to a range. That is...
void thomas_solve(RandomAccessIterator1 diag_first, RandomAccessIterator1 diag_last, RandomAccessIterator1 up_diag_first, RandomAccessIterator1 up_diag_last, RandomAccessIterator1 low_diag_first, RandomAccessIterator1 low_diag_last, RandomAccessIterator2 X_first, RandomAccessIterator2 X_last, RandomAccessIterator3 B_first, RandomAccessIterator3 B_last, typename slip::lin_alg_traits< typename std::iterator_traits< RandomAccessIterator1 >::value_type >::value_type precision=typename slip::lin_alg_traits< typename std::iterator_traits< RandomAccessIterator1 >::value_type >::value_type(1.0E-6))
Solve the tridiagonal system A*X=B with the Thomas method .
col_iterator col_end(const size_type col)
Returns a read/write iterator that points one past the end element of the column column in the Matrix...
bool is_upper_hessenberg(MatrixIterator1 A_up, MatrixIterator1 A_bot, const typename slip::lin_alg_traits< typename std::iterator_traits< MatrixIterator1 >::value_type >::value_type tol=slip::epsilon< typename std::iterator_traits< MatrixIterator1 >::value_type >())
Test if a matrix is upper_hessenberg.
_Tp operator()(const _Tp &z1, const _Tp &z2) const
void real(const Matrix1 &C, Matrix2 &R)
Extract the real Matrix of a complex Matrix. .
HyperVolume< T > abs(const HyperVolume< T > &M)
void lower_triangular_solve(MatrixIterator L_up, MatrixIterator L_bot, RandomAccessIterator1 X_first, RandomAccessIterator1 X_last, RandomAccessIterator2 B_first, RandomAccessIterator2 B_last, typename slip::lin_alg_traits< typename MatrixIterator::value_type >::value_type precision)
Solve the linear system L*X=B when L is lower triangular .
void matrix_shift(RandomAccessIterator2d1 M_upper_left, RandomAccessIterator2d1 M_bottom_right, const T &lambda, RandomAccessIterator2d2 R_upper_left, RandomAccessIterator2d2 R_bottom_right)
Computes with In the identity matrix.
HyperVolume< T > sin(const HyperVolume< T > &M)
void unit_upper_triangular_solve(MatrixIterator U_up, MatrixIterator U_bot, RandomAccessIterator1 X_first, RandomAccessIterator1 X_last, RandomAccessIterator2 B_first, RandomAccessIterator2 B_last)
Solve the linear system U*X=B when U is unit upper triangular .
void left_householder_update(RandomAccessIterator V_first, RandomAccessIterator V_last, MatrixIterator1 M_up, MatrixIterator1 M_bot)
Left multiplies the Householder matrix P with the matrix M: .
Provides a class to manipulate 1d dynamic and generic arrays.
HyperVolume< T > cos(const HyperVolume< T > &M)
int partial_pivot(MatrixIterator M_up, MatrixIterator M_bot)
Returns the partial pivot of a 2d range.
void unit_upper_band_solve(MatrixIterator U_up, MatrixIterator U_bot, int q, RandomAccessIterator1 X_first, RandomAccessIterator1 X_last, RandomAccessIterator2 B_first, RandomAccessIterator2 B_last, typename slip::lin_alg_traits< typename MatrixIterator::value_type >::value_type precision)
Solve the linear system U*X=B when U is unit q width upper banded .
void complex_left_givens(Matrix &M, const SizeType &row1, const SizeType &row2, const Complex &sinus, const typename Complex::value_type &cosinus, const SizeType &col1, const SizeType &col2)
Apply complex left Givens rotation multiplication.
void rank1_update(RandomAccessIterator2d1 A_up, RandomAccessIterator2d1 A_bot, const T &alpha, RandomAccessIterator1 X_first, RandomAccessIterator1 X_last, RandomAccessIterator2 Y_first, RandomAccessIterator2 Y_last)
Computes .
void tridiagonal_cholesky_solve(RandomAccessIterator1 diag_first, RandomAccessIterator1 diag_last, RandomAccessIterator1 up_diag_first, RandomAccessIterator1 up_diag_last, RandomAccessIterator2 X_first, RandomAccessIterator2 X_last, RandomAccessIterator3 B_first, RandomAccessIterator3 B_last)
Solve the tridiagonal symmetric positive definite system T*X=B with the Cholesky method where: is t...
void gen_matrix_vector_multiplies(RandomAccessIterator2d M_up, RandomAccessIterator2d M_bot, RandomAccessIterator1 V_first, RandomAccessIterator1 V_last, RandomAccessIterator2 Y_first, RandomAccessIterator2 Y_last)
Computes the generalised multiplication of a Matrix and a Vector: computes the update ...
bool is_diagonal(MatrixIterator1 A_up, MatrixIterator1 A_bot, const typename slip::lin_alg_traits< typename std::iterator_traits< MatrixIterator1 >::value_type >::value_type tol=slip::epsilon< typename std::iterator_traits< MatrixIterator1 >::value_type >())
Test if a matrix is diagonal.
const std::string SINGULAR_MATRIX_ERROR
void right_givens(Matrix &M, const SizeType &col1, const SizeType &col2, const Real &sinus, const Real &cosinus, const SizeType &row1, const SizeType &row2)
Apply right Givens rotation multiplication.
void left_givens(Matrix &M, const SizeType &row1, const SizeType &row2, const Real &sinus, const Real &cosinus, const SizeType &col1, const SizeType &col2)
Apply left Givens rotation multiplication.
iterator end()
Returns a read/write iterator that points one past the last element in the Array. Iteration is done i...
void upper_bidiagonal_inv(RandomAccessIterator1 diag_first, RandomAccessIterator1 diag_last, RandomAccessIterator1 up_diag_first, RandomAccessIterator1 up_diag_last, RandomAccessIterator2d Ainv_up, RandomAccessIterator2d Ainv_bot, typename slip::lin_alg_traits< typename std::iterator_traits< RandomAccessIterator1 >::value_type >::value_type precision=typename slip::lin_alg_traits< typename std::iterator_traits< RandomAccessIterator1 >::value_type >::value_type(1.0E-6))
Invert an upper bidiagonal squared matrix .
bool gauss_solve_with_filling(const Matrix &M, Vector1 &X, const Vector2 &B, typename slip::lin_alg_traits< typename Matrix::value_type >::value_type precision)
Solve the linear system M*X=B with the Gauss pivot method, the null pivot are replaced by precision...
size_type size() const
Returns the number of elements in the Vector.
slip::lin_alg_traits< typename std::iterator_traits< RandomAccessIterator2d >::value_type >::value_type row_norm(RandomAccessIterator2d upper_left, RandomAccessIterator2d bottom_right)
Computes the row norm ( ) of a 2d range.
void upper_bidiagonal_solve(RandomAccessIterator1 diag_first, RandomAccessIterator1 diag_last, RandomAccessIterator1 up_diag_first, RandomAccessIterator1 up_diag_last, RandomAccessIterator2 X_first, RandomAccessIterator2 X_last, RandomAccessIterator3 B_first, RandomAccessIterator3 B_last, typename slip::lin_alg_traits< typename std::iterator_traits< RandomAccessIterator1 >::value_type >::value_type precision=typename slip::lin_alg_traits< typename std::iterator_traits< RandomAccessIterator1 >::value_type >::value_type(1.0E-6))
solve Ax = B with A upper bidiagonal
void multiplies(InputIterator1 __first1, InputIterator1 __last1, InputIterator2 __first2, OutputIterator __result)
Computes the pointwise product of two ranges.
void lower_bidiagonal_inv(RandomAccessIterator1 diag_first, RandomAccessIterator1 diag_last, RandomAccessIterator1 low_diag_first, RandomAccessIterator1 low_diag_last, RandomAccessIterator2d Ainv_up, RandomAccessIterator2d Ainv_bot, typename slip::lin_alg_traits< typename std::iterator_traits< RandomAccessIterator1 >::value_type >::value_type precision=typename slip::lin_alg_traits< typename std::iterator_traits< RandomAccessIterator1 >::value_type >::value_type(1.0E-6))
Invert a lower bidiagonal matrix: .
void vector_scalar_multiplies(RandomAccessIterator1 V_first, RandomAccessIterator1 V_last, const T &scal, RandomAccessIterator2 result_first)
Computes the multiplication of a vector V by a scalar scal.
int pivot_max(MatrixIterator M_up, MatrixIterator M_bot)
Returns the row position of the maximum partial pivot of a 2d range.
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.
Provides some macros which are used for using complex as real.
void cholesky_inv(MatrixIterator1 A_up, MatrixIterator1 A_bot, MatrixIterator2 Ainv_up, MatrixIterator2 Ainv_bot, typename slip::lin_alg_traits< typename MatrixIterator1::value_type >::value_type precision=typename slip::lin_alg_traits< typename MatrixIterator1::value_type >::value_type(1.0E-6))
cholesky inverse of a square hermitian positive definite Matrix A.
Numerical Vector class. This container statisfies the RandomAccessContainer concepts of the Standard ...
slip::lin_alg_traits< typename std::iterator_traits< RandomAccessIterator2d >::value_type >::value_type frobenius_norm(RandomAccessIterator2d upper_left, RandomAccessIterator2d bottom_right)
Computes the Frobenius norm ( ) of a 2d range.
Computes the complex operation: ( ) between two complex values z1 and z2.
void cholesky_solve(MatrixIterator A_up, MatrixIterator A_bot, RandomAccessIterator1 X_first, RandomAccessIterator1 X_last, RandomAccessIterator2 B_first, RandomAccessIterator2 B_last, typename slip::lin_alg_traits< typename MatrixIterator::value_type >::value_type precision=typename slip::lin_alg_traits< typename MatrixIterator::value_type >::value_type(1.0E-6))
cholesky solve of system AX = B with A a square hermitian positive definite Matrix.
bool is_lower_triangular(MatrixIterator1 A_up, MatrixIterator1 A_bot, const typename slip::lin_alg_traits< typename std::iterator_traits< MatrixIterator1 >::value_type >::value_type tol=slip::epsilon< typename std::iterator_traits< MatrixIterator1 >::value_type >())
Test if a matrix is lower_triangular.
void set_coord(const CoordType &dx1, const CoordType &dx2)
Accessor/Mutator of the coordinates of DPoint2d.
void housegen(VectorIterator1 a_begin, VectorIterator1 a_end, VectorIterator2 u_begin, VectorIterator2 u_end, typename std::iterator_traits< VectorIterator1 >::value_type &nu)
Compute the Householder vector u of a vector a.
Provides some mathematical functors and constants.
HyperVolume< T > sqrt(const HyperVolume< T > &M)
void unit_lower_triangular_solve(MatrixIterator L_up, MatrixIterator L_bot, RandomAccessIterator1 X_first, RandomAccessIterator1 X_last, RandomAccessIterator2 B_first, RandomAccessIterator2 B_last)
Solve the linear system L*X=B when L is unit lower triangular .
Matrix identity(const std::size_t nr, const std::size_t nc)
Returns an identity matrix which dimensions are nr*nc.
void unit_lower_bidiagonal_solve(RandomAccessIterator1 low_diag_first, RandomAccessIterator1 low_diag_last, RandomAccessIterator2 X_first, RandomAccessIterator2 X_last, RandomAccessIterator3 B_first, RandomAccessIterator3 B_last)
solve Ax = B with A unit lower bidiagonal
void matrix_scalar_multiplies(RandomAccessIterator2d1 M_upper_left, RandomAccessIterator2d1 M_bottom_right, const T &scal, RandomAccessIterator2d2 R_upper_left, RandomAccessIterator2d2 R_bottom_right)
Computes the multiplication of a Matrix by a scalar R = M*scal.
void gen_matrix_matrix_multiplies(RandomAccessIterator2d1 A_up, RandomAccessIterator2d1 A_bot, RandomAccessIterator2d2 B_up, RandomAccessIterator2d2 B_bot, RandomAccessIterator2d3 C_up, RandomAccessIterator2d3 C_bot)
Computes the generalized multiplication of a two Matrix: .
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...
void matrix_matrix_multiplies(MatrixIterator1 M1_up, MatrixIterator1 M1_bot, MatrixIterator2 M2_up, MatrixIterator2 M2_bot, MatrixIterator3 R_up, MatrixIterator3 R_bot)
Computes the matrix matrix multiplication of 2 2d ranges.
bool is_identity(const Matrix &A, const typename slip::lin_alg_traits< typename Matrix::value_type >::value_type tol=slip::epsilon< typename Matrix::value_type >())
Test if a matrix is identity.
Numerical matrix class. This container statisfies the BidirectionnalContainer concepts of the STL...
void unit_upper_bidiagonal_solve(RandomAccessIterator1 up_diag_first, RandomAccessIterator1 up_diag_last, RandomAccessIterator2 X_first, RandomAccessIterator2 X_last, RandomAccessIterator3 B_first, RandomAccessIterator3 B_last)
solve Ax = B with A unit upper bidiagonal
Provides some algorithms to computes arithmetical operations on ranges.
Provides SLIP error messages.
bool gauss_solve(const Matrix &M, Vector1 &X, const Vector2 &B, typename slip::lin_alg_traits< typename Matrix::value_type >::value_type precision)
Solve the linear system M*X=B using the Gauss elemination partial pivoting.
void left_householder_accumulate(const Matrix1 &M, const Vector1 &V0, Matrix2 &Q)
Computes Q = Q1Q2...Qn from the inplace Householder QR decomposition.
void tridiagonal_cholesky_inv(RandomAccessIterator1 diag_first, RandomAccessIterator1 diag_last, RandomAccessIterator1 up_diag_first, RandomAccessIterator1 up_diag_last, RandomAccessIterator2d Ainv_up, RandomAccessIterator2d Ainv_bot)
Invert the tridiagonal symmetric positive definite system T: where: is the conjugate of and ...
const std::string POSITIVE_DEFINITE_MATRIX_ERROR
Matrix1::value_type lu_det(const Matrix1 &M)
Computes the determinant of a matrix using LU decomposition.
void inverse(const Matrix1 &M, const std::size_t nr1, const std::size_t nc1, Matrix2 &IM, const std::size_t nr2, const std::size_t nc2)
Computes the inverse of a matrix using gaussian elimination.
size_type rows() const
Returns the number of rows (first dimension size) in the Matrix.
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 tridiagonal_lu(RandomAccessIterator1 diag_first, RandomAccessIterator1 diag_last, RandomAccessIterator1 up_diag_first, RandomAccessIterator1 up_diag_last, RandomAccessIterator1 low_diag_first, RandomAccessIterator1 low_diag_last, RandomAccessIterator2 L_low_first, RandomAccessIterator2 L_low_last, RandomAccessIterator3 U_up_first, RandomAccessIterator3 U_up_last, typename slip::lin_alg_traits< typename std::iterator_traits< RandomAccessIterator1 >::value_type >::value_type precision=typename slip::lin_alg_traits< typename std::iterator_traits< RandomAccessIterator1 >::value_type >::value_type(1.0E-6))
Computes the LU decomposition for a tridiagonal matrix .
col_iterator col_begin(const size_type col)
Returns a read/write iterator that points to the first element of the column column in the Matrix...
void upper_band_solve(MatrixIterator U_up, MatrixIterator U_bot, int q, RandomAccessIterator1 X_first, RandomAccessIterator1 X_last, RandomAccessIterator2 B_first, RandomAccessIterator2 B_last, typename slip::lin_alg_traits< typename MatrixIterator::value_type >::value_type precision)
Solve the linear system U*X=B when U is q width upper banded .
void householder_hessenberg(Matrix1 &M)
Householder Hessenberg reduction of the square matrix M. The result is overwritten in M...
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: .
void get_diagonal(const Container2d &container, RandomAccessIterator1 diag_first, RandomAccessIterator1 diag_last, const int diag_number=0)
Get the diagonal diag_number of a 2d container.
void hvector_matrix_multiplies(RandomAccessIterator1 V_first, RandomAccessIterator1 V_last, RandomAccessIterator2d M_up, RandomAccessIterator2d M_bot, RandomAccessIterator2 result_first, RandomAccessIterator2 result_last)
Computes the hermitian left multiplication: .
bool is_symmetric(MatrixIterator1 A_up, MatrixIterator1 A_bot, const typename slip::lin_alg_traits< typename std::iterator_traits< MatrixIterator1 >::value_type >::value_type tol=slip::epsilon< typename std::iterator_traits< MatrixIterator1 >::value_type >())
Test if a matrix is symmetric.
bool is_lower_hessenberg(MatrixIterator1 A_up, MatrixIterator1 A_bot, const typename slip::lin_alg_traits< typename std::iterator_traits< MatrixIterator1 >::value_type >::value_type tol=slip::epsilon< typename std::iterator_traits< MatrixIterator1 >::value_type >())
Test if a matrix is lower_hessenberg.
std::iterator_traits< RandomAccessIterator2 >::value_type gen_inner_product(RandomAccessIterator1 first1, RandomAccessIterator1 last1, RandomAccessIterator2d A_upper_left, RandomAccessIterator2d A_bottom_right, RandomAccessIterator2 first2, RandomAccessIterator2 last2, typename std::iterator_traits< RandomAccessIterator2 >::value_type init=typename std::iterator_traits< RandomAccessIterator2 >::value_type())
Computes the generalized inner_product of two ranges: .
void tvector_matrix_multiplies(RandomAccessIterator1 V_first, RandomAccessIterator1 V_last, RandomAccessIterator2d M_up, RandomAccessIterator2d M_bot, RandomAccessIterator2 result_first, RandomAccessIterator2 result_last)
Computes the transpose left multiplication: .
std::iterator_traits< RandomAccessIterator1 >::value_type rayleigh(RandomAccessIterator1 first1, RandomAccessIterator1 last1, RandomAccessIterator2d A_upper_left, RandomAccessIterator2d A_bottom_right)
Computes the rayleigh coefficient of a vector x: .
Vector1::value_type inner_product(const Vector1 &V1, const Vector2 &V2)
Computes the inner_product of two ranges X and Y: .
void cholesky(const Matrix1 &A, Matrix2 &L, Matrix3 <)
cholesky decomposition of a square hermitian positive definite Matrix. with L a lower triangular mat...
Provides some algorithms to apply C like functions to ranges.
void conj_vector_scalar_multiplies(RandomAccessIterator1 V_first, RandomAccessIterator1 V_last, const T &scal, RandomAccessIterator2 result_first)
Computes the multiplication of a vector by a scalar scal.
void transpose(const Matrix1 &M, const std::size_t nr1, const std::size_t nc1, Matrix2 &TM, const std::size_t nr2, const std::size_t nc2)
Computes the transpose of a matrix .
void LDLT_decomposition(Container2d &A)
in place LU decomposition for symmetric matrix
slip::lin_alg_traits< typename std::iterator_traits< RandomAccessIterator2d >::value_type >::value_type col_norm(RandomAccessIterator2d upper_left, RandomAccessIterator2d bottom_right)
Computes the column norm ( ) of a 2d range.
void complex_right_givens(Matrix &M, const SizeType &col1, const SizeType &col2, const Complex &sinus, const typename Complex::value_type &cosinus, const SizeType &row1, const SizeType &row2)
Apply complex right Givens rotation multiplication.
void rank1_tensorial_product(RandomAccessIterator1 base1_first, RandomAccessIterator1 base1_end, RandomAccessIterator2 base2_first, RandomAccessIterator2 base2_end, RandomAccessIterator2d matrix_upper_left, RandomAccessIterator2d matrix_bottom_right)
Computes the tensorial product of two rank one tensors it provides a rank2 tensor (Container2d) of s...
iterator begin()
Returns a read/write iterator that points to the first element in the Array2d. Iteration is done in o...
size_type dim2() const
Returns the number of columns (second dimension size) in the Matrix.
void tridiagonal_cholesky(RandomAccessIterator1 diag_first, RandomAccessIterator1 diag_last, RandomAccessIterator1 up_diag_first, RandomAccessIterator1 up_diag_last, RandomAccessIterator2 R_diag_first, RandomAccessIterator2 R_diag_last, RandomAccessIterator3 R_low_first, RandomAccessIterator3 R_low_last)
Tridiagonal symmetric positive decomposition where: is the conjugate of and .
void hermitian_transpose(const Matrix1 &M, Matrix2 &TM)
Computes the hermitian transpose of a matrix which is the transpose of the conjugate.
void unit_lower_band_solve(MatrixIterator L_up, MatrixIterator L_bot, int p, RandomAccessIterator1 X_first, RandomAccessIterator1 X_last, RandomAccessIterator2 B_first, RandomAccessIterator2 B_last)
Solve the linear system L*X=B when L is unit p lower banded .
This is a linear (one-dimensional) dynamic template container. This container statisfies the RandomAc...
bool is_hermitian(MatrixIterator1 A_up, MatrixIterator1 A_bot, const typename slip::lin_alg_traits< typename std::iterator_traits< MatrixIterator1 >::value_type >::value_type tol=slip::epsilon< typename std::iterator_traits< MatrixIterator1 >::value_type >())
Test if a matrix is hermitian.
void hilbert(Matrix &A)
Replaces A with the Hilbert matrix: .
void aXpY(const AT &a, RandomAccessIterator1 first1, RandomAccessIterator1 last1, RandomAccessIterator2 first2)
Computes the saxpy ("scalar a x plus b") for each element of two ranges x and y.
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...
void toeplitz(RandomAccessIterator first, RandomAccessIterator last, Matrix &A)
Constructs the Toeplitz matrix from given a range.
void complex_givens_sin_cos(const Complex &xi, const Complex &xk, Complex &sin, typename Complex::value_type &cos)
Computes the complex Givens sinus and cosinus. with .
void apply(InputIterator first, InputIterator last, OutputIterator result, typename std::iterator_traits< OutputIterator >::value_type(*function)(typename std::iterator_traits< InputIterator >::value_type))
Applies a C-function to each element of a range.
This is a two-dimensional dynamic and generic container. This container statisfies the Bidirectionnal...
T & max(const GrayscaleImage< T > &M1)
Returns the max element of a GrayscaleImage.
void unit_lower_bidiagonal_inv(RandomAccessIterator1 low_diag_first, RandomAccessIterator1 low_diag_last, RandomAccessIterator2d Ainv_up, RandomAccessIterator2d Ainv_bot)
Invert a lower unit bidiagonal matrix: .
iterator begin()
Returns a read/write iterator that points to the first element in the Vector. Iteration is done in or...
void outer_product(VectorIterator1 V_begin, VectorIterator1 V_end, VectorIterator2 W_begin, VectorIterator2 W_end, MatrixIterator R_up, MatrixIterator R_bot)
Computes the hermitian outer product of the vector V and the transpose of the conjugate of the vector...
Computes the saxpy ("scalar a x plus b") operation: ( ) between two values.
Provides some algorithms to compute norms.