@Fuch
bmstu student

Почему вначале все работает, а потом нет?

Задача заключается в том, что нужно найти ранг матрицы с помощью элементарных преобразований. Я в. начале привожу её к ступенчатому виду. При к = 0;1 все работает, а дальше выводит нули. Что делать?

#include "stdio.h"
#include "stdlib.h"

double **input_matrix(double **A, int l, int c) {
    double x = 1;
    A = (double **) malloc(l * sizeof(double *));
    for (int i = 0; i < l; ++i) {
        A[i] = (double *) malloc(c * sizeof(double));
        for (int j = 0; j < c; ++j) {
//            double x;
//            scanf("%lf", &x);
            A[i][j] = x;
            ++x;
        }
    }
    for (int i = 0; i < l; ++i) {
        for (int j = 0; j < c; ++j) {
            printf("%lf ", A[i][j]);
        }
        printf("\n");
    }
    printf("\n");
    return A;
}

double **trans_matrix(double **A, int l, int c) {
    double **B = (double **) malloc(c * sizeof(double *));
    for (int i = 0; i < c; ++i) {
        B[i] = (double *) malloc(l * sizeof(double));
    }

    for (int i = 0; i < l; ++i) {
        for (int j = 0; j < c; ++j) {
            B[j][i] = A[i][j];
        }
    }
    return B;

}

void print_matrix(double **A, int l, int c) {
    for (int i = 0; i < l; ++i) {
        for (int j = 0; j < c; ++j) {
            printf("%lf ", A[i][j]);
        }
        printf("\n");
    }
}

void free_matrix(double **A, int l) {
    for (int i = 0; i < l; ++i) {
        free(A[i]);
    }
    free(A);
}

double **rang_matrix(double **A, int l, int c) {
    for (int i = 0; i < c; ++i) {
        if (A[i][i] == 0) {

        } else {
            for (int j = i + 1; j < l; ++j) {
                double temp = A[j][i] / A[i][i];
                for (int k = 0; k < c; ++k) {
                    A[j][k] = A[j][k] - (temp * A[i][k]);
                }

            }
        }
    }
    return A;
}

int main() {
    int l, c;
    printf("Enter the number of line: ");
    scanf("%d", &l);
    printf("Enter the number of column: ");
    scanf("%d", &c);
    double **A = input_matrix(A, l, c);
//    double **B = trans_matrix(A, l, c);
//    print_matrix(B, c, l);
    A = rang_matrix(A, l, c);
    print_matrix(A, l, c);
//    free_matrix(B, c);
    free_matrix(A, l);

    return 0;
}
  • Вопрос задан
  • 99 просмотров
Пригласить эксперта
Ответы на вопрос 1
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
Потому что кривой алгоритм. Вы пропускаете те строки, где 0 на диагонали стоит. А надо искать строку, где в i-ом столбце стоит не 0 и менять ее с i-ой строкой сначала. Перечитайте алгоритм в методичке. Или погуглите алгоритм гаусса.

Да и я уж не помню, для не квадратных матриц ранг вообще определен-то?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы