matrix_pf.cpp
上传用户:jtjnyq9001
上传日期:2014-11-21
资源大小:3974k
文件大小:5k
源码类别:

3G开发

开发平台:

Visual C++

  1. //
  2. //  File = matrix_pf.cpp
  3. //
  4. #include <error.h>
  5. #include "matrix_pf.h"
  6. #include "colvec_pf.h"
  7. #include "pfelem.h"
  8. #ifdef _DEBUG
  9.   #include <fstream>
  10.   extern ofstream DebugFile;
  11.   //#define _MTX_DEBUG 1
  12. #endif
  13. //---------------------------------------------
  14. //  constructor
  15. matrix_pf::matrix_pf( void )
  16. {
  17. };
  18. //---------------------------------------------
  19. //  constructor
  20. matrix_pf::matrix_pf( int row_orig, 
  21.                    int nrows, 
  22.                    int col_orig,
  23.                    int ncols)
  24.   {
  25.   allocate( row_orig, nrows, col_orig, ncols);
  26.   };
  27. //======================================================
  28. void matrix_pf::allocate(  int row_orig, 
  29.                            int nrows, 
  30.                            int col_orig,
  31.                            int ncols)
  32.   {
  33.   if( (nrows <= 0) || (ncols <=0))
  34.       cout << "illegal matrix dimension" << endl;
  35.   pM = new mrep;
  36.   #ifdef _MTX_DEBUG
  37.   DebugFile << "nctor for matrix at " << this 
  38.             << "   (mrep = " << (void*)pM << ")" << endl;
  39.   #endif
  40.   pM->length = nrows;
  41.   pM->orig_indx = row_orig;
  42.   pM->max_indx = row_orig + nrows - 1;
  43.   pM->f = new rowvec_pf*[nrows];
  44.   #ifdef _MTX_DEBUG
  45.     DebugFile << "v::v(i,i): ptr array " << nrows 
  46.               << " long alloc at "
  47.               << (void*)(pM->f) << endl;
  48.   #endif
  49.   for(int i=0; i<nrows; i++)
  50.     pM->f[i] = new rowvec_pf( col_orig, ncols);
  51.   pM->refcnt = 1;
  52.   Is_Temp = 0;
  53.   };
  54. //----------------------------------------------
  55. matrix_pf::~matrix_pf(void)
  56. {
  57.   //rowvec<T> *row_ptr;
  58.   #ifdef _MTX_DEBUG
  59.   DebugFile << "ndtor for matrix at " << (void*)this << endl;
  60.   #endif
  61.   if( --pM->refcnt == 0)
  62.     {
  63.     int nrows = pM->length;
  64.     for(int i=0; i<nrows; i++)
  65.             delete pM->f[i];
  66.     delete pM->f;
  67.     #ifdef _MTX_DEBUG
  68.     DebugFile << "nm::~m(): deleting mrep at " 
  69.               << (void*)pM << endl;
  70.     #endif
  71.     delete pM;
  72.     }
  73. }
  74. //----------------------------------------------
  75. // set row of values
  76. void matrix_pf::setrow(int row_num, PrimeFieldElem *val_vec)
  77. {
  78.   int ncols = ((pM->f[pM->orig_indx])->pV)->length;
  79.   for(int j=0; j<ncols; j++)
  80.     {
  81.     ((pM->f[row_num])->pV)->f[j] = val_vec[j];
  82.     }
  83. }
  84. //====================================================
  85. #if 0
  86. void matrix_pf::DumpToStream( ostream* output_stream)
  87. {
  88.   int nrows = pM->length;
  89.   int ncols = ((pM->f[pM->orig_indx])->pV)->length;
  90.   (*output_stream) << "matrix<T> Dump:" << endl;
  91.   for( int i=0; i<nrows; i++)
  92.     {
  93.     for( int j=0; j<ncols; j++)
  94.       {
  95.       (*output_stream) << (((pM->f[i])->pV)->f[j]) << "  ";
  96.       }
  97.     (*output_stream) << endl;
  98.     }
  99. }
  100. #endif
  101. //----------------------------------------------
  102. // row extraction
  103. rowvec_pf& matrix_pf::operator[](int i)
  104. {
  105.   return *(pM->f[ (((i>=(pM->orig_indx)) && (i<= pM->max_indx)) ? 
  106.                  (i-(pM->orig_indx)) : 0)]);
  107. }
  108. //--------------------------------------------------
  109. //  post-multiply matrix by a column vector
  110. colvec_pf& matrix_pf::operator*( colvec_pf &v2)
  111. {
  112.   // check dimensions
  113.   int row_orig = pM->orig_indx;
  114.   int nrows = pM->length;
  115.   int col_orig = ((pM->f[pM->orig_indx])->pV)->orig_indx;
  116.   int ncols = ((pM->f[pM->orig_indx])->pV)->length;
  117.   int vec_orig = v2.pV->orig_indx;
  118.   int vec_len = v2.pV->length;
  119.   
  120.   if(ncols != vec_len)
  121.     {
  122.     cout << "error in matrix method" << endl;
  123.     return( v2 );
  124.     }
  125.   // allocate new vector for result
  126.   colvec_pf *v_res = new colvec_pf(row_orig, nrows);
  127.   #ifdef _MTX_DEBUG
  128.   DebugFile << "nm::op*(cv): new colvec at "
  129.             << (void*)v_res << endl;
  130.   #endif
  131.   v_res->Is_Temp = 1;
  132.   // perform multiplication and populate results vector
  133.   PrimeFieldElem sum;
  134.   for(int i=0; i<nrows; i++)
  135.     {
  136.     sum = PrimeFieldElem(0);
  137.     for(int j=0; j<vec_len; j++)
  138.       {
  139.       //sum += ((v2.pV->f[j]) * (((pM->f[i-(pM->orig_indx)])->pV)->f[j]));
  140.       sum += ((v2.pV->f[j]) * (((pM->f[i])->pV)->f[j]));
  141.       }
  142.     (v_res->pV)->f[i] = sum; 
  143.     }
  144.   if(v2.Is_Temp)
  145.     {
  146.     #ifdef _MTX_DEBUG
  147.     DebugFile << "nm::op*(cv): deleting colvec at " 
  148.               << (void*)(&v2) << endl;
  149.     #endif
  150.     delete (&v2);
  151.     }
  152.   if(Is_Temp)
  153.     {
  154.     #ifdef _MTX_DEBUG
  155.     DebugFile << "nm::op*(cv): deleting matrix at " 
  156.               << (void*)this << endl;
  157.     #endif
  158.     delete this;
  159.     }
  160.   return (*v_res);
  161. }
  162. //--------------------------------------------------
  163. //  do element-by-element subtraction
  164. matrix_pf& matrix_pf::operator-=(matrix_pf &m2)
  165.   {
  166.   int nrows = pM->length;
  167.   int ncols = ((pM->f[pM->orig_indx])->pV)->length;
  168.   for(int i=0; i<nrows; i++)
  169.     {
  170.     for(int j=0; j<ncols; j++)
  171.       {
  172.       ((pM->f[i])->pV)->f[j] -= (((m2.pM)->f[i])->pV)->f[j];
  173.       }
  174.     }
  175.   if(m2.Is_Temp)
  176.     {
  177.     #ifdef _MTX_DEBUG
  178.     DebugFile << "nm::op-=(m): deleting matrix at " 
  179.               << (void*)(&m2) << endl;
  180.     #endif
  181.     delete (&m2);
  182.     }
  183.   return(*this);
  184.   }
  185. //template matrix<double>;
  186. //template matrix<complex>;
  187. //template matrix< PrimeFieldElem() >;