Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- template <typename T>
- class Matrix {
- private:
- T ** data;
- int rows;
- int columns;
- public:
- //квадратная матрица
- Matrix(int size) {
- this->rows = size;
- this->columns = size;
- data = new T*[size];
- for (int i = 0; i < size; i++) {
- data[i] = new T[size];
- for (int j = 0; j < size; j++)
- data[i][j] = 0;
- }
- }
- // прямоугольная матрица
- Matrix(int rows, int columns) {
- this->rows = rows;
- this->columns = columns;
- data = new T*[rows];
- for (int i = 0; i < rows; i++) {
- data[i] = new T[columns];
- for (int j = 0; j < columns; j++)
- data[i][j] = 0;
- }
- }
- // ввод с файла
- void F_inputMatrix(std::ifstream * input_file) {
- T buffer;
- for (int i = 0; i < rows; i++)
- for (int j = 0; j < columns; j++) {
- *input_file >> buffer;
- data[i][j] = buffer;
- }
- }
- // сбор и изменение данных.
- int getrows() {
- return rows;
- }
- int getcolumns() {
- return columns;
- }
- T getdatavalue(int i, int j) {
- return data[i][j];
- }
- void setdatavalue(int i, int j, T value) {
- data[i][j] = value;
- }
- void adddatavalue(int i, int j, T value) {
- data[i][j] += value;
- }
- // операторы
- Matrix operator + (Matrix & B) {
- if (rows == B.getrows() && columns == getcolumns()) {
- Matrix<T> C(rows, columns);
- for (int i = 0; i < rows; i++)
- for (int j = 0; j < columns; j++)
- C.setdatavalue(i, j, data[i][j] + B.getdatavalue(i, j));
- return C;
- }
- else {
- std::cout << "...ERROR(SUMM)...";
- return Matrix(0);
- }
- }
- Matrix & operator = (Matrix & B) {
- rows = B.getrows();
- columns = B.getcolumns();
- for (int i = 0; i < rows; i++)
- for (int j = 0; j < columns; j++)
- data[i][j] = B.getdatavalue(i, j);
- return *this;
- }
- Matrix operator *(Matrix & B) {
- if (this->columns == B.getraws()) {
- Matrix<T>C(rows, B.getcolumns());
- for (int i = 0; i < rows; i++)
- for (int j = 0; j < B.getcolumns(); j++)
- for (int k = 0; k < columns; k++)
- C.adddatavalue(i, j, B.getdatavalue(k, j)*getdatavalue(i, k));
- return C;
- }
- else {
- std::count << "...ERROR(MULTI)...";
- return Matrix(0);
- }
- }
- //Своп строчек
- void Matrixrowsswap(int i, int j) {
- if (i < rows && j < rows) {
- T buffer;
- for (int k = 0; k < columns; k++) {
- buffer = data[i][k];
- data[i][k] = data[j][k];
- data[j][k] = buffer;
- }
- }
- else {
- std::cout << "...ERROR(SWAP)...";
- return;
- }
- }
- //метод Гаусса
- Matrix Gaussmethod(Matrix & Answer, Matrix &X) {
- Matrix<T>C(rows);
- C = *this;
- bool flag = 0;
- T coeff = 0;
- //приведение к треугольной
- for (int i = 0; i < rows; i++) {
- if (C.getdatavalue(i, i) == 0) {
- flag = 1;
- for (int j = i + 1; j < columns; j++)
- if (C.getdatavalue(j, i) != 0) {
- C.Matrixrowsswap(i, j);
- Answer.Matrixrowsswap(i, j);
- flag = 0;
- break;
- }
- }
- if (flag) continue;
- for (int k = i + 1; k < rows; k++) {
- coeff = C.getdatavalue(k, i) / C.getdatavalue(i, i) *(-1);
- Answer.adddatavalue(k, 0, coeff*Answer.getdatavalue(i, 0));
- for (int l = i; l < rows; l++)
- C.adddatavalue(k, l, coeff*C.getdatavalue(i, l));
- }
- }
- //обратный ход
- for (int i = rows - 1; i >= 0; i--) {
- X.setdatavalue(i, 0, Answer.getdatavalue(i, 0));
- for (int j = rows - 1; j > i; j--)
- X.adddatavalue(i, 0, C.getdatavalue(i, j)*X.getdatavalue(j, 0)*(-1));
- X.setdatavalue(i, 0, X.getdatavalue(i, 0) / C.getdatavalue(i, i));
- }
- return C;
- }
- //зануление 2(нижней) диагонали
- Matrix TDM1step(Matrix & Answer){
- Matrix<T>C(rows);
- C = *this;
- double coeff = 0;
- for (int i = 0; i < rows - 1; i++){
- coeff = C.getdatavalue(i + 1, i) / C.getdatavalue(i, i)*(-1);
- C.setdatavalue(i + 1, i, 0);
- C.adddatavalue(i + 1, i + 1, coeff*C.getdatavalue(i, i + 1));
- C.adddatavalue(i + 1, i + 2, coeff*getdatavalue(i, i + 2));
- Answer.adddatavalue(i + 1, 0, coeff*Answer.getdatavalue(i, 0));
- }
- return C;
- }
- //метод Прогонки
- Matrix TDM(Matrix & Answer, Matrix &X){
- Matrix<T>C(rows);
- C = *this;
- C = C.TDM1step(Answer);
- T temp;
- X.setdatavalue(rows - 1, 0, Answer.getdatavalue(rows - 1, 0) / C.getdatavalue(rows - 1, rows - 1));
- for (int i = rows - 2; i >= 0; i--){
- temp = Answer.getdatavalue(i,0) - C.getdatavalue(i, i + 1)*X.getdatavalue(i + 1, 0);
- X.setdatavalue(i, 0, temp / C.getdatavalue(i, i));
- }
- return C;
- }
- //вывод матрицы
- void printMatrix() {
- for (int i = 0; i < rows; i++) {
- for (int j = 0; j < columns; j++){
- std::cout << data[i][j];
- std::cout << " ";
- }
- std::cout << "\n";
- }
- std::cout << "\n";
- }
- };
- int main() {
- std::cout.precision(9);
- system("color 0A");
- //GM
- Matrix <double> A(6, 6);
- Matrix <double> B(3, 3);
- Matrix <double> Result(6, 1);
- Matrix <double> X(6, 1);
- //TDM
- //Matrix<double>A(4, 4);
- //Matrix<double>Result(4, 1);
- //Matrix<double>X(4, 1);
- std::ifstream input_file("in.txt");
- A.F_inputMatrix(&input_file);
- Result.F_inputMatrix(&input_file);
- //A = A.Gaussmethod(Result, X);
- //A = A.TDM1step(Result);
- A.printMatrix();
- A = A.TDM(Result, X);
- A.printMatrix();
- Result.printMatrix();
- X.printMatrix();
- getchar();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement