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

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. // Matrix Transpose Views
  10. #ifndef TRANSV_H
  11. #define TRANSV_H
  12. #include <iostream.h>
  13. #include <assert.h>
  14. #include "vec.h"
  15. template <class Array2D>
  16. class Transpose_View
  17. {
  18.     protected:
  19.         const Array2D &  A_;
  20.     public:
  21.         typedef typename Array2D::element_type T;
  22.         typedef         T   value_type;
  23.         typedef         T   element_type;
  24.         typedef         T*  pointer;
  25.         typedef         T*  iterator;
  26.         typedef         T&  reference;
  27.         typedef const   T*  const_iterator;
  28.         typedef const   T&  const_reference;
  29.         const Array2D & array()  const { return A_; }
  30.         Subscript num_rows() const { return A_.num_cols();}
  31.         Subscript num_cols() const { return A_.num_rows();}
  32.         Subscript lbound() const { return A_.lbound(); }
  33.         Subscript dim(Subscript i) const
  34.         {
  35. #ifdef TNT_BOUNDS_CHECK
  36.             assert( A_.lbound() <= i);
  37.             assert( i<= A_.lbound()+1);
  38. #endif
  39.             if (i== A_.lbound())
  40.                 return num_rows();
  41.             else
  42.                 return num_cols();
  43.         }
  44.         Transpose_View(const Transpose_View<Array2D> &A) : A_(A.A_) {};
  45.         Transpose_View(const Array2D &A) : A_(A) {};
  46.         inline const typename Array2D::element_type & operator()(
  47.             Subscript i, Subscript j) const
  48.         {
  49. #ifdef TNT_BOUNDS_CHECK
  50.         assert(lbound()<=i);
  51.         assert(i<=A_.num_cols() + lbound() - 1);
  52.         assert(lbound()<=j);
  53.         assert(j<=A_.num_rows() + lbound() - 1);
  54. #endif
  55.             return A_(j,i);
  56.         }
  57. };
  58. template <class Matrix>
  59. Transpose_View<Matrix> Transpose_view(const Matrix &A)
  60. {
  61.     return Transpose_View<Matrix>(A);
  62. }
  63. template <class Matrix, class T>
  64. Vector<T> matmult(
  65.     const Transpose_View<Matrix> & A, 
  66.     const Vector<T> &B)
  67. {
  68.     Subscript  M = A.num_rows();
  69.     Subscript  N = A.num_cols();
  70.     assert(B.dim() == N);
  71.     Vector<T> x(N);
  72.     Subscript i, j;
  73.     T tmp = 0;
  74.     for (i=1; i<=M; i++)
  75.     {
  76.         tmp = 0;
  77.         for (j=1; j<=N; j++)
  78.             tmp += A(i,j) * B(j);
  79.         x(i) = tmp;
  80.     }
  81.     return x;
  82. }
  83. template <class Matrix, class T>
  84. inline Vector<T> operator*(const Transpose_View<Matrix> & A, const Vector<T> &B)
  85. {
  86.     return matmult(A,B);
  87. }
  88. template <class Matrix>
  89. ostream& operator<<(ostream &s, const Transpose_View<Matrix> &A)
  90. {
  91.     Subscript M=A.num_rows();
  92.     Subscript N=A.num_cols();
  93.     Subscript start = A.lbound();
  94.     Subscript Mend = M + A.lbound() - 1;
  95.     Subscript Nend = N + A.lbound() - 1;
  96.     s << M << "  " << N << endl;
  97.     for (Subscript i=start; i<=Mend; i++)
  98.     {
  99.         for (Subscript j=start; j<=Nend; j++)
  100.         {
  101.             s << A(i,j) << " ";
  102.         }
  103.         s << endl;
  104.     }
  105.     return s;
  106. }
  107. #endif
  108. // TRANSV_H