C语言线性代数算法实现矩阵示例代码
更新时间:2021年10月19日 16:00 点击:1803
C语言实现矩阵
矩阵作为一个结构体而言,至少要包含行数、列数以及数据。
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct{ int row, col, size; double *data; } Matrix;
特殊矩阵
接下来通过这个结构体实现一些特殊的矩阵,例如包括相同元素的矩阵、对角矩阵等。
#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; }
特殊矩阵验证
由于要识别输入的函数,所以先新建一个函数的结构体
typedef struct{ char* name; int len; int numPara; //参数个数 double params[MAXLEN]; //参数列表 }Func;
然后通过字符串来生成Func
//用于识别函数 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; }
接下来需要实现打印矩阵的函数
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
函数
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); } }
验证一下
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语言算法的资料请关注猪先飞其它相关文章!
上一篇: C语言智能指针之weak_ptr浅析
下一篇: C语言编程中常见的五种错误及对应解决方案
相关文章
- 这篇文章主要为大家详细介绍了C语言实现放烟花的程序,有音乐播放,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-23
- 本篇文章主要介绍C语言中char的知识,并附有代码实例,以便大家在学习的时候更好的理解,有需要的可以看一下...2020-04-25
- 作者:Sabine 【导读】本文介绍了C#的四种排序算法:冒泡排序、选择排序、插入排序和希尔排序 冒泡排序 using System; namespace BubbleSorter { public class Bubb...2020-06-25
- 这篇文章主要用实例讲解C#递归算法的概念以及用法,文中代码非常详细,帮助大家更好的参考和学习,感兴趣的朋友可以了解下...2020-06-25
- 这篇文章主要介绍了详解如何将c语言文件打包成exe可执行程序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-25
- free函数是释放之前某一次malloc函数申请的空间,而且只是释放空间,并不改变指针的值。下面我们就来详细探讨下...2020-04-25
- 这篇文章主要介绍了Python导入数值型Excel数据并生成矩阵操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-06-09
- 这篇文章主要介绍了C语言中计算正弦的相关函数总结,包括正弦和双曲线正弦以及反正弦的函数,需要的朋友可以参考下...2020-04-25
详解C语言中的rename()函数和remove()函数的使用方法
这篇文章主要介绍了详解C语言中的rename()函数和remove()函数的使用方法,是C语言入门学习中的基础知识,需要的朋友可以参考下...2020-04-25- 这篇文章主要介绍了C语言中求和、计算平均值、方差和标准差的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-12-10
- 这篇文章主要为大家详细介绍了C++ Eigen库计算矩阵特征值及特征向量,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25
- 这篇文章主要介绍了R语言创建矩阵的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-05-06
- 本篇文章主要讲解C语言 基本语法,这里提供简单的示例和代码来详细讲解C语言的基本语法,开始学习C语言的朋友可以看一下,希望能够给你带来帮助...2021-09-18
同时兼容JS和C#的RSA加密解密算法详解(对web提交的数据加密传输)
这篇文章主要给大家介绍了关于同时兼容JS和C#的RSA加密解密算法,通过该算法可以对web提交的数据进行加密传输,文中通过图文及示例代码介绍的非常详细,需要的朋友们可以参考借鉴,下面来一起看看吧。...2020-06-25- 这篇文章主要是介绍了.net C# 实现任意List的全组合算法实现代码,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了C语言中send()函数和sendto()函数的使用方法,是C语言入门学习中的基础知识,需要的朋友可以参考下...2020-04-25
从Pytorch模型pth文件中读取参数成numpy矩阵的操作
这篇文章主要介绍了从Pytorch模型pth文件中读取参数成numpy矩阵的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-04图文详解Heap Sort堆排序算法及JavaScript的代码实现
这篇文章以图文详解Heap Sort堆排序算法及JavaScript的代码实现,堆排序算法基于类二叉树的堆数据结构,需要的朋友可以参考下...2016-05-05- 今天小编就为大家分享一篇C语言实现从文件读入一个3*3数组,并计算每行的平均值,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-25
- 这篇文章主要介绍了使用C语言操作文件的基本函数整理,包括创建和打开以及关闭文件的操作方法,需要的朋友可以参考下...2020-04-25