服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C语言线性代数算法实现矩阵示例代码

C语言线性代数算法实现矩阵示例代码

2022-01-25 14:36微小冷 C/C++

这篇文章主要为大家介绍了使用C语言线性代数的算法来实现矩阵示例代码,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步

C语言实现矩阵

矩阵作为一个结构体而言,至少要包含行数、列数以及数据。

?
1
2
3
4
5
6
7
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct{
    int row, col, size;
    double *data;
} Matrix;

特殊矩阵

接下来通过这个结构体实现一些特殊的矩阵,例如包括相同元素的矩阵、对角矩阵等。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#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))
//特殊矩阵
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;
}

特殊矩阵验证

由于要识别输入的函数,所以先新建一个函数的结构体

?
1
2
3
4
5
6
typedef struct{
    char* name;
    int len;
    int numPara;                //参数个数
    double params[MAXLEN];      //参数列表
}Func;

然后通过字符串来生成Func

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//用于识别函数
void initFunc(Func* func,char* str){
    int i = -1;
    int j = 0;
    while(str[++i]!='('){}
    func->len = i;
    func->name = (char*)malloc(sizeof(char)*func->len);
    for (j = 0; j < i; j++)
        func->name[j] = str[j];
    func->name[i] = '\0';
    int start = ++i;
    char temp[MAXLEN];
    j = 0;   
    while (str[i]!=')')
    {
        if(str[i]==','){
            temp[i-start]='\0';
            start = i+1;
            func->params[j]=atof(temp);
            j++;
        }else
            temp[i-start]=str[i];
        i++;
    }
    temp[i-start]='\0';
    func->params[j]=atof(temp);
    func->numPara = j+1;
}

接下来需要实现打印矩阵的函数

?
1
2
3
4
5
6
7
8
9
10
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");
    }
}

最后是main函数

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
int isFunc(Func* func, char* str){
    for (int i = 0; i < func->len; i++)
    {
        if(func->name[i]!=str[i])
            return FALSE;
        if(str[i]=='\0')
            return FALSE;
    }
    return TRUE;
}
#define intPara (int)func->params
#define floatPara func->params
//#define isFunc(str) strcmp(func->name,str)
int main(){
    //char* str = (char*)malloc(sizeof(char) * MAXLEN);
    char str[MAXLEN];
    Matrix* mat = NULL;
    Func* func = (Func*)malloc(sizeof(func));
    while(1)
    {
        printf("please input:");
        gets(str);
        initFunc(func,str);
        if(isFunc(func,"Sames"))
            mat = Sames(floatPara[0],intPara[1],intPara[2]);
        else if(isFunc(func,"Ones"))
            mat = Ones(intPara[0],intPara[1]);
        else if(isFunc(func,"Zeros"))
            mat = Zeros(intPara[0],intPara[1]);
        else if(isFunc(func,"Diag"))
            mat = Diag(floatPara[0],intPara[1],intPara[2]);
        else if(isFunc(func,"Eye"))
            mat = Eye(intPara[0],intPara[1]);
        else if(isFunc(func,"CountMatrix"))
            mat = CountMatrix(intPara[0],intPara[1]);
        else if(isFunc(func,"RandMat"))
            mat = RandMat(intPara[0],intPara[1],
                        floatPara[2],floatPara[3]);
        else
            continue;
        printMat(mat);
    }
}

验证一下

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
PS E:\Code\PL\calc> .\a.exe
please input:Ones(4,4)
mat:4x4=16
1.000000,1.000000,1.000000,1.000000,
1.000000,1.000000,1.000000,1.000000,
1.000000,1.000000,1.000000,1.000000,
1.000000,1.000000,1.000000,1.000000,
please input:Zeros(3,5)
mat:5x3=15
0.000000,0.000000,0.000000,0.000000,0.000000,
0.000000,0.000000,0.000000,0.000000,0.000000,
0.000000,0.000000,0.000000,0.000000,0.000000,
please input:RandMat(3,3,0,100)
mat:3x3=9
41.000000,67.000000,34.000000,
0.000000,69.000000,24.000000,
78.000000,58.000000,62.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,
please input:CountMatrix(2,4)
mat:4x2=8
0.000000,1.000000,2.000000,3.000000,
4.000000,5.000000,6.000000,7.000000,

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

原文链接:https://blog.csdn.net/m0_37816922/article/details/120622463?spm=1001.2014.3001.5501

延伸 · 阅读

精彩推荐
  • C/C++深入C++拷贝构造函数的总结详解

    深入C++拷贝构造函数的总结详解

    本篇文章是对C++中拷贝构造函数进行了总结与介绍。需要的朋友参考下...

    C++教程网5182020-11-30
  • C/C++关于C语言中E-R图的详解

    关于C语言中E-R图的详解

    今天小编就为大家分享一篇关于关于C语言中E-R图的详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看...

    Struggler095962021-07-12
  • C/C++c/c++实现获取域名的IP地址

    c/c++实现获取域名的IP地址

    本文给大家汇总介绍了使用c/c++实现获取域名的IP地址的几种方法以及这些方法的核心函数gethostbyname的详细用法,非常的实用,有需要的小伙伴可以参考下...

    C++教程网10262021-03-16
  • C/C++C语言main函数的三种形式实例详解

    C语言main函数的三种形式实例详解

    这篇文章主要介绍了 C语言main函数的三种形式实例详解的相关资料,需要的朋友可以参考下...

    ieearth6912021-05-16
  • C/C++使用C++制作简单的web服务器(续)

    使用C++制作简单的web服务器(续)

    本文承接上文《使用C++制作简单的web服务器》,把web服务器做的功能稍微强大些,主要增加的功能是从文件中读取网页并返回给客户端,而不是把网页代码...

    C++教程网5492021-02-22
  • C/C++C语言实现双人五子棋游戏

    C语言实现双人五子棋游戏

    这篇文章主要为大家详细介绍了C语言实现双人五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    两片空白7312021-11-12
  • C/C++c/c++内存分配大小实例讲解

    c/c++内存分配大小实例讲解

    在本篇文章里小编给大家整理了一篇关于c/c++内存分配大小实例讲解内容,有需要的朋友们可以跟着学习参考下。...

    jihite5172022-02-22
  • C/C++OpenCV实现拼接图像的简单方法

    OpenCV实现拼接图像的简单方法

    这篇文章主要为大家详细介绍了OpenCV实现拼接图像的简单方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    iteye_183805102021-07-29