Advertisement
Tvor0zhok

Сложение транспонированных матриц (последовательный алгоритм)

Jun 5th, 2022
1,170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.84 KB | None | 0 0
  1. /// <summary>
  2. /// Перегрузка операции сложения матриц с присваиванием
  3. /// </summary>
  4. /// <typeparam name="T"> тип элементов матрицы </typeparam>
  5. /// <param name="A"> слагаемое-результат </param>
  6. /// <param name="B"> второе слагаемое </param>
  7. template <class T>
  8. void operator += (CSR_Matrix<T> &A, CSR_Matrix<T> B)
  9. {
  10.     assert(A.n() == B.n() && A.m() == B.m());
  11.  
  12.     int _N = A.n(), _M = A.m(), _NNZ = 0;
  13.  
  14.     vector <T> values;
  15.     vector <int> cols, rowptr(1);
  16.  
  17.     vector <T> values_A = A.values(), values_B = B.values();
  18.     vector <int> cols_A = A.cols(), cols_B = B.cols();
  19.     vector <int> rowptr_A = A.rowptr(), rowptr_B = B.rowptr();
  20.  
  21.     for (int i = 0; i < _N; ++i)
  22.     {
  23.         int left_A = rowptr_A[i], right_A = rowptr_A[i + 1];
  24.         int left_B = rowptr_B[i], right_B = rowptr_B[i + 1];
  25.  
  26.         int ptr_A = left_A, ptr_B = left_B;
  27.  
  28.         while (ptr_A < right_A && ptr_B < right_B)
  29.         {
  30.             int col_A = cols_A[ptr_A], col_B = cols_B[ptr_B];
  31.             T value_A = values_A[ptr_A], value_B = values_B[ptr_B];
  32.  
  33.             if (col_A == col_B)
  34.             {
  35.                 if (value_A + value_B)
  36.                 {
  37.                     values.push_back(value_A + value_B);
  38.                     cols.push_back(col_A);  ++_NNZ;
  39.                 }
  40.  
  41.                 ++ptr_A; ++ptr_B;
  42.             }
  43.             else if (col_A < col_B)
  44.             {
  45.                 values.push_back(value_A);
  46.                 cols.push_back(col_A);
  47.  
  48.                 ++ptr_A; ++_NNZ;
  49.             }
  50.             else
  51.             {
  52.                 values.push_back(value_B);
  53.                 cols.push_back(col_B);
  54.  
  55.                 ++ptr_B; ++_NNZ;
  56.             }
  57.         }
  58.  
  59.         while (ptr_A < right_A)
  60.         {
  61.             values.push_back(values_A[ptr_A]);
  62.             cols.push_back(cols_A[ptr_A]);
  63.  
  64.             ++ptr_A; ++_NNZ;
  65.         }
  66.  
  67.         while (ptr_B < right_B)
  68.         {
  69.             values.push_back(values_B[ptr_B]);
  70.             cols.push_back(cols_B[ptr_B]);
  71.  
  72.             ++ptr_B; ++_NNZ;
  73.         }
  74.  
  75.         rowptr.push_back(_NNZ);
  76.     }
  77.  
  78.     A = CSR_Matrix<T>(_N, _M, _NNZ, values, cols, rowptr);
  79. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement