Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "pch.h"
- #include <iostream>
- #include <algorithm>
- #include <time.h>
- #include <vector>
- using namespace std;
- double minor(vector <vector <double>> arr, int SIZE, int stroka, int stolbik);
- int main()
- {
- setlocale(LC_ALL, "Russian");
- srand(time(NULL));
- int SIZE;
- cout << "Введите размерность матрицы: "; // ввод размерности
- cin >> SIZE;
- vector <vector <double>> arr(SIZE, vector <double>(SIZE)); // создает двумерный вектор размера SIZE
- for (int i = 0; i < SIZE; i++) // присванивание значений матрице
- {
- for (int j = 0; j < SIZE; j++)
- {
- arr[i][j] = rand() % 10;
- }
- }
- for (int i = 0; i < SIZE; i++) // вывод матрицы
- {
- for (int j = 0; j < SIZE; j++)
- {
- cout << arr[i][j] << "\t";
- }
- cout << endl;
- }
- for (int i = 0; i < SIZE - 1; i++) // транспонирование
- {
- for (int j = i + 1; j < SIZE; j++)
- {
- swap(arr[i][j], arr[j][i]);
- }
- cout << endl;
- }
- vector <vector <double>> arr_copy(SIZE, vector <double>(SIZE)); // создает двумерный вектор размера SIZE для хранения дубликата транспонированной матрицы
- for (int i = 0; i < SIZE; i++) // присванивание значений из транспонированной матрицы
- {
- for (int j = 0; j < SIZE; j++)
- {
- arr_copy[i][j] = arr[i][j];
- }
- }
- for (int i = 0; i < SIZE; i++) // вывод транспонированной матрицы
- {
- for (int j = 0; j < SIZE; j++)
- {
- cout << arr[i][j] << "\t";
- }
- cout << endl;
- }
- cout << endl;
- for (int i = 0; i < SIZE; i++) // вычисление союзной матрицы
- {
- for (int j = 0; j < SIZE; j++)
- {
- arr[i][j] = minor(arr_copy, SIZE, i, j);
- }
- cout << endl;
- }
- for (int i = 0; i < SIZE; i++) // вывод союзной матрицы
- {
- for (int j = 0; j < SIZE; j++)
- {
- cout << arr[i][j] << "\t";
- }
- cout << endl;
- }
- /*ПОДСЧЕТ ОПРЕДЕЛИТЕЛЯ*/
- double temp = 0; // временная переменная для хранения элемента
- int temp_index = 0; // временная переменная для хранения индекса элемента
- int temp_size = SIZE; //кол-во повторов
- double opredelitel = 1; // переменная для хранения накопленного произведения коэффициентов при минорах
- if (SIZE == 1)
- {
- opredelitel = opredelitel * arr_copy[0][0];
- cout << "Определитель = " << opredelitel << endl;
- return 0;
- }
- for (int t = 0; t < SIZE - 1; t++)
- {
- temp = 0;
- temp_index = 0;
- for (int i = 0; i < temp_size; i++) // выбор элемента через который будем делать 0
- {
- if (arr_copy[i][0] != 0)
- {
- temp = arr_copy[i][0];
- temp_index = i;
- break;
- }
- }
- if (temp == 0)
- {
- cout << "Определитель матрицы равен 0, Ошибка!!!" << endl;
- return 0;
- }
- double k = 0; // коэффициент пропорциональности
- for (int i = 0; i < temp_size; i++) // умножение строчки на коэффициент пропорциональности и вычитание ее из всех остальных
- {
- if (i != temp_index)
- {
- k = arr_copy[i][0] / temp;
- for (int j = 0; j < temp_size; j++)
- {
- arr_copy[i][j] = arr_copy[i][j] - arr_copy[temp_index][j] * k;
- }
- }
- }
- if (temp_index % 2 == 0)
- opredelitel = opredelitel * temp;
- else
- opredelitel = -opredelitel * temp;
- temp_size--; // уменьшаем размер матрицы
- arr_copy.erase(arr_copy.begin()); // делаем вектор на 1 меньше(удаляем 1 столбец)
- for (int i = 0; i < temp_size; i++) // удаляем строчку
- {
- arr_copy[i].erase(arr_copy[i].begin() + temp_index);
- }
- if (temp_size == 1)
- opredelitel = opredelitel * arr_copy[0][0];
- }
- /*ОПРЕДЕЛИТЕЛЬ ПОСЧИТАН*/
- for (int i = 0; i < SIZE; i++) // умножение (1/определитель) на союзную матрицу
- {
- for (int j = 0; j < SIZE; j++)
- {
- arr[i][j] = arr[i][j] * (1 / opredelitel);
- }
- }
- cout << endl;
- for (int i = 0; i < SIZE; i++) // вывод обратной матрицы
- {
- for (int j = 0; j < SIZE; j++)
- {
- cout << arr[i][j] << "\t";
- }
- cout << endl;
- }
- /*cout << endl;
- arr[2][2] = minor(arr, SIZE, 2, 1);*/
- }
- double minor(vector <vector <double>> arr, int SIZE, int stroka, int stolbik)
- {
- /*for (int i = 0; i < SIZE; i++) // вывод матрицы
- {
- for (int j = 0; j < SIZE; j++)
- {
- cout << arr[i][j] << "\t";
- }
- cout << endl;
- }*/
- SIZE--; // уменьшаем размер матрицы
- arr.erase(arr.begin() + stroka); // делаем вектор на 1 меньше(удаляем 1 столбец)
- for (int i = 0; i < SIZE; i++) // удаляем строчку
- {
- arr[i].erase(arr[i].begin() + stolbik);
- }
- double chethik; // переменная для хранения накопленного произведения коэффициентов при минорах
- if ((stroka + stolbik) % 2 == 0)
- chethik = 1;
- else
- chethik = -1;
- if (SIZE == 1)
- {
- chethik = chethik * arr[0][0];
- cout << "Минор = " << chethik << endl;
- return chethik;
- }
- double temp = 0; // временная переменная для хранения элемента
- int temp_index = 0; // временная переменная для хранения индекса элемента
- int repeat = SIZE - 1; //кол-во повторов
- for (int t = 0; t < repeat; t++)
- {
- temp = 0;
- temp_index = 0;
- for (int i = 0; i < SIZE; i++) // выбор элемента через который будем делать 0
- {
- if (arr[i][0] != 0)
- {
- temp = arr[i][0];
- temp_index = i;
- break;
- }
- }
- if (temp == 0) //определитель равен 0
- {
- return 0;
- }
- double k = 0; // коэффициент пропорциональности
- for (int i = 0; i < SIZE; i++) // умножение строчки на коэффициент пропорциональности и вычитание ее из всех остальных
- {
- if (i != temp_index)
- {
- k = arr[i][0] / temp;
- for (int j = 0; j < SIZE; j++)
- {
- arr[i][j] = arr[i][j] - arr[temp_index][j] * k;
- }
- }
- }
- if (temp_index % 2 == 0)
- chethik = chethik * temp;
- else
- chethik = -chethik * temp;
- SIZE--; // уменьшаем размер матрицы
- arr.erase(arr.begin()); // делаем вектор на 1 меньше(удаляем 1 столбец)
- for (int i = 0; i < SIZE; i++) // удаляем строчку
- {
- arr[i].erase(arr[i].begin() + temp_index);
- }
- if (SIZE == 1)
- chethik = chethik * arr[0][0];
- }
- cout << "Минор = " << chethik << endl;
- return chethik;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement