在 C 语言中检查矩阵是否正交

CCBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,你将学习如何在C编程中检查一个方阵是否正交。本实验涵盖以下步骤:读取一个方阵、计算该矩阵的转置,并验证条件AᵀA = I以确定该矩阵是否正交。完成本实验后,你将对矩阵运算及其在使用C语言的线性代数中的应用有全面的理解。

本实验提供了一个循序渐进的指南,从读取一个方阵开始,然后计算该矩阵的转置,最后通过验证条件AᵀA = I来检查该矩阵是否正交。本实验旨在帮助你使用C编程来培养矩阵和线性代数方面的技能,这在包括数据分析、科学计算和工程在内的各个领域都是一项宝贵的技能。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL c(("C")) -.-> c/ControlFlowGroup(["Control Flow"]) c(("C")) -.-> c/CompoundTypesGroup(["Compound Types"]) c(("C")) -.-> c/UserInteractionGroup(["User Interaction"]) c/ControlFlowGroup -.-> c/for_loop("For Loop") c/CompoundTypesGroup -.-> c/arrays("Arrays") c/UserInteractionGroup -.-> c/output("Output") subgraph Lab Skills c/for_loop -.-> lab-435139{{"在 C 语言中检查矩阵是否正交"}} c/arrays -.-> lab-435139{{"在 C 语言中检查矩阵是否正交"}} c/output -.-> lab-435139{{"在 C 语言中检查矩阵是否正交"}} end

读取方阵

在这一步中,你将学习如何在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("Enter matrix elements row by row:\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("Enter the size of the square matrix: ");
    scanf("%d", &size);

    readMatrix(matrix, size);

    // 打印矩阵以验证输入
    printf("\nInput Matrix:\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

示例输出:

Enter the size of the square matrix: 3
Enter matrix elements row by row:
1 0 0
0 1 0
0 0 1

Input Matrix:
1 0 0
0 1 0
0 0 1
解释
  • MAX_SIZE定义了矩阵的最大可能大小
  • readMatrix()函数将一个二维数组及其大小作为参数
  • 用户逐行输入矩阵大小和元素
  • 程序打印输入的矩阵以验证输入是否正确

计算 Aᵀ 并检查 AᵀA = I

在这一步中,你将扩展上一个程序,计算矩阵的转置,并通过验证条件 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("Enter matrix elements row by row:\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("Enter the size of the square matrix: ");
    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

示例输出:

Enter the size of the square matrix: 3
Enter matrix elements row by row:
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("Enter matrix elements row by row:\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

正交矩阵的示例输出:

输入方阵的大小: 3
逐行输入矩阵元素:
1 0 0
0 1 0
0 0 1

--- 矩阵正交性分析 ---
原矩阵:
1 0 0
0 1 0
0 0 1

转置矩阵:
1 0 0
0 1 0
0 0 1

正交性状态: ✓ 正交矩阵
解释: A * Aᵀ = I (单位矩阵)

非正交矩阵的示例输出:

输入方阵的大小: 3
逐行输入矩阵元素:
1 2 3
4 5 6
7 8 9

--- 矩阵正交性分析 ---
原矩阵:
1 2 3
4 5 6
7 8 9

转置矩阵:
1 4 7
2 5 8
3 6 9

正交性状态: ✗ 非正交矩阵
解释: A * Aᵀ ≠ I (非单位矩阵)
解释
  • 添加了 printDetailedOrthogonalityInfo() 函数以提供全面输出
  • 显示原矩阵、转置矩阵和正交性状态
  • 提供正交性条件的清晰解释

总结

在本实验中,你首先学习了如何在C编程中读取一个方阵。你创建了一个程序,允许用户动态输入一个方阵,然后打印输入的矩阵以验证输入是否正确。接下来,你扩展了该程序,以计算输入矩阵的转置,并通过验证条件AᵀA = I来检查该矩阵是否正交。该程序计算转置矩阵与原矩阵的乘积,并检查结果是否为单位矩阵,这表明输入的矩阵是正交的。