C语言矩阵算法实现:结构体、宏定义与命令行交互示例

Owen
Owen
发布时间:2026-10-16| 5人浏览过
原创

本文通过C语言代码实例展示如何利用结构体、宏定义和动态内存分配构建一个基础线性代数矩阵运算库。文中详细说明了如何实现全零、全一、单位及随机等特殊矩阵的生成,并提供了基于字符串解析的命令行交互方法,供开发者参考或用于相关算法的学习。

C语言实现矩阵结构

要实现通用的矩阵操作,首先需要定义一个包含行数、列数、总元素个数以及指向数据内存的指针的结构体。这种设计允许矩阵在不同维度间灵活扩展,并通过指针高效访问底层连续存储的 double 类型数据。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
    int row, col, size;
    double *data;
} Matrix;

特殊矩阵的初始化方法

利用上述结构体,可以通过辅助宏和函数快速生成各类具有特定规律的矩阵。为了简化开发,通常先定义内存初始化的统一接口。

  1. 第1步:编写内存初始化宏

    使用 #define SetBase(mat) 宏来完成矩阵结构体的内存分配与字段赋值(行、列、大小)。

    #define SetBase(mat) \
        (Matrix*)malloc(sizeof(Matrix));\
        mat->row = row;\
        mat->col = col;\
        mat->size = row*col;\
        mat->data = (double*)malloc(mat->size*sizeof(double))
  2. 第2步:实现常用矩阵生成逻辑

    • 常数/全1/全0矩阵: 通过循环将指定数值填充到所有位置。Sames(n, r, c) 负责填充通用常数,并衍生出 Ones 和 Zeros 宏。
    • 对角矩阵/单位矩阵: 先生成零矩阵,再通过索引 i * col + i 仅修改对角线位置的数值。由此扩展出 Eye (单位阵) 宏。
    • 计数矩阵: 遍历整个数组,按顺序填入从 0 开始的递增整数。
    • 随机矩阵: 根据给定的上下界 [L, R],使用取余法生成范围内的随机浮点数。
    //特殊矩阵
    Matrix* Sames(double n, int row, int col){
        Matrix* mat = SetBase(mat);
        for (int i = 0; i < mat->size; i++)
            mat->data[i] = n;
        return mat;    
    }
    #define Ones(row,col) Sames(1,row,col)
    #define Zeros(row,col) Sames(0,row,col)
    
    Matrix* Diag(double n, int row, int col){
        Matrix* mat = Sames(0,row,col);
        for (int i = 0; i < min(row,col) ; i++)
            mat->data[i*col+i] = n;
        return mat;
    }
    #define Eye(row,col) Diag(1,row,col)
    
    Matrix* CountMatrix(int row, int col){
        Matrix* mat = SetBase(mat);
        for (int i = 0; i < mat->size; i++)
            mat->data[i] = i;
        return mat;
    }
    //生成[L,R]范围内的随机矩阵
    Matrix* RandMat(int row,int col, double L, double R){
        Matrix* mat = SetBase(mat);
        int size = R - L;
        for (int i = 0; i < mat->size; i++)
            mat->data[i] = rand() % size + L;
        return mat;
    }

命令行输入与结果验证

为了使这些矩阵生成工具更直观,可以结合字符串解析功能,实现在控制台直接输入如 Ones(3,3) 的命令来触发矩阵生成。

  1. 第1步:建立指令解析结构

    创建一个 Func 结构体来存储提取出的函数名及其参数列表。

    typedef struct {
        char* name;
        int len;
        int numPara;                //参数个数
        double params[MAXLEN];      //参数列表
    } Func;
  2. 第2步:编写字符串提取逻辑

    通过 initFunc 函数扫描输入的字符串,识别括号前后的字符分别作为函数名和参数,完成解析。

  3. 第3步:集成主流程运行测试

    在 main 函数中开启无限循环,监听用户输入。根据解析出的函数名调用对应的矩阵生成宏,并立即调用打印函数输出结果。

以下是完整的功能整合与输出示例:

void printMat(Matrix* mat){
    printf("mat:");
    printf("%dx%d=%d\n", mat->col, mat->row, mat->size);
    for (int i = 0; i < mat->size; i++)
    {
        printf("%f,", mat->data[i]);
        if((i+1) % mat->col == 0)
            printf("\n");
    }
}

int main(){
    char str[MAXLEN];
    Matrix* mat = NULL;
    Func* func = (Func*)malloc(sizeof(Func));
    while(1)
    {
        printf("please input:");
        gets(str); // 注意:实际工程中建议使用 fgets 避免缓冲区溢出
        initFunc(func, str);
        // ... 判断分支省略 ...
        printMat(mat);
    }
}

验证效果如下所示:

PS E:\Code\PL\calc> .\a.exe
please input:Ones(4,4)
mat:4x4=16
1.000000,1.000000,1.000000,1.000000,
...
please input:Eye(3,3)
mat:3x3=9
1.000000,0.000000,0.000000,
0.000000,1.000000,0.000000,
0.000000,0.000000,1.000000,

以上就是C语言线性代数算法实现矩阵示例代码的详细内容,更多关于C语言算法的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。