triang.h
上传用户:kellyonhid
上传日期:2013-10-12
资源大小:932k
文件大小:13k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. // Template Numerical Toolkit (TNT) for Linear Algebra
  2. //
  3. // BETA VERSION INCOMPLETE AND SUBJECT TO CHANGE
  4. // Please see http://math.nist.gov/tnt for updates
  5. //
  6. // R. Pozo
  7. // Mathematical and Computational Sciences Division
  8. // National Institute of Standards and Technology
  9. // Triangular Matrices (Views and Adpators)
  10. #ifndef TRIANG_H
  11. #define TRIANG_H
  12. // default to use lower-triangular portions of arrays
  13. // for symmetric matrices.
  14. template <class Matrix>
  15. class LowerTriangularView
  16. {
  17.     protected:
  18.         const Matrix  &A_;
  19.         const typename Matrix::element_type zero_;
  20.     public:
  21.     typedef typename Matrix::const_reference const_reference;
  22.     typedef const typename Matrix::element_type element_type;
  23.     typedef const typename Matrix::element_type value_type;
  24.     typedef element_type T;
  25.     Subscript dim(Subscript d) const {  return A_.dim(d); }
  26.     Subscript lbound() const { return A_.lbound(); }
  27.     Subscript num_rows() const { return A_.num_rows(); }
  28.     Subscript num_cols() const { return A_.num_cols(); }
  29.     
  30.     
  31.     // constructors
  32.     LowerTriangularView(const Matrix &A) : A_(A),  zero_(0) {}
  33.     inline const_reference get(Subscript i, Subscript j) const
  34.     { 
  35. #ifdef TNT_BOUNDS_CHECK
  36.         assert(lbound()<=i);
  37.         assert(i<=A_.num_rows() + lbound() - 1);
  38.         assert(lbound()<=j);
  39.         assert(j<=A_.num_cols() + lbound() - 1);
  40. #endif
  41.         if (i<j) 
  42.             return zero_;
  43.         else
  44.             return A_(i,j);
  45.     }
  46.     inline const_reference operator() (Subscript i, Subscript j) const
  47.     {
  48. #ifdef TNT_BOUNDS_CHECK
  49.         assert(lbound()<=i);
  50.         assert(i<=A_.num_rows() + lbound() - 1);
  51.         assert(lbound()<=j);
  52.         assert(j<=A_.num_cols() + lbound() - 1);
  53. #endif
  54.         if (i<j) 
  55.             return zero_;
  56.         else
  57.             return A_(i,j);
  58.     }
  59. #ifdef TNT_USE_REGIONS 
  60.     typedef const_Region2D<LowerTriangularView<Matrix>,T > 
  61.                     const_Region;
  62.     const_Region operator()(const Index1D &I,
  63.             const Index1D &J) const
  64.     {
  65.         return const_Region(*this, I, J);
  66.     }
  67.     const_Region operator()(Subscript i1, Subscript i2,
  68.             Subscript j1, Subscript j2) const
  69.     {
  70.         return const_Region(*this, i1, i2, j1, j2);
  71.     }
  72. #endif
  73. // TNT_USE_REGIONS
  74. };
  75. /* *********** Lower_triangular_view() algorithms ****************** */
  76. template <class Matrix, class Vector>
  77. Vector matmult(const LowerTriangularView<Matrix> &A, Vector &x)
  78. {
  79.     Subscript M = A.num_rows();
  80.     Subscript N = A.num_cols();
  81.     assert(N == x.dim());
  82.     Subscript i, j;
  83.     typename Vector::element_type sum=0.0;
  84.     Vector result(M);
  85.     Subscript start = A.lbound();
  86.     Subscript Mend = M + A.lbound() -1 ;
  87.     for (i=start; i<=Mend; i++)
  88.     {
  89.         sum = 0.0;
  90.         for (j=start; j<=i; j++)
  91.             sum = sum + A(i,j)*x(j);
  92.         result(i) = sum;
  93.     }
  94.     return result;
  95. }
  96. template <class Matrix, class Vector>
  97. inline Vector operator*(const LowerTriangularView<Matrix> &A, Vector &x)
  98. {
  99.     return matmult(A,x);
  100. }
  101. template <class Matrix>
  102. class UnitLowerTriangularView
  103. {
  104.     protected:
  105.         const Matrix  &A_;
  106.         const typename Matrix::element_type zero;
  107.         const typename Matrix::element_type one;
  108.     public:
  109.     typedef typename Matrix::const_reference const_reference;
  110.     typedef typename Matrix::element_type element_type;
  111.     typedef typename Matrix::element_type value_type;
  112.     typedef element_type T;
  113.     Subscript lbound() const { return 1; }
  114.     Subscript dim(Subscript d) const {  return A_.dim(d); }
  115.     Subscript num_rows() const { return A_.num_rows(); }
  116.     Subscript num_cols() const { return A_.num_cols(); }
  117.     
  118.     // constructors
  119.     UnitLowerTriangularView(const Matrix &A) : A_(A), zero(0), one(1) {}
  120.     inline const_reference get(Subscript i, Subscript j) const
  121.     { 
  122. #ifdef TNT_BOUNDS_CHECK
  123.         assert(1<=i);
  124.         assert(i<=A_.dim(1));
  125.         assert(1<=j);
  126.         assert(j<=A_.dim(2));
  127.         assert(0<=i && i<A_.dim(0) && 0<=j && j<A_.dim(1));
  128. #endif
  129.         if (i>j)
  130.             return A_(i,j);
  131.         else if (i==j)
  132.             return one;
  133.         else 
  134.             return zero;
  135.     }
  136.     inline const_reference operator() (Subscript i, Subscript j) const
  137.     {
  138. #ifdef TNT_BOUNDS_CHECK
  139.         assert(1<=i);
  140.         assert(i<=A_.dim(1));
  141.         assert(1<=j);
  142.         assert(j<=A_.dim(2));
  143. #endif
  144.         if (i>j)
  145.             return A_(i,j);
  146.         else if (i==j)
  147.             return one;
  148.         else 
  149.             return zero;
  150.     }
  151. #ifdef TNT_USE_REGIONS 
  152.   // These are the "index-aware" features
  153.     typedef const_Region2D<UnitLowerTriangularView<Matrix>,T > 
  154.                     const_Region;
  155.     const_Region operator()(const Index1D &I,
  156.             const Index1D &J) const
  157.     {
  158.         return const_Region(*this, I, J);
  159.     }
  160.     const_Region operator()(Subscript i1, Subscript i2,
  161.             Subscript j1, Subscript j2) const
  162.     {
  163.         return const_Region(*this, i1, i2, j1, j2);
  164.     }
  165. #endif
  166. // TNT_USE_REGIONS
  167. };
  168. template <class Matrix>
  169. LowerTriangularView<Matrix> Lower_triangular_view(
  170.     const Matrix &A)
  171. {
  172.     return LowerTriangularView<Matrix>(A);
  173. }
  174. template <class Matrix>
  175. UnitLowerTriangularView<Matrix> Unit_lower_triangular_view(
  176.     const Matrix &A)
  177. {
  178.     return UnitLowerTriangularView<Matrix>(A);
  179. }
  180. template <class Matrix, class Vector>
  181. Vector matmult(const UnitLowerTriangularView<Matrix> &A, Vector &x)
  182. {
  183.     Subscript M = A.num_rows();
  184.     Subscript N = A.num_cols();
  185.     assert(N == x.dim());
  186.     Subscript i, j;
  187.     typename Vector::element_type sum=0.0;
  188.     Vector result(M);
  189.     Subscript start = A.lbound();
  190.     Subscript Mend = M + A.lbound() -1 ;
  191.     for (i=start; i<=Mend; i++)
  192.     {
  193.         sum = 0.0;
  194.         for (j=start; j<i; j++)
  195.             sum = sum + A(i,j)*x(j);
  196.         result(i) = sum + x(i);
  197.     }
  198.     return result;
  199. }
  200. template <class Matrix, class Vector>
  201. inline Vector operator*(const UnitLowerTriangularView<Matrix> &A, Vector &x)
  202. {
  203.     return matmult(A,x);
  204. }
  205. //********************** Algorithms *************************************
  206. template <class Matrix>
  207. ostream& operator<<(ostream &s, const LowerTriangularView<Matrix>&A)
  208. {
  209.     Subscript M=A.num_rows();
  210.     Subscript N=A.num_cols();
  211.     s << M << " " << N << endl;
  212.     for (Subscript i=1; i<=M; i++)
  213.     {
  214.         for (Subscript j=1; j<=N; j++)
  215.         {
  216.             s << A(i,j) << " ";
  217.         }
  218.         s << endl;
  219.     }
  220.     return s;
  221. }
  222. template <class Matrix>
  223. ostream& operator<<(ostream &s, const UnitLowerTriangularView<Matrix>&A)
  224. {
  225.     Subscript M=A.num_rows();
  226.     Subscript N=A.num_cols();
  227.     s << M << " " << N << endl;
  228.     for (Subscript i=1; i<=M; i++)
  229.     {
  230.         for (Subscript j=1; j<=N; j++)
  231.         {
  232.             s << A(i,j) << " ";
  233.         }
  234.         s << endl;
  235.     }
  236.     return s;
  237. }
  238. // ******************* Upper Triangular Section **************************
  239. template <class Matrix>
  240. class UpperTriangularView
  241. {
  242.     protected:
  243.         const Matrix  &A_;
  244.         const typename Matrix::element_type zero_;
  245.     public:
  246.     typedef typename Matrix::const_reference const_reference;
  247.     typedef const typename Matrix::element_type element_type;
  248.     typedef const typename Matrix::element_type value_type;
  249.     typedef element_type T;
  250.     Subscript dim(Subscript d) const {  return A_.dim(d); }
  251.     Subscript lbound() const { return A_.lbound(); }
  252.     Subscript num_rows() const { return A_.num_rows(); }
  253.     Subscript num_cols() const { return A_.num_cols(); }
  254.     
  255.     
  256.     // constructors
  257.     UpperTriangularView(const Matrix &A) : A_(A),  zero_(0) {}
  258.     inline const_reference get(Subscript i, Subscript j) const
  259.     { 
  260. #ifdef TNT_BOUNDS_CHECK
  261.         assert(lbound()<=i);
  262.         assert(i<=A_.num_rows() + lbound() - 1);
  263.         assert(lbound()<=j);
  264.         assert(j<=A_.num_cols() + lbound() - 1);
  265. #endif
  266.         if (i>j) 
  267.             return zero_;
  268.         else
  269.             return A_(i,j);
  270.     }
  271.     inline const_reference operator() (Subscript i, Subscript j) const
  272.     {
  273. #ifdef TNT_BOUNDS_CHECK
  274.         assert(lbound()<=i);
  275.         assert(i<=A_.num_rows() + lbound() - 1);
  276.         assert(lbound()<=j);
  277.         assert(j<=A_.num_cols() + lbound() - 1);
  278. #endif
  279.         if (i>j) 
  280.             return zero_;
  281.         else
  282.             return A_(i,j);
  283.     }
  284. #ifdef TNT_USE_REGIONS 
  285.     typedef const_Region2D<UpperTriangularView<Matrix>,T > 
  286.                     const_Region;
  287.     const_Region operator()(const Index1D &I,
  288.             const Index1D &J) const
  289.     {
  290.         return const_Region(*this, I, J);
  291.     }
  292.     const_Region operator()(Subscript i1, Subscript i2,
  293.             Subscript j1, Subscript j2) const
  294.     {
  295.         return const_Region(*this, i1, i2, j1, j2);
  296.     }
  297. #endif
  298. // TNT_USE_REGIONS
  299. };
  300. /* *********** Upper_triangular_view() algorithms ****************** */
  301. template <class Matrix, class Vector>
  302. Vector matmult(const UpperTriangularView<Matrix> &A, Vector &x)
  303. {
  304.     Subscript M = A.num_rows();
  305.     Subscript N = A.num_cols();
  306.     assert(N == x.dim());
  307.     Subscript i, j;
  308.     typename Vector::element_type sum=0.0;
  309.     Vector result(M);
  310.     Subscript start = A.lbound();
  311.     Subscript Mend = M + A.lbound() -1 ;
  312.     for (i=start; i<=Mend; i++)
  313.     {
  314.         sum = 0.0;
  315.         for (j=i; j<=N; j++)
  316.             sum = sum + A(i,j)*x(j);
  317.         result(i) = sum;
  318.     }
  319.     return result;
  320. }
  321. template <class Matrix, class Vector>
  322. inline Vector operator*(const UpperTriangularView<Matrix> &A, Vector &x)
  323. {
  324.     return matmult(A,x);
  325. }
  326. template <class Matrix>
  327. class UnitUpperTriangularView
  328. {
  329.     protected:
  330.         const Matrix  &A_;
  331.         const typename Matrix::element_type zero;
  332.         const typename Matrix::element_type one;
  333.     public:
  334.     typedef typename Matrix::const_reference const_reference;
  335.     typedef typename Matrix::element_type element_type;
  336.     typedef typename Matrix::element_type value_type;
  337.     typedef element_type T;
  338.     Subscript lbound() const { return 1; }
  339.     Subscript dim(Subscript d) const {  return A_.dim(d); }
  340.     Subscript num_rows() const { return A_.num_rows(); }
  341.     Subscript num_cols() const { return A_.num_cols(); }
  342.     
  343.     // constructors
  344.     UnitUpperTriangularView(const Matrix &A) : A_(A), zero(0), one(1) {}
  345.     inline const_reference get(Subscript i, Subscript j) const
  346.     { 
  347. #ifdef TNT_BOUNDS_CHECK
  348.         assert(1<=i);
  349.         assert(i<=A_.dim(1));
  350.         assert(1<=j);
  351.         assert(j<=A_.dim(2));
  352.         assert(0<=i && i<A_.dim(0) && 0<=j && j<A_.dim(1));
  353. #endif
  354.         if (i<j)
  355.             return A_(i,j);
  356.         else if (i==j)
  357.             return one;
  358.         else 
  359.             return zero;
  360.     }
  361.     inline const_reference operator() (Subscript i, Subscript j) const
  362.     {
  363. #ifdef TNT_BOUNDS_CHECK
  364.         assert(1<=i);
  365.         assert(i<=A_.dim(1));
  366.         assert(1<=j);
  367.         assert(j<=A_.dim(2));
  368. #endif
  369.         if (i<j)
  370.             return A_(i,j);
  371.         else if (i==j)
  372.             return one;
  373.         else 
  374.             return zero;
  375.     }
  376. #ifdef TNT_USE_REGIONS 
  377.   // These are the "index-aware" features
  378.     typedef const_Region2D<UnitUpperTriangularView<Matrix>,T > 
  379.                     const_Region;
  380.     const_Region operator()(const Index1D &I,
  381.             const Index1D &J) const
  382.     {
  383.         return const_Region(*this, I, J);
  384.     }
  385.     const_Region operator()(Subscript i1, Subscript i2,
  386.             Subscript j1, Subscript j2) const
  387.     {
  388.         return const_Region(*this, i1, i2, j1, j2);
  389.     }
  390. #endif
  391. // TNT_USE_REGIONS
  392. };
  393. template <class Matrix>
  394. UpperTriangularView<Matrix> Upper_triangular_view(
  395.     const Matrix &A)
  396. {
  397.     return UpperTriangularView<Matrix>(A);
  398. }
  399. template <class Matrix>
  400. UnitUpperTriangularView<Matrix> Unit_upper_triangular_view(
  401.     const Matrix &A)
  402. {
  403.     return UnitUpperTriangularView<Matrix>(A);
  404. }
  405. template <class Matrix, class Vector>
  406. Vector matmult(const UnitUpperTriangularView<Matrix> &A, Vector &x)
  407. {
  408.     Subscript M = A.num_rows();
  409.     Subscript N = A.num_cols();
  410.     assert(N == x.dim());
  411.     Subscript i, j;
  412.     typename Vector::element_type sum=0.0;
  413.     Vector result(M);
  414.     Subscript start = A.lbound();
  415.     Subscript Mend = M + A.lbound() -1 ;
  416.     for (i=start; i<=Mend; i++)
  417.     {
  418.         sum = x(i);
  419.         for (j=i+1; j<=N; j++)
  420.             sum = sum + A(i,j)*x(j);
  421.         result(i) = sum + x(i);
  422.     }
  423.     return result;
  424. }
  425. template <class Matrix, class Vector>
  426. inline Vector operator*(const UnitUpperTriangularView<Matrix> &A, Vector &x)
  427. {
  428.     return matmult(A,x);
  429. }
  430. //********************** Algorithms *************************************
  431. template <class Matrix>
  432. ostream& operator<<(ostream &s, const UpperTriangularView<Matrix>&A)
  433. {
  434.     Subscript M=A.num_rows();
  435.     Subscript N=A.num_cols();
  436.     s << M << " " << N << endl;
  437.     for (Subscript i=1; i<=M; i++)
  438.     {
  439.         for (Subscript j=1; j<=N; j++)
  440.         {
  441.             s << A(i,j) << " ";
  442.         }
  443.         s << endl;
  444.     }
  445.     return s;
  446. }
  447. template <class Matrix>
  448. ostream& operator<<(ostream &s, const UnitUpperTriangularView<Matrix>&A)
  449. {
  450.     Subscript M=A.num_rows();
  451.     Subscript N=A.num_cols();
  452.     s << M << " " << N << endl;
  453.     for (Subscript i=1; i<=M; i++)
  454.     {
  455.         for (Subscript j=1; j<=N; j++)
  456.         {
  457.             s << A(i,j) << " ";
  458.         }
  459.         s << endl;
  460.     }
  461.     return s;
  462. }
  463. #endif 
  464. //TRIANG_H