Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <omp.h>
- using namespace std;
- template <typename T>
- struct M
- {
- private:
- vector<vector<T>> matrix;
- int n;
- int m;
- public:
- M()
- {
- n = m = 0;
- }
- M(int _n, int _m)
- {
- n = _n;
- m = _m;
- for (int i = 0; i < n; i++)
- {
- matrix.push_back(vector<T>());
- }
- for (int i = 0; i < n; i++)
- {
- for (int j = 0; j < m; j++)
- {
- matrix[i].push_back(1);
- }
- }
- }
- M(const M& _M)
- {
- n = _M.n;
- m = _M.m;
- for (int i = 0; i < n; i++)
- {
- matrix.push_back(vector<T> ());
- }
- for (int i = 0; i < n; i++)
- {
- for (int j = 0; j < m; j++)
- {
- matrix[i].push_back(_M.matrix[i][j]);
- }
- }
- }
- T getM(int i, int j)
- {
- if (n > 0 && m > 0)
- {
- return matrix[i][j];
- }
- else
- {
- return 0;
- }
- }
- void setM(int i, int j, T value)
- {
- if (i < 0 || i >= n)
- {
- return;
- }
- if (j < 0 || j >= m)
- {
- return;
- }
- matrix[i][j] = value;
- }
- void print(const char* matrixName)
- {
- cout << "Matrix: " << matrixName << '\n';
- for (int i = 0; i < n; i++)
- {
- for (int j = 0; j < m; j++)
- {
- cout << matrix[i][j] << '\t';
- }
- cout << '\n';
- }
- cout << "---------------------" << '\n' << '\n';
- }
- M operator=(const M& _M)
- {
- n = _M.n;
- m = _M.m;
- for (int i = 0; i < n; i++)
- {
- matrix.push_back(vector<T> ());
- }
- for (int i = 0; i < n; i++)
- {
- for (int j = 0; j < m; j++)
- {
- matrix[i][j] = _M.matrix[i][j];
- }
- }
- return *this;
- }
- M operator*(const M& B)
- {
- M<T> tempM(n, B.m);
- //#pragma omp parallel for
- //#pragma omp parallel for num_threads(2)
- for (int i = 0; i < n; i++)
- {
- for (int j = 0; j < B.m; j++)
- {
- for (int k = 0; k < m; k++) {
- tempM.matrix[i][j] += matrix[i][k] * B.matrix[k][j];
- }
- }
- }
- return tempM;
- }
- vector<double> Gauss(vector<double>& B, vector<double>& res)
- {
- // Прямой ход
- for (int j = 0; j < n; j++)
- {
- for (int i = j + 1; i < n; i++)
- {
- B[i] = B[i] * matrix[j][j] - B[j] * matrix[i][j];
- for (int k = n-1; k >= 0; k--)
- {
- matrix[i][k] = matrix[i][k] * matrix[j][j] - matrix[j][k] * matrix[i][j];
- }
- }
- }
- // Обратный ход
- res.resize(n);
- res[n-1] = B[n-1] / matrix[n-1][n-1];
- for (int i = n - 2; i >= 0; i--)
- {
- for (int j = i + 1; j < n; j++)
- {
- B[i] -= matrix[i][j] * res[j];
- }
- res[i] = B[i] / matrix[i][i];
- }
- return res;
- }
- };
- int main()
- {
- setlocale(LC_ALL, "ru");
- // Lab 1
- //int n = 500;
- //M<int> m1(n, n);
- ///*for (int i = 0; i < n; i++)
- //{
- // for (int j = 0; j < n; j++)
- // {
- // m1.setM(i, j, i + j);
- // }
- //}
- //m1.print("M1");*/
- //M<int> m2(n, n);
- ///*for (int i = 0; i < n; i++)
- //{
- // for (int j = 0; j < n; j++)
- // {
- // m2.setM(i, j, (i + j) * (i + j));
- // }
- //}
- //m2.print("M2");*/
- //for (int i = 0; i < 10; i++)
- //{
- // double startTime = omp_get_wtime();
- // M<int> m3 = m1 * m2;
- // double endTime = omp_get_wtime();
- // std::cout << endTime - startTime << std::endl;
- //}
- ///*m3.print("M3");*/
- // Gauss
- int n = 3;
- M<int> M(n, n);
- vector<double> B(n), X(n);
- std::cout << "Ввод матрицы M:\n";
- for (int i = 0; i < n; i++)
- {
- for (int j = 0; j < n; j++)
- {
- int temp;
- std::cin >> temp;
- M.setM(i, j, temp);
- }
- }
- std::cout << "\nВвод вектора B:";
- for (int i = 0; i < n; i++)
- {
- std::cin>> B[i];
- }
- std::cout << '\n';
- X = M.Gauss(B, X);
- std::cout << "\nВывод вектора X:\n";
- for (int i = 0; i < n; i++)
- {
- std::cout << X[i] << '\n';
- }
- return 0;
- }
- /*
- matrix
- 5 8 -4
- 6 9 -5
- 4 7 -2
- -18
- -20
- -15
- B
- X
- 2
- -3
- 1
- */
- /*
- matrix
- 2 -1 0
- -1 1 4
- 1 2 3
- 0
- 13
- 14
- B
- X
- 1
- 2
- 3
- */
Advertisement
Add Comment
Please, Sign In to add comment