Zorikto

matrix

Feb 8th, 2021 (edited)
645
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.93 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <omp.h>
  4.  
  5. using namespace std;
  6.  
  7. template <typename T>
  8. struct M
  9. {
  10. private:
  11.     vector<vector<T>> matrix;
  12.     int n;
  13.     int m;
  14.  
  15. public:
  16.     M()
  17.     {
  18.         n = m = 0;
  19.     }
  20.  
  21.     M(int _n, int _m)
  22.     {
  23.         n = _n;
  24.         m = _m;
  25.  
  26.         for (int i = 0; i < n; i++)
  27.         {
  28.             matrix.push_back(vector<T>());
  29.         }
  30.  
  31.         for (int i = 0; i < n; i++)
  32.         {
  33.             for (int j = 0; j < m; j++)
  34.             {
  35.                 matrix[i].push_back(1);
  36.             }
  37.         }
  38.     }
  39.  
  40.     M(const M& _M)
  41.     {
  42.         n = _M.n;
  43.         m = _M.m;
  44.  
  45.         for (int i = 0; i < n; i++)
  46.         {
  47.             matrix.push_back(vector<T> ());
  48.         }
  49.  
  50.         for (int i = 0; i < n; i++)
  51.         {
  52.             for (int j = 0; j < m; j++)
  53.             {
  54.                 matrix[i].push_back(_M.matrix[i][j]);
  55.             }
  56.         }
  57.     }
  58.  
  59.     T getM(int i, int j)
  60.     {
  61.         if (n > 0 && m > 0)
  62.         {
  63.             return matrix[i][j];
  64.         }
  65.         else
  66.         {
  67.             return 0;
  68.         }
  69.     }
  70.  
  71.     void setM(int i, int j, T value)
  72.     {
  73.         if (i < 0 || i >= n)
  74.         {
  75.             return;
  76.         }
  77.         if (j < 0 || j >= m)
  78.         {
  79.             return;
  80.         }
  81.  
  82.         matrix[i][j] = value;
  83.     }
  84.  
  85.     void print(const char* matrixName)
  86.     {
  87.         cout << "Matrix: " << matrixName << '\n';
  88.         for (int i = 0; i < n; i++)
  89.         {
  90.             for (int j = 0; j < m; j++)
  91.             {
  92.                 cout << matrix[i][j] << '\t';
  93.             }
  94.             cout << '\n';
  95.         }
  96.         cout << "---------------------" << '\n' << '\n';
  97.     }
  98.  
  99.     M operator=(const M& _M)
  100.     {
  101.         n = _M.n;
  102.         m = _M.m;
  103.  
  104.         for (int i = 0; i < n; i++)
  105.         {
  106.             matrix.push_back(vector<T> ());
  107.         }
  108.  
  109.         for (int i = 0; i < n; i++)
  110.         {
  111.             for (int j = 0; j < m; j++)
  112.             {
  113.                 matrix[i][j] = _M.matrix[i][j];
  114.             }
  115.         }
  116.         return *this;
  117.     }
  118.  
  119.     M operator*(const M& B)
  120.     {
  121.         M<T> tempM(n, B.m);
  122. //#pragma omp parallel for
  123. //#pragma omp parallel for num_threads(2)
  124.         for (int i = 0; i < n; i++)
  125.         {
  126.             for (int j = 0; j < B.m; j++)
  127.             {
  128.                 for (int k = 0; k < m; k++) {
  129.                     tempM.matrix[i][j] += matrix[i][k] * B.matrix[k][j];
  130.                 }
  131.             }
  132.         }
  133.         return tempM;
  134.     }
  135.  
  136.     vector<double> Gauss(vector<double>& B, vector<double>& res)
  137.     {
  138.        
  139.         // Прямой ход
  140.         for (int j = 0; j < n; j++)
  141.         {
  142.             for (int i = j + 1; i < n; i++)
  143.             {
  144.                 B[i] = B[i] * matrix[j][j] - B[j] * matrix[i][j];
  145.                 for (int k = n-1; k >= 0; k--)
  146.                 {
  147.                     matrix[i][k] = matrix[i][k] * matrix[j][j] - matrix[j][k] * matrix[i][j];
  148.                 }
  149.             }
  150.         }
  151.  
  152.         // Обратный ход
  153.         res.resize(n);
  154.         res[n-1] = B[n-1] / matrix[n-1][n-1];
  155.         for (int i = n - 2; i >= 0; i--)
  156.         {
  157.             for (int j = i + 1; j < n; j++)
  158.             {
  159.                 B[i] -= matrix[i][j] * res[j];
  160.             }
  161.             res[i] = B[i] / matrix[i][i];
  162.         }
  163.  
  164.         return res;
  165.     }
  166. };
  167.  
  168.  
  169.  
  170. int main()
  171. {
  172.     setlocale(LC_ALL, "ru");
  173.     // Lab 1
  174.     //int n = 500;
  175.     //M<int> m1(n, n);
  176.  
  177.     ///*for (int i = 0; i < n; i++)
  178.     //{
  179.     //    for (int j = 0; j < n; j++)
  180.     //    {
  181.     //        m1.setM(i, j, i + j);
  182.     //    }
  183.     //}
  184.     //m1.print("M1");*/
  185.  
  186.     //M<int> m2(n, n);
  187.     ///*for (int i = 0; i < n; i++)
  188.     //{
  189.     //    for (int j = 0; j < n; j++)
  190.     //    {
  191.     //        m2.setM(i, j, (i + j) * (i + j));
  192.     //    }
  193.     //}
  194.     //m2.print("M2");*/
  195.  
  196.     //for (int i = 0; i < 10; i++)
  197.     //{
  198.     //    double startTime = omp_get_wtime();
  199.     //    M<int> m3 = m1 * m2;
  200.     //    double endTime = omp_get_wtime();
  201.     //    std::cout << endTime - startTime << std::endl;
  202.     //}
  203.  
  204.     ///*m3.print("M3");*/
  205.  
  206.     // Gauss
  207.     int n = 3;
  208.  
  209.     M<int> M(n, n);
  210.     vector<double> B(n), X(n);
  211.  
  212.     std::cout << "Ввод матрицы M:\n";
  213.     for (int i = 0; i < n; i++)
  214.     {
  215.         for (int j = 0; j < n; j++)
  216.         {
  217.             int temp;
  218.             std::cin >> temp;
  219.             M.setM(i, j, temp);
  220.         }
  221.     }
  222.  
  223.     std::cout << "\nВвод вектора B:";
  224.     for (int i = 0; i < n; i++)
  225.     {
  226.         std::cin>> B[i];
  227.     }
  228.  
  229.     std::cout << '\n';
  230.     X = M.Gauss(B, X);
  231.  
  232.     std::cout << "\nВывод вектора X:\n";
  233.     for (int i = 0; i < n; i++)
  234.     {
  235.         std::cout << X[i] << '\n';
  236.     }
  237.  
  238.     return 0;
  239. }
  240.  
  241. /*
  242. matrix
  243. 5 8 -4
  244. 6 9 -5
  245. 4 7 -2
  246.  
  247. -18
  248. -20
  249. -15
  250. B
  251.  
  252. X
  253. 2
  254. -3
  255. 1
  256. */
  257.  
  258. /*
  259. matrix
  260. 2 -1 0
  261. -1 1 4
  262. 1 2 3
  263.  
  264. 0
  265. 13
  266. 14
  267. B
  268.  
  269. X
  270. 1
  271. 2
  272. 3
  273. */
Advertisement
Add Comment
Please, Sign In to add comment