Код:
#include "stdafx.h"
#include<iostream>
#include<stdlib.h>
#include<time.h>
#include <iomanip>
using namespace std;
//алгебраическое дополнение к элементу a[row][col] генерация их
double add(double** a, unsigned row, unsigned col, unsigned N, unsigned M)
{
double b[4][4]; //если матрица очень большая изменить параметры
unsigned i, j, bi, bj;
for (i = 0, bi = 0; i<N; i++)
{
if (i != row)
{
for (j = 0, bj = 0; j<M; j++)
if (j != col)
{
b[bi][bj] = a[i][j];
bj++;
}
bi++;
}
}
if ((row + col) % 2)
return b[0][1] * b[1][0] - b[0][0] * b[1][1];
else
return b[0][0] * b[1][1] - b[0][1] * b[1][0];
}
//определитель матрицы
double det(double **a, unsigned N, unsigned M)
{
int i;
double sum;
for (i = 0, sum = 0.; i<N; i++)
sum += a[i][0] * add(a, i, 0, N, M);
if (sum < 0)
cout << "ERROR DETERMINANT NOL'";
return sum;}
//обратная матрица
void inverse(double **a, double d, unsigned N, unsigned M)
{double **a1 = new double*[N];
for (int i = 0; i<N; ++i) {a1[i] = new double[M];}
double cur;
unsigned i, j;
for (i = 0; i < N; i++)
for (j = 0; j < M; j++)
a1[i][j] = add(a, i, j, N, M) / d;
for (i = 0; i < N; i++)
for (j = i + 1; j < M; j++)
{ cur = a1[i][j];
a1[i][j] = a1[j][i];
a1[j][i] = cur;}
if (d < 0)
cout << "Error \n";
else {cout << "\nobratnya matrix :\n";
for (i = 0; i <N; i++){
for (j = 0; j < M; j++)
cout << setw(7) << a1[i][j];
cout << "\n";}}}
void Gauss(double **X, double **A[N][N + 1], unsigned N, unsigned M) // cвободные члены
{
double **a1 = new double*[N];
int temp, r; // рабочий массив свободных членов
int i, j, k; // рабочие переменные
double ** B = new double*[N];
// копирование в рабочую матрицу A
for (i = 0; i < N; i++)
{
B[i] = A[i][N]; // копирование свободных членов
X[i] = 0;
}
// прямой ход
for (i = 0; i < N; i++)
{
if (A[i][i] != 0)
{
// вычитаем строку из последующих
for (k = (i + 1); k < N; k++)
{
r = A[k][i] / A[i][i];
for (j = i; j < N; j++) A[k][j] -= A[i][j] * r;
B[k] -= B[i] * r;
}
}
else
{
// ищем не нулевой элемент для строки
for (j = (i + 1); j < N; j++)
{
if (A[j][i] != 0) break;
}
// если не найден то решений нет
if (j == N)
{
cout<<"reshenia net\n";
exit(1);
}
else // если найден то меняем строки местами
{
// матрица
for (k = i; k < N; k++)
{
temp = A[i][k];
A[i][k] = A[j][k];
A[j][k] = temp;
}
// правая часть
temp = B[i];
B[i] = B[j];
B[j] = temp;
// понижаем i на единицу чтобы цикл повторил проверки и попал в вычитание строки из последующих
i--;
}
}
}
// обратный ход
for (i = N; i >= 0; i--)
{
int s = 0;
for (j = (i + 1); j < N; j++) s += A[i][j] * X[j];
X[i] = (B[i] - s) / A[i][i];
}
// вывод треугольной матрицы
for (i = 0; i < N; i++)
{
for (j = 0; j < M; j++)
cout << A[i][j] << " "<<"\n";
cout<< B[i]<<" "<<"\n";
}
}
//основная функция
int main()
{
unsigned N = 0, M = 0; //размерность матрицы
double determinant; // объявление детерминанта(опеределителя)
unsigned i, j;
unsigned b; //свободные коэф
cout << "n "; cin >> N;
cout << "m "; cin >> M;
double ** arr = new double*[N];
for (i = 0; i < N; i++) {
arr[i] = new double[M];
for (j = 0; j < M; j++)
arr[i][j] = rand() % 10 - 5;
} //задаем рандом в диапазоне от +10 до -5
cout << "matrix A:\n";
for (i = 0; i<N; i++)
{
for (j = 0; j<M; j++)
cout << setw(7) << setprecision(2) << arr[i][j]; //setprecision - сокращение до двух знаков после запятой //setw(7) расстояние между знаками
cout << "\n";
}
cout << "TRANSPONIROVANNYA MATRIX: \n"; //транспонированная матрица
double **ar = new double *[N];
for (i = 0; i < N; i++)
{
ar[i] = new double[M];
for (j = 0; j < M; j++) {
ar[i][j] = arr[j][i];
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
cout << setw(7)<< ar[i][j] << " ";
}
cout << endl;
}
determinant = det(arr, N, M); //передача из функции в главную программу
cout << "\ndeterminant: " << determinant << "\n"; //вывод детерминанта
if (determinant) inverse(arr, determinant, N, M); //в другом случае
else cout << "obrantoy matrici net";
getchar();
system("pause");
for (i = 0; i<N; i++)
delete[] arr[i];
delete[] ar[i];
delete[] arr;
return 0;
}