C语言需要掌握的基础知识点之矩阵

C语言需要掌握的基础知识点之矩阵

矩阵是数学和计算机科学中的重要概念,在C语言中通常用二维数组来表示。矩阵在图形处理、科学计算、机器学习等领域有广泛应用。

矩阵的基本概念

矩阵是一个按照长方阵列排列的数值集合,由行和列组成。在C语言中,我们使用二维数组来表示矩阵。

矩阵的声明和初始化

静态矩阵

c 复制代码
#include <stdio.h>

#define ROWS 3
#define COLS 3

void staticMatrixDemo() {
    printf("=== 静态矩阵演示 ===\n");
    
    // 方法1:声明时初始化
    int matrix1[ROWS][COLS] = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };
    
    // 方法2:先声明后赋值
    int matrix2[ROWS][COLS];
    int value = 1;
    for (int i = 0; i < ROWS; i++) {
        for (int j = 0; j < COLS; j++) {
            matrix2[i][j] = value++;
        }
    }
    
    // 打印矩阵
    printf("矩阵1:\n");
    for (int i = 0; i < ROWS; i++) {
        for (int j = 0; j < COLS; j++) {
            printf("%d ", matrix1[i][j]);
        }
        printf("\n");
    }
    
    printf("\n矩阵2:\n");
    for (int i = 0; i < ROWS; i++) {
        for (int j = 0; j < COLS; j++) {
            printf("%d ", matrix2[i][j]);
        }
        printf("\n");
    }
}

动态矩阵

c 复制代码
#include <stdio.h>
#include <stdlib.h>

void dynamicMatrixDemo() {
    printf("\n=== 动态矩阵演示 ===\n");
    
    int rows, cols;
    printf("请输入矩阵的行数和列数: ");
    scanf("%d %d", &rows, &cols);
    
    // 方法1:使用指针数组(推荐)
    int **matrix1 = (int**)malloc(rows * sizeof(int*));
    for (int i = 0; i < rows; i++) {
        matrix1[i] = (int*)malloc(cols * sizeof(int));
    }
    
    // 初始化矩阵
    int counter = 1;
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            matrix1[i][j] = counter++;
        }
    }
    
    // 方法2:使用一维数组模拟二维数组
    int *matrix2 = (int*)malloc(rows * cols * sizeof(int));
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            matrix2[i * cols + j] = counter++;
        }
    }
    
    // 打印矩阵
    printf("\n方法1 - 指针数组:\n");
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%2d ", matrix1[i][j]);
        }
        printf("\n");
    }
    
    printf("\n方法2 - 一维数组模拟:\n");
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%2d ", matrix2[i * cols + j]);
        }
        printf("\n");
    }
    
    // 释放内存
    for (int i = 0; i < rows; i++) {
        free(matrix1[i]);
    }
    free(matrix1);
    free(matrix2);
}

矩阵的基本运算

矩阵相加

c 复制代码
#include <stdio.h>
#include <stdlib.h>

// 矩阵相加
int** matrixAddition(int **A, int **B, int rows, int cols) {
    int **result = (int**)malloc(rows * sizeof(int*));
    for (int i = 0; i < rows; i++) {
        result[i] = (int*)malloc(cols * sizeof(int));
        for (int j = 0; j < cols; j++) {
            result[i][j] = A[i][j] + B[i][j];
        }
    }
    return result;
}

// 创建测试矩阵
int** createTestMatrix(int rows, int cols, int startValue) {
    int **matrix = (int**)malloc(rows * sizeof(int*));
    for (int i = 0; i < rows; i++) {
        matrix[i] = (int*)malloc(cols * sizeof(int));
        for (int j = 0; j < cols; j++) {
            matrix[i][j] = startValue++;
        }
    }
    return matrix;
}

// 打印矩阵
void printMatrix(int **matrix, int rows, int cols, const char *name) {
    printf("%s:\n", name);
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%3d ", matrix[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}

// 释放矩阵内存
void freeMatrix(int **matrix, int rows) {
    for (int i = 0; i < rows; i++) {
        free(matrix[i]);
    }
    free(matrix);
}

void matrixOperationsDemo() {
    printf("=== 矩阵基本运算演示 ===\n");
    
    int rows = 3, cols = 3;
    
    // 创建测试矩阵
    int **A = createTestMatrix(rows, cols, 1);
    int **B = createTestMatrix(rows, cols, 10);
    
    printMatrix(A, rows, cols, "矩阵 A");
    printMatrix(B, rows, cols, "矩阵 B");
    
    // 矩阵相加
    int **C = matrixAddition(A, B, rows, cols);
    printMatrix(C, rows, cols, "A + B");
    
    // 释放内存
    freeMatrix(A, rows);
    freeMatrix(B, rows);
    freeMatrix(C, rows);
}

矩阵相乘

c 复制代码
#include <stdio.h>
#include <stdlib.h>

// 矩阵相乘
int** matrixMultiplication(int **A, int **B, int rowsA, int colsA, int colsB) {
    int **result = (int**)malloc(rowsA * sizeof(int*));
    for (int i = 0; i < rowsA; i++) {
        result[i] = (int*)malloc(colsB * sizeof(int));
        for (int j = 0; j < colsB; j++) {
            result[i][j] = 0;
            for (int k = 0; k < colsA; k++) {
                result[i][j] += A[i][k] * B[k][j];
            }
        }
    }
    return result;
}

void matrixMultiplicationDemo() {
    printf("\n=== 矩阵相乘演示 ===\n");
    
    int rowsA = 2, colsA = 3;
    int rowsB = 3, colsB = 2;
    
    // 创建矩阵 A (2x3)
    int **A = (int**)malloc(rowsA * sizeof(int*));
    int value = 1;
    for (int i = 0; i < rowsA; i++) {
        A[i] = (int*)malloc(colsA * sizeof(int));
        for (int j = 0; j < colsA; j++) {
            A[i][j] = value++;
        }
    }
    
    // 创建矩阵 B (3x2)
    int **B = (int**)malloc(rowsB * sizeof(int*));
    value = 1;
    for (int i = 0; i < rowsB; i++) {
        B[i] = (int*)malloc(colsB * sizeof(int));
        for (int j = 0; j < colsB; j++) {
            B[i][j] = value++;
        }
    }
    
    printMatrix(A, rowsA, colsA, "矩阵 A (2x3)");
    printMatrix(B, rowsB, colsB, "矩阵 B (3x2)");
    
    // 矩阵相乘
    int **C = matrixMultiplication(A, B, rowsA, colsA, colsB);
    printMatrix(C, rowsA, colsB, "A × B (2x2)");
    
    freeMatrix(A, rowsA);
    freeMatrix(B, rowsB);
    freeMatrix(C, rowsA);
}

矩阵转置

c 复制代码
#include <stdio.h>
#include <stdlib.h>

// 矩阵转置
int** matrixTranspose(int **matrix, int rows, int cols) {
    int **transpose = (int**)malloc(cols * sizeof(int*));
    for (int i = 0; i < cols; i++) {
        transpose[i] = (int*)malloc(rows * sizeof(int));
        for (int j = 0; j < rows; j++) {
            transpose[i][j] = matrix[j][i];
        }
    }
    return transpose;
}

void matrixTransposeDemo() {
    printf("\n=== 矩阵转置演示 ===\n");
    
    int rows = 3, cols = 4;
    
    int **matrix = createTestMatrix(rows, cols, 1);
    printMatrix(matrix, rows, cols, "原矩阵");
    
    int **transpose = matrixTranspose(matrix, rows, cols);
    printMatrix(transpose, cols, rows, "转置矩阵");
    
    freeMatrix(matrix, rows);
    freeMatrix(transpose, cols);
}

高级矩阵操作

矩阵行列式计算

c 复制代码
#include <stdio.h>
#include <stdlib.h>

// 计算2x2矩阵的行列式
int determinant2x2(int **matrix) {
    return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0];
}

// 计算3x3矩阵的行列式
int determinant3x3(int **matrix) {
    return matrix[0][0] * (matrix[1][1] * matrix[2][2] - matrix[1][2] * matrix[2][1]) -
           matrix[0][1] * (matrix[1][0] * matrix[2][2] - matrix[1][2] * matrix[2][0]) +
           matrix[0][2] * (matrix[1][0] * matrix[2][1] - matrix[1][1] * matrix[2][0]);
}

// 获取子矩阵(用于计算余子式)
int** getSubmatrix(int **matrix, int size, int row, int col) {
    int **submatrix = (int**)malloc((size-1) * sizeof(int*));
    int sub_i = 0;
    
    for (int i = 0; i < size; i++) {
        if (i == row) continue;
        
        submatrix[sub_i] = (int*)malloc((size-1) * sizeof(int));
        int sub_j = 0;
        
        for (int j = 0; j < size; j++) {
            if (j == col) continue;
            submatrix[sub_i][sub_j++] = matrix[i][j];
        }
        sub_i++;
    }
    return submatrix;
}

// 计算n阶矩阵的行列式(递归)
int determinant(int **matrix, int size) {
    if (size == 1) {
        return matrix[0][0];
    }
    if (size == 2) {
        return determinant2x2(matrix);
    }
    
    int det = 0;
    int sign = 1;
    
    for (int j = 0; j < size; j++) {
        int **submatrix = getSubmatrix(matrix, size, 0, j);
        det += sign * matrix[0][j] * determinant(submatrix, size-1);
        sign = -sign;
        
        freeMatrix(submatrix, size-1);
    }
    
    return det;
}

void determinantDemo() {
    printf("=== 矩阵行列式计算 ===\n");
    
    // 测试2x2矩阵
    int rows2 = 2;
    int **matrix2 = createTestMatrix(rows2, rows2, 1);
    printMatrix(matrix2, rows2, rows2, "2x2矩阵");
    printf("行列式: %d\n\n", determinant(matrix2, rows2));
    
    // 测试3x3矩阵
    int rows3 = 3;
    int **matrix3 = createTestMatrix(rows3, rows3, 1);
    printMatrix(matrix3, rows3, rows3, "3x3矩阵");
    printf("行列式: %d\n\n", determinant(matrix3, rows3));
    
    freeMatrix(matrix2, rows2);
    freeMatrix(matrix3, rows3);
}

矩阵求逆(伴随矩阵法)

c 复制代码
#include <stdio.h>
#include <stdlib.h>

// 计算代数余子式
int cofactor(int **matrix, int size, int row, int col) {
    int **submatrix = getSubmatrix(matrix, size, row, col);
    int det = determinant(submatrix, size-1);
    freeMatrix(submatrix, size-1);
    
    return ((row + col) % 2 == 0) ? det : -det;
}

// 矩阵求逆
double** matrixInverse(int **matrix, int size) {
    int det = determinant(matrix, size);
    if (det == 0) {
        printf("矩阵不可逆(行列式为0)\n");
        return NULL;
    }
    
    // 创建伴随矩阵
    double **adjugate = (double**)malloc(size * sizeof(double*));
    for (int i = 0; i < size; i++) {
        adjugate[i] = (double*)malloc(size * sizeof(double));
        for (int j = 0; j < size; j++) {
            adjugate[i][j] = (double)cofactor(matrix, size, j, i) / det;
        }
    }
    
    return adjugate;
}

// 打印浮点数矩阵
void printDoubleMatrix(double **matrix, int rows, int cols, const char *name) {
    printf("%s:\n", name);
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%8.3f ", matrix[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}

void matrixInverseDemo() {
    printf("\n=== 矩阵求逆演示 ===\n");
    
    int size = 3;
    
    // 创建一个可逆矩阵
    int **matrix = (int**)malloc(size * sizeof(int*));
    matrix[0] = (int[]){2, -1, 0};
    matrix[1] = (int[]){-1, 2, -1};
    matrix[2] = (int[]){0, -1, 2};
    
    printMatrix(matrix, size, size, "原矩阵");
    
    double **inverse = matrixInverse(matrix, size);
    if (inverse != NULL) {
        printDoubleMatrix(inverse, size, size, "逆矩阵");
        
        // 验证:原矩阵 × 逆矩阵 = 单位矩阵
        printf("验证(原矩阵 × 逆矩阵 ≈ 单位矩阵):\n");
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < size; j++) {
                double sum = 0;
                for (int k = 0; k < size; k++) {
                    sum += matrix[i][k] * inverse[k][j];
                }
                printf("%8.3f ", sum);
            }
            printf("\n");
        }
        
        // 释放逆矩阵内存
        for (int i = 0; i < size; i++) {
            free(inverse[i]);
        }
        free(inverse);
    }
    
    freeMatrix(matrix, size);
}

矩阵的应用

线性方程组求解(高斯消元法)

c 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

// 高斯消元法求解线性方程组
void gaussianElimination(double **A, double *b, int n) {
    // 前向消元
    for (int i = 0; i < n; i++) {
        // 部分主元选择
        int maxRow = i;
        for (int k = i + 1; k < n; k++) {
            if (fabs(A[k][i]) > fabs(A[maxRow][i])) {
                maxRow = k;
            }
        }
        
        // 交换行
        if (maxRow != i) {
            for (int k = i; k < n; k++) {
                double temp = A[i][k];
                A[i][k] = A[maxRow][k];
                A[maxRow][k] = temp;
            }
            double temp = b[i];
            b[i] = b[maxRow];
            b[maxRow] = temp;
        }
        
        // 消元
        for (int k = i + 1; k < n; k++) {
            double factor = A[k][i] / A[i][i];
            for (int j = i; j < n; j++) {
                A[k][j] -= factor * A[i][j];
            }
            b[k] -= factor * b[i];
        }
    }
    
    // 回代
    double *x = (double*)malloc(n * sizeof(double));
    for (int i = n - 1; i >= 0; i--) {
        x[i] = b[i];
        for (int j = i + 1; j < n; j++) {
            x[i] -= A[i][j] * x[j];
        }
        x[i] /= A[i][i];
    }
    
    // 输出解
    printf("方程组的解:\n");
    for (int i = 0; i < n; i++) {
        printf("x%d = %.6f\n", i + 1, x[i]);
    }
    
    free(x);
}

void linearEquationsDemo() {
    printf("\n=== 线性方程组求解(高斯消元法) ===\n");
    
    int n = 3;
    
    // 系数矩阵 A
    double **A = (double**)malloc(n * sizeof(double*));
    A[0] = (double[]){2.0, 1.0, -1.0};
    A[1] = (double[]){-3.0, -1.0, 2.0};
    A[2] = (double[]){-2.0, 1.0, 2.0};
    
    // 常数向量 b
    double *b = (double[]){8.0, -11.0, -3.0};
    
    printf("系数矩阵 A:\n");
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf("%6.1f ", A[i][j]);
        }
        printf("\n");
    }
    
    printf("\n常数向量 b:\n");
    for (int i = 0; i < n; i++) {
        printf("%6.1f\n", b[i]);
    }
    printf("\n");
    
    gaussianElimination(A, b, n);
    
    free(A[0]);
    free(A[1]);
    free(A[2]);
    free(A);
}

图像处理中的矩阵操作(卷积)

c 复制代码
#include <stdio.h>
#include <stdlib.h>

// 图像卷积操作
int** imageConvolution(int **image, int imageRows, int imageCols, 
                      double **kernel, int kernelSize) {
    int padding = kernelSize / 2;
    int outputRows = imageRows - 2 * padding;
    int outputCols = imageCols - 2 * padding;
    
    int **output = (int**)malloc(outputRows * sizeof(int*));
    for (int i = 0; i < outputRows; i++) {
        output[i] = (int*)malloc(outputCols * sizeof(int));
        for (int j = 0; j < outputCols; j++) {
            double sum = 0.0;
            
            // 应用卷积核
            for (int ki = 0; ki < kernelSize; ki++) {
                for (int kj = 0; kj < kernelSize; kj++) {
                    int image_i = i + ki;
                    int image_j = j + kj;
                    sum += image[image_i][image_j] * kernel[ki][kj];
                }
            }
            
            // 确保像素值在合理范围内
            output[i][j] = (int)sum;
            if (output[i][j] < 0) output[i][j] = 0;
            if (output[i][j] > 255) output[i][j] = 255;
        }
    }
    
    return output;
}

void imageProcessingDemo() {
    printf("\n=== 图像处理 - 卷积操作 ===\n");
    
    // 创建测试图像(6x6灰度图)
    int imageRows = 6, imageCols = 6;
    int **image = createTestMatrix(imageRows, imageCols, 10);
    
    printf("原始图像:\n");
    printMatrix(image, imageRows, imageCols, "");
    
    // 创建模糊卷积核(3x3)
    int kernelSize = 3;
    double **kernel = (double**)malloc(kernelSize * sizeof(double*));
    kernel[0] = (double[]){1/9.0, 1/9.0, 1/9.0};
    kernel[1] = (double[]){1/9.0, 1/9.0, 1/9.0};
    kernel[2] = (double[]){1/9.0, 1/9.0, 1/9.0};
    
    printf("卷积核(模糊):\n");
    for (int i = 0; i < kernelSize; i++) {
        for (int j = 0; j < kernelSize; j++) {
            printf("%5.3f ", kernel[i][j]);
        }
        printf("\n");
    }
    printf("\n");
    
    // 应用卷积
    int **blurredImage = imageConvolution(image, imageRows, imageCols, kernel, kernelSize);
    
    printf("模糊后的图像:\n");
    printMatrix(blurredImage, imageRows - 2, imageCols - 2, "");
    
    freeMatrix(image, imageRows);
    freeMatrix(blurredImage, imageRows - 2);
    free(kernel[0]);
    free(kernel[1]);
    free(kernel[2]);
    free(kernel);
}

矩阵工具函数库

完整的矩阵操作库

c 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

// 矩阵结构体
typedef struct {
    double **data;
    int rows;
    int cols;
} Matrix;

// 创建矩阵
Matrix* createMatrix(int rows, int cols) {
    Matrix *matrix = (Matrix*)malloc(sizeof(Matrix));
    matrix->rows = rows;
    matrix->cols = cols;
    
    matrix->data = (double**)malloc(rows * sizeof(double*));
    for (int i = 0; i < rows; i++) {
        matrix->data[i] = (double*)malloc(cols * sizeof(double));
        for (int j = 0; j < cols; j++) {
            matrix->data[i][j] = 0.0;
        }
    }
    
    return matrix;
}

// 从数组创建矩阵
Matrix* createMatrixFromArray(double *array, int rows, int cols) {
    Matrix *matrix = createMatrix(rows, cols);
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            matrix->data[i][j] = array[i * cols + j];
        }
    }
    return matrix;
}

// 复制矩阵
Matrix* copyMatrix(Matrix *src) {
    Matrix *dest = createMatrix(src->rows, src->cols);
    for (int i = 0; i < src->rows; i++) {
        for (int j = 0; j < src->cols; j++) {
            dest->data[i][j] = src->data[i][j];
        }
    }
    return dest;
}

// 打印矩阵
void printMatrixStruct(Matrix *matrix, const char *name) {
    printf("%s (%dx%d):\n", name, matrix->rows, matrix->cols);
    for (int i = 0; i < matrix->rows; i++) {
        for (int j = 0; j < matrix->cols; j++) {
            printf("%8.3f ", matrix->data[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}

// 矩阵相加
Matrix* matrixAdd(Matrix *A, Matrix *B) {
    if (A->rows != B->rows || A->cols != B->cols) {
        printf("矩阵维度不匹配,无法相加\n");
        return NULL;
    }
    
    Matrix *result = createMatrix(A->rows, A->cols);
    for (int i = 0; i < A->rows; i++) {
        for (int j = 0; j < A->cols; j++) {
            result->data[i][j] = A->data[i][j] + B->data[i][j];
        }
    }
    return result;
}

// 矩阵相乘
Matrix* matrixMultiply(Matrix *A, Matrix *B) {
    if (A->cols != B->rows) {
        printf("矩阵维度不匹配,无法相乘\n");
        return NULL;
    }
    
    Matrix *result = createMatrix(A->rows, B->cols);
    for (int i = 0; i < A->rows; i++) {
        for (int j = 0; j < B->cols; j++) {
            result->data[i][j] = 0.0;
            for (int k = 0; k < A->cols; k++) {
                result->data[i][j] += A->data[i][k] * B->data[k][j];
            }
        }
    }
    return result;
}

// 矩阵转置
Matrix* matrixTransposeStruct(Matrix *matrix) {
    Matrix *result = createMatrix(matrix->cols, matrix->rows);
    for (int i = 0; i < matrix->rows; i++) {
        for (int j = 0; j < matrix->cols; j++) {
            result->data[j][i] = matrix->data[i][j];
        }
    }
    return result;
}

// 释放矩阵内存
void freeMatrixStruct(Matrix *matrix) {
    for (int i = 0; i < matrix->rows; i++) {
        free(matrix->data[i]);
    }
    free(matrix->data);
    free(matrix);
}

void matrixLibraryDemo() {
    printf("=== 矩阵工具库演示 ===\n");
    
    // 创建矩阵
    double arrayA[] = {1, 2, 3, 4, 5, 6};
    double arrayB[] = {7, 8, 9, 10, 11, 12};
    
    Matrix *A = createMatrixFromArray(arrayA, 2, 3);
    Matrix *B = createMatrixFromArray(arrayB, 3, 2);
    
    printMatrixStruct(A, "矩阵 A");
    printMatrixStruct(B, "矩阵 B");
    
    // 矩阵相乘
    Matrix *C = matrixMultiply(A, B);
    if (C != NULL) {
        printMatrixStruct(C, "A × B");
        freeMatrixStruct(C);
    }
    
    // 矩阵转置
    Matrix *AT = matrixTransposeStruct(A);
    printMatrixStruct(AT, "A 的转置");
    
    freeMatrixStruct(A);
    freeMatrixStruct(B);
    freeMatrixStruct(AT);
}

int main() {
    staticMatrixDemo();
    dynamicMatrixDemo();
    matrixOperationsDemo();
    matrixMultiplicationDemo();
    matrixTransposeDemo();
    determinantDemo();
    matrixInverseDemo();
    linearEquationsDemo();
    imageProcessingDemo();
    matrixLibraryDemo();
    
    return 0;
}


相关推荐
摘星编程4 小时前
技术引领场景革新|合合信息PRCV论坛聚焦多模态文本智能前沿实践
合合信息·1024程序员节·textin·多模态文本·fidok
ink@re4 小时前
消息队列集群——RabbitMQ
分布式·rabbitmq·1024程序员节
cs阿坤dn4 小时前
SQL-Server2019离线部署安装【CentOS7.4】
1024程序员节
Pocker_Spades_A4 小时前
金仓多模数据库平替MongoDB的电子证照国产化实践——从2TB数据迁移到1600+并发支撑
数据库·1024程序员节
彭刷子4 小时前
《商户查询缓存案例》使用案例学习Redis的缓存使用;缓存击穿、穿透、雪崩的原理的解决方式
redis·1024程序员节
郝学胜-神的一滴4 小时前
主成分分析(PCA)在计算机图形学中的深入解析与应用
开发语言·人工智能·算法·机器学习·1024程序员节
云边有个稻草人4 小时前
反爬克星还是效率神器?Browser-Use+cpolar重构Web自动化逻辑
cpolar·1024程序员节
weixin_436525074 小时前
若依 - idea集成docker一键部署springboot项目(docker-compose)
java·1024程序员节
超防局4 小时前
SQLMap 终极渗透手册(2025全功能版)
sql·web安全·1024程序员节