Введение
В этом лабораторном практикуме вы научитесь проверять, является ли квадратная матрица ортогональной на языке программирования 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. Программа вычисляет произведение транспонированной и исходной матриц и проверяет, является ли результат единичной матрицей, что указывает на ортогональность введенной матрицы.



