Как привести матрицу к унитреульной матрице или верхней треугольной матрице? - C (СИ)
Формулировка задачи:
Как привести матрицу к унитреульной матрице или верхней треугольной матрице?
написал код, но работает не так. может кто посмотрит
#include <stdio.h> #include <conio.h> #include <math.h> #include <iostream> #define N 5 void main (){ int mt, nt, i,j,k,c; int A[N+3][N]={ 1,1,0,0,0, 1,1,0,1,0, 1,0,1,0,0, 1,0,1,1,1, 1,0,0,0,0, 0,0,1,0,0, 0,1,0,0,1, 0,1,0,1,0}, B[N+3]={0,1,2,3,4,5,6,7}; mt=8; nt=5; for(int u=0; u<mt; u++){ for(int y=0; y<nt; y++){ printf("%d\t",A[u][y]); if(y==(nt-1))printf("\n");} } printf("\n"); k=0; while(k<mt){ j=k; if(A[B[j]][k]==0 && j<mt){j++;} if(j>(mt-1)){k++;} if(j>(k-1)){c=B[j];B[j]=B[k];B[k]=c;} i=k; while(i<(mt-1)){ i++; if(A[B[i]][k]==1){ for(j=0;j<nt;j++){ A[B[i]][j]=(A[B[i]][j]+A[B[k]][j])%2;} } } for(int u=0; u<N+3; u++){ for(int y=0; y<N; y++){ printf("%d\t",A[u][y]); if(y==(N-1))printf("\n");} } printf("\n"); k++; } }
Решение задачи: «Как привести матрицу к унитреульной матрице или верхней треугольной матрице?»
textual
Листинг программы
#define FOR_k for (int k = 0; k < dim; ++k) #define FOR_j for (int j = 0; j < dim; ++j) #define FOR_i for (int i = k + 1; i < dim; ++i) void swap(double &a, double &b) { double temp = a; a = b; b = temp; } void Gauss(double **A, double *B, int dim) { FOR_k { if (A[k][k] == 0.0) { FOR_i { if (A[i][k] != 0.0) { FOR_j swap(A[i][j], A[k][j]); swap(B[i], B[k]); break; } } } double div = A[k][k]; FOR_j A[k][j] /= div; B[k] /= div; FOR_i { double multi = A[i][k]; for (int j = 0; j < dim; ++j) A[i][j] -= multi * A[k][j]; B[i] -= multi * B[k]; } } for (int k = dim - 1; k > 0; --k) { for (int i = k - 1; i + 1 > 0; --i) { double multi = A[i][k]; for (int j = 0; j < dim; ++j) A[i][j] -= multi * A[k][j]; B[i] -= multi * B[k]; } } }
Объяснение кода листинга программы
Код реализует алгоритм обратной подстановки для приведения матрицы к унитреульной матрице или верхней треугольной матрице. Алгоритм состоит из двух частей:
- Прямой ход:
- Перебираем все элементы матрицы, начиная с диагонали и до верхнего треугольника.
- Если элемент на позиции (k,k) равен нулю, то переходим к следующему элементу диагонали.
- Если элемент на позиции (i,k) не равен нулю, то перебираем все элементы, начиная с позиции (k,j) и выполняем следующие действия:
- Меняем местами элементы A[i][j] и A[k][j].
- Меняем местами элементы B[i] и B[k].
- Переходим к следующему элементу диагонали.
- Делим все элементы на диагонали на значение элемента на позиции (k,k).
- Переходим к следующей диагонали.
- Обратный ход:
- Перебираем все элементы матрицы, начиная с диагонали и до главной диагонали.
- Если элемент на позиции (i,k) не равен нулю, то перебираем все элементы, начиная с позиции (k,j) и выполняем следующие действия:
- Меняем местами элементы A[i][j] и A[k][j].
- Меняем местами элементы B[i] и B[k].
- Переходим к следующему элементу диагонали.
- Делим все элементы на диагонали на значение элемента на позиции (k,k).
- Переходим к следующей диагонали. В результате получаем унитреульную матрицу или верхнюю треугольную матрицу.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д