Как привести матрицу к унитреульной матрице или верхней треугольной матрице? - 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];
        }
    }                                                    
}

Объяснение кода листинга программы

Код реализует алгоритм обратной подстановки для приведения матрицы к унитреульной матрице или верхней треугольной матрице. Алгоритм состоит из двух частей:

  1. Прямой ход:
    • Перебираем все элементы матрицы, начиная с диагонали и до верхнего треугольника.
    • Если элемент на позиции (k,k) равен нулю, то переходим к следующему элементу диагонали.
    • Если элемент на позиции (i,k) не равен нулю, то перебираем все элементы, начиная с позиции (k,j) и выполняем следующие действия:
      • Меняем местами элементы A[i][j] и A[k][j].
      • Меняем местами элементы B[i] и B[k].
      • Переходим к следующему элементу диагонали.
    • Делим все элементы на диагонали на значение элемента на позиции (k,k).
    • Переходим к следующей диагонали.
  2. Обратный ход:
    • Перебираем все элементы матрицы, начиная с диагонали и до главной диагонали.
    • Если элемент на позиции (i,k) не равен нулю, то перебираем все элементы, начиная с позиции (k,j) и выполняем следующие действия:
      • Меняем местами элементы A[i][j] и A[k][j].
      • Меняем местами элементы B[i] и B[k].
      • Переходим к следующему элементу диагонали.
    • Делим все элементы на диагонали на значение элемента на позиции (k,k).
    • Переходим к следующей диагонали. В результате получаем унитреульную матрицу или верхнюю треугольную матрицу.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4 из 5
Похожие ответы