Проверка ортогональности матрицы на C

CBeginner
Практиковаться сейчас

Введение

В этом лабораторном практикуме вы научитесь проверять, является ли квадратная матрица ортогональной на языке программирования C. Практикум охватывает следующие шаги: чтение квадратной матрицы, вычисление транспонированной матрицы и проверку условия AᵀA = I для определения ортогональности матрицы. К концу этого практикума вы получите глубокое понимание матричных операций и их применения в линейной алгебре с использованием языка C.

Практикум предоставляет пошаговое руководство, начиная с чтения квадратной матрицы, затем вычисления транспонированной матрицы и, наконец, проверки ортогональности матрицы путем проверки условия AᵀA = I. Этот практикум разработан для развития ваших навыков работы с матрицами и линейной алгеброй с использованием языка программирования C, что является ценным навыком в различных областях, включая анализ данных, научные вычисления и инженерное дело.

Чтение квадратной матрицы

В этом шаге вы узнаете, как читать квадратную матрицу на языке C. Квадратная матрица — это матрица с одинаковым количеством строк и столбцов. Мы создадим программу, которая позволит пользователю динамически вводить квадратную матрицу.

Сначала создадим файл исходного кода C для наших матричных операций:

cd ~/project
nano matrix_orthogonal.c

Теперь добавим следующий код для чтения квадратной матрицы:

#include <stdio.h>
#define MAX_SIZE 100

void readMatrix(int matrix[MAX_SIZE][MAX_SIZE], int size) {
    printf("Введите элементы матрицы построчно:\n");
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            scanf("%d", &matrix[i][j]);
        }
    }
}

int main() {
    int size, matrix[MAX_SIZE][MAX_SIZE];

    printf("Введите размер квадратной матрицы: ");
    scanf("%d", &size);

    readMatrix(matrix, size);

    // Вывод матрицы для проверки ввода
    printf("\nВведённая матрица:\n");
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }

    return 0;
}

Компилируем и запускаем программу:

gcc matrix_orthogonal.c -o matrix_orthogonal
./matrix_orthogonal

Пример вывода:

Введите размер квадратной матрицы: 3
Введите элементы матрицы построчно:
1 0 0
0 1 0
0 0 1

Введённая матрица:
1 0 0
0 1 0
0 0 1
Объяснение
  • MAX_SIZE определяет максимальный возможный размер матрицы
  • Функция readMatrix() принимает двумерный массив и его размер в качестве параметров
  • Пользователь вводит размер матрицы и элементы построчно
  • Программа выводит введённую матрицу для проверки правильности ввода

Вычисление Aᵀ и проверка на ортогональность

В этом шаге вы расширите предыдущую программу, чтобы вычислить транспонированную матрицу и проверить, является ли матрица ортогональной, проверив условие AᵀA = I.

Обновите файл matrix_orthogonal.c следующим кодом:

nano ~/project/matrix_orthogonal.c

Добавьте следующее реализацию:

#include <stdio.h>
#include <stdbool.h>
#define MAX_SIZE 100

void readMatrix(int matrix[MAX_SIZE][MAX_SIZE], int size) {
    printf("Введите элементы матрицы построчно:\n");
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            scanf("%d", &matrix[i][j]);
        }
    }
}

void transposeMatrix(int original[MAX_SIZE][MAX_SIZE],
                     int transpose[MAX_SIZE][MAX_SIZE],
                     int size) {
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            transpose[j][i] = original[i][j];
        }
    }
}

bool checkOrthogonality(int matrix[MAX_SIZE][MAX_SIZE],
                        int transpose[MAX_SIZE][MAX_SIZE],
                        int size) {
    int result[MAX_SIZE][MAX_SIZE] = {0};

    // Умножение транспонированной и исходной матриц
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            for (int k = 0; k < size; k++) {
                result[i][j] += transpose[i][k] * matrix[k][j];
            }
        }
    }

    // Проверка, является ли результат единичной матрицей
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            if (i == j && result[i][j] != 1) return false;
            if (i != j && result[i][j] != 0) return false;
        }
    }

    return true;
}

int main() {
    int size, matrix[MAX_SIZE][MAX_SIZE], transpose[MAX_SIZE][MAX_SIZE];

    printf("Введите размер квадратной матрицы: ");
    scanf("%d", &size);

    readMatrix(matrix, size);

    // Вычисление транспонированной матрицы
    transposeMatrix(matrix, transpose, size);

    // Проверка ортогональности
    bool isOrthogonal = checkOrthogonality(matrix, transpose, size);

    printf("\nТранспонированная матрица:\n");
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            printf("%d ", transpose[i][j]);
        }
        printf("\n");
    }

    printf("\nЯвляется ли матрица ортогональной? %s\n",
           isOrthogonal ? "Да" : "Нет");

    return 0;
}

Компилируем и запускаем программу:

gcc matrix_orthogonal.c -o matrix_orthogonal
./matrix_orthogonal

Пример вывода:

Введите размер квадратной матрицы: 3
Введите элементы матрицы построчно:
1 0 0
0 1 0
0 0 1

Транспонированная матрица:
1 0 0
0 1 0
0 0 1

Является ли матрица ортогональной? Да
Объяснение
  • Функция transposeMatrix() вычисляет транспонированную матрицу
  • Функция checkOrthogonality() проверяет условие AᵀA = I
  • Программа проверяет, является ли матрица ортогональной, умножая транспонированную и исходную матрицы.

Вывод информации об ортогональности

В этом заключительном шаге вы улучшите предыдущую программу, чтобы получить более подробную информацию об ортогональности матрицы и продемонстрировать различные сценарии матриц.

Обновите файл matrix_orthogonal.c следующим улучшенным кодом:

nano ~/project/matrix_orthogonal.c

Замените предыдущую реализацию на:

#include <stdio.h>
#include <stdbool.h>
#define MAX_SIZE 100

void readMatrix(int matrix[MAX_SIZE][MAX_SIZE], int size) {
    printf("Введите элементы матрицы построчно:\n");
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            scanf("%d", &matrix[i][j]);
        }
    }
}

void transposeMatrix(int original[MAX_SIZE][MAX_SIZE],
                     int transpose[MAX_SIZE][MAX_SIZE],
                     int size) {
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            transpose[j][i] = original[i][j];
        }
    }
}

bool checkOrthogonality(int matrix[MAX_SIZE][MAX_SIZE],
                        int transpose[MAX_SIZE][MAX_SIZE],
                        int size) {
    int result[MAX_SIZE][MAX_SIZE] = {0};

    // Умножение транспонированной и исходной матриц
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            for (int k = 0; k < size; k++) {
                result[i][j] += transpose[i][k] * matrix[k][j];
            }
        }
    }

    // Проверка, является ли результат единичной матрицей
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            if (i == j && result[i][j] != 1) return false;
            if (i != j && result[i][j] != 0) return false;
        }
    }

    return true;
}

void printDetailedOrthogonalityInfo(int matrix[MAX_SIZE][MAX_SIZE],
                                    int transpose[MAX_SIZE][MAX_SIZE],
                                    int size) {
    bool isOrthogonal = checkOrthogonality(matrix, transpose, size);

    printf("\n--- Анализ ортогональности матрицы ---\n");
    printf("Исходная матрица:\n");
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }

    printf("\nТранспонированная матрица:\n");
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            printf("%d ", transpose[i][j]);
        }
        printf("\n");
    }

    printf("\nСтатус ортогональности: %s\n",
           isOrthogonal ? "✓ Ортогональная матрица" : "✗ Не ортогональная матрица");

    if (isOrthogonal) {
        printf("Объяснение: A * Aᵀ = I (Единичная матрица)\n");
    } else {
        printf("Объяснение: A * Aᵀ ≠ I (Не единичная матрица)\n");
    }
}

int main() {
    int size, matrix[MAX_SIZE][MAX_SIZE], transpose[MAX_SIZE][MAX_SIZE];

    printf("Введите размер квадратной матрицы: ");
    scanf("%d", &size);

    readMatrix(matrix, size);
    transposeMatrix(matrix, transpose, size);
    printDetailedOrthogonalityInfo(matrix, transpose, size);

    return 0;
}

Компилируем и запускаем программу:

gcc matrix_orthogonal.c -o matrix_orthogonal
./matrix_orthogonal

Пример вывода для ортогональной матрицы:

... (вывод)

Пример вывода для неортогональной матрицы:

... (вывод)
Объяснение
  • Добавлена функция printDetailedOrthogonalityInfo() для предоставления исчерпывающего вывода
  • Отображаются исходная матрица, транспонированная матрица и статус ортогональности
  • Предоставляется ясное объяснение условия ортогональности

Резюме

В этом лабораторном практикуме вы сначала изучили, как читать квадратную матрицу на языке C. Вы создали программу, которая позволяет пользователям динамически вводить квадратную матрицу, а затем выводит введенную матрицу для проверки правильности ввода. Далее вы расширили программу, чтобы вычислить транспонированную матрицу введенных данных и проверить, является ли матрица ортогональной, проверив условие AᵀA = I. Программа вычисляет произведение транспонированной и исходной матриц и проверяет, является ли результат единичной матрицей, что указывает на ортогональность введенной матрицы.