#include "prototype.h"
//Функция перезаписи из массива в указатели
double ** sozdanie(double mas[4][4])
{
//Создаем указатель
double **ras;
ras=new double *[4];
for (int i=0; i<4; i++)
ras[i]= new double [4];
//Переписываем в него массив
for (int i=0; i<4; i++)
for (int j=0; j<4; j++)
ras[i][j]=mas[i][j];
//Выводим указатель
return ras;
//Подчищаем за собой
for (int i = 0; i < 4; i++)
delete [] ras[i];
delete [] ras;
}
//Функция вывода на экран матрицы
void print_mas (double **mas)
{
for (int i=0; i<4; i++)
{
printf_s ("\n");
for (int j=0; j<4; j++)
printf_s ("%4.2f ",mas[i][j]);
}
}
//Функция транспонирования матрицы
double ** trans(double **mas)
{
//Создаем указатель
double **ras;
ras=new double *[4];
for (int i=0; i<4; i++)
ras[i]= new double [4];
//Переписываем из входящего указателя в новый, заменяя строки на столбцы
for (int i=0; i<4; i++)
for (int j=0; j<4; j++)
ras[j][i]=mas[i][j];
//Выводим соданый указатель
return ras;
//Подчищаем за собой
for (int i = 0; i < 4; i++)
delete [] ras[i];
delete [] ras;
}
//Функция расчета обратной матрицы
double ** obrat(double **mas)
{
//Создаем временный указатель
double **temp1 = new double *[4];
for (int i=0; i<4; i++)
temp1[i]= new double [4];
//Переписываем входной указатель на временный
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
temp1[i][j]=mas[i][j];
//Создание обратной матрицы
{
//Создаем временную матрицу
double temp;
//Создаем указатель для единичной матрицы
double **E = new double *[4];
for (int i = 0; i < 4; i++)
E[i] = new double [4];
//Заполняем единичную матрицу
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
{
E[i][j] = 0.00;
if (i == j)
E[i][j] = 1.00;
}
//Заполняем временную матрицу
//Все элементы первой строки делим на верхний элемент выбранного столбца.
for (int k = 0; k < 4; k++)
{
temp = temp1[k][k];
for (int j = 0; j < 4; j++)
{
temp1[k][j] = temp1[k][j]/temp;
E[k][j] = E[k][j]/temp;
}
//Из оставшихся строк вычитаем первую строку, умноженную на первый элемент соответствующей строки,
//с целью получить первым элементом каждой строки (кроме первой) ноль.
for (int i = k + 1; i < 4; i++)
{
temp = temp1[i][k];
for (int j = 0; j < 4; j++)
{
temp1[i][j] = temp1[i][j] - temp1[k][j] * temp;
E[i][j] = E[i][j] - E[k][j] * temp;
}
}
}
//Вычитаем из предпоследней строки последнюю строку, умноженную на соответствующий коэффициент,
//с тем, чтобы в предпоследней строке осталась только 1 на главной диагонали.
for (int k = 4 - 1; k > 0; k--)
{
for (int i = k - 1; i >= 0; i--)
{
temp = temp1[i][k];
for (int j = 0; j < 4; j++)
{
temp1[i][j] = temp1[i][j] - temp1[k][j] * temp;
E[i][j] = E[i][j] - E[k][j] * temp;
}
}
}
//Переписываем значения из обработаной единичной матрицы в расчетную матрицу
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
temp1[i][j] = E[i][j];
//Подчищаем за собой
for (int i = 0; i < 4; i++)
delete [] E[i];
delete [] E;
//Возвращаем указатель с результатом
return temp1;
//Подчищаем за собой
for (int i = 0; i < 4; i++)
delete [] temp1[i];
delete [] temp1;
}
}
//Функция произведения двух матриц
double ** proizv (double **mas, double **mast)
{
//Создаем указатель, в который будем записывать результат вычислений
double **ras;
ras=new double *[4];
for (int i=0; i<4; i++)
ras[i]= new double [4];
//Вычисляем значения по элементно
for (int i=0; i<4; i++)
for (int j=0; j<4; j++)
ras[i][j]=0;
for (int i=0; i<4; i++)
for (int j=0; j<4; j++)
{
for (int k=0; k<4; k++)
{
double s = mas[k][j]*mast[i][k];
//Результат умножения записываем в результирующий указатель
ras[i][j]=ras[i][j]+s;
}
}
//Выводим результирующий указатель
return ras;
//Подчищаем за собой
for (int i = 0; i < 4; i++)
delete [] ras[i];
delete [] ras;
}
//Функция сравнения матрицы с единичной матрицой
void sravnenie(double **mas)
{
int s=1; //Счетчик истины
for (int i=0; i<4; i++)
for (int j=0; j<4; j++)
{
//Сравнение по единичным наборам
if (i==j)
{
if (mas[i][j]!=1 && (fabs(mas[i][j]-1.0)>0.00001))
{
s=s+1; //Если условие не выполняется, то счетчик истины увеличивается
}
}
//Сравнение по нулевым наборам
else if (i!=j)
{
if (mas[i][j]!=0 && (fabs(mas[i][j])>0.00001))
{
s=s+1; //Если условие не выполняется, то счетчик истины увеличивается
}
}
}
//Сравнение счетчика истины с начальным значением
if (s>1)
printf_s ("Матрица не единичная => Вычисления выполнены не правильно\n\n");
else
printf_s ("Матрица единичная => Вычисления выполнены правильно\n\n");
}
//Функция сравнения матриц
void rezultat(double **mas, double **mast)
{
int s=1; //Счетчик истины
for (int i=0; i<4; i++)
for (int j=0; j<4; j++)
if (mas[i][j]!=mast[i][j])
s++; //При выполнении условия, счетчик накручиваем
if (s>1) printf_s ("Транспонированная матрица не идентична обратной => \nПредставленная матрица не ортогональна\n\n");
else printf_s ("Транспонированная матрица идентична обратной => \nПредставленная матрица ортогональна\n\n");
}