Advertisement
Guest User

Untitled

a guest
Oct 21st, 2019
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.55 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using Matrix = std::vector<std::vector<double>>;
  5.  
  6. struct CRS
  7. {
  8.   std::vector<double> val;
  9.   std::vector<int> colInd;
  10.   std::vector<int> rowPtr;
  11.  
  12.   void print()
  13.   {
  14.     std::cout << "VAL: ";
  15.     for(auto &value : val)
  16.     {
  17.       std::cout << value << " ";
  18.     }
  19.     std::cout << std::endl << std::endl;
  20.  
  21.     std::cout << "colInd: ";
  22.     for(auto &value : colInd)
  23.     {
  24.       std::cout << value << " ";
  25.     }
  26.     std::cout << std::endl << std::endl;
  27.  
  28.     std::cout << "rowPtr: ";
  29.     for(auto &value : rowPtr)
  30.     {
  31.       std::cout << value << " ";
  32.     }
  33.     std::cout << std::endl << std::endl;
  34.   }
  35. };
  36.  
  37. struct CCS
  38. {
  39.   std::vector<double> val;
  40.   std::vector<int> rowInd;
  41.   std::vector<int> colPtr;
  42.  
  43.     void print()
  44.   {
  45.     std::cout << "VAL: ";
  46.     for(auto &value : val)
  47.     {
  48.       std::cout << value << " ";
  49.     }
  50.     std::cout << std::endl << std::endl;
  51.  
  52.     std::cout << "rowInd: ";
  53.     for(auto &value : rowInd)
  54.     {
  55.       std::cout << value << " ";
  56.     }
  57.     std::cout << std::endl << std::endl;
  58.  
  59.     std::cout << "colPtr: ";
  60.     for(auto &value : colPtr)
  61.     {
  62.       std::cout << value << " ";
  63.     }
  64.     std::cout << std::endl << std::endl;
  65.   }
  66. };
  67.  
  68. double getRandomDouble(double left, double right)
  69. {
  70.   return ((double)rand() / RAND_MAX) * (right-left) + left;
  71. }
  72.  
  73. int getRandomInt(int left, int right)
  74. {
  75.   return (rand() % (right - left + 1)) + left;
  76. }
  77.  
  78. CRS convertCRS(const Matrix& matrix)
  79. {
  80.   CRS crs;
  81.   for(size_t i = 0; i < matrix.size(); ++i)
  82.   {
  83.     bool startedNew = false;
  84.     for(size_t j = 0; j < matrix[i].size(); ++j)
  85.     {
  86.       if(matrix[i][j] != 0)
  87.       {
  88.         if(!startedNew)
  89.         {
  90.           startedNew = true;
  91.           crs.rowPtr.push_back(crs.val.size() + 1);
  92.         }
  93.         crs.val.push_back(matrix[i][j]);
  94.         crs.colInd.push_back(i + 1);
  95.       }
  96.     }
  97.   }
  98.   return crs;
  99. }
  100.  
  101. CCS convertCCS(const Matrix& matrix)
  102. {
  103.   CCS ccs;
  104.   size_t size = matrix.size();
  105.   for(size_t j = 0; j < size; ++j)
  106.   {
  107.     bool startedNew = false;
  108.     for(size_t i = 0; i < size; ++i)
  109.     {
  110.       if(matrix[i][j] != 0)
  111.       {
  112.         if(!startedNew)
  113.         {
  114.           startedNew = true;
  115.           ccs.colPtr.push_back(ccs.val.size() + 1);
  116.         }
  117.         ccs.val.push_back(matrix[i][j]);
  118.         ccs.rowInd.push_back(j + 1);
  119.       }
  120.     }
  121.   }
  122.   return ccs;
  123. }
  124.  
  125. Matrix decompress(CCS& ccs)
  126. {
  127.   int size = ccs.rowInd.back();
  128.   Matrix matrix(size, std::vector<double>(size, 0));
  129.   for(int v_idx = 0; v_idx < ccs.val.size(); ++v_idx)
  130.   {
  131.     int column = 1;
  132.     for(int i = 0; i < ccs.colPtr.size(); ++i)
  133.     {
  134.       if((v_idx + 1) > ccs.colPtr[i])
  135.       {
  136.         column = i;
  137.       }
  138.     }
  139.     matrix[ccs.rowInd[v_idx]-1][column-1] = ccs.val[v_idx];
  140.   }
  141.   return matrix;
  142. }
  143.  
  144. Matrix makeMatrix(size_t size, size_t numberOfRandomElements)
  145. {
  146.   Matrix matrix(size, std::vector<double>(size, 0));
  147.  
  148.   for(int i=0; i < size; ++i)
  149.   {
  150.     matrix[i][i] = getRandomDouble(1,2);
  151.   }
  152.   for(int i=0; i < numberOfRandomElements; ++i)
  153.   {
  154.     matrix[getRandomInt(0, size-1)][getRandomInt(0, size-1)] = getRandomDouble(0,1);
  155.   }
  156.  
  157.   return matrix;
  158. }
  159.  
  160. void printMatrix(Matrix const& matrix)
  161. {
  162.   for(auto &vec: matrix)
  163.   {
  164.     for(auto &el : vec)
  165.     {
  166.       std::cout << el << "\t\t";
  167.     }
  168.     std::cout << std::endl;
  169.   }
  170. }
  171.  
  172. int main(){
  173.   srand(time(NULL));
  174.   Matrix matrix = makeMatrix(5, 10);
  175.   printMatrix(matrix);
  176.   auto crs = convertCCS(matrix);
  177.   auto m = decompress(crs);
  178.   printMatrix(m);
  179.   return 0;
  180. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement