经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C 语言 » 查看文章
C语言线性代数算法实现矩阵示例代码
来源:jb51  时间:2021/10/19 15:31:52  对本文有异议

C语言实现矩阵

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

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

特殊矩阵

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

  1. #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. //特殊矩阵
  3. Matrix* Sames(double n, int row, int col){
  4. Matrix* mat = SetBase(mat);
  5. for (int i = 0; i < mat->size; i++)
  6. mat->data[i]=n;
  7. return mat;
  8. }
  9. #define Ones(row,col) Sames(1,row,col)
  10. #define Zeros(row,col) Sames(0,row,col)
  11. Matrix* Diag(double n, int row, int col){
  12. Matrix* mat = Sames(0,row,col);
  13. for (int i = 0; i < min(row,col) ; i++)
  14. mat->data[i*col+i] = n;
  15. return mat;
  16. }
  17. #define Eye(row,col) Diag(1,row,col)
  18. Matrix* CountMatrix(int row, int col){
  19. Matrix* mat = SetBase(mat);
  20. for (int i = 0; i < mat->size; i++)
  21. mat->data[i]=i;
  22. return mat;
  23. }
  24. //生成[L,R]范围内的随机矩阵
  25. Matrix* RandMat(int row,int col, double L, double R){
  26. Matrix* mat = SetBase(mat);
  27. int size=R-L;
  28. for (int i = 0; i < mat->size; i++)
  29. mat->data[i] = rand()%size+L;
  30. return mat;
  31. }

特殊矩阵验证

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

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

然后通过字符串来生成Func

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

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

  1. void printMat(Matrix* mat){
  2. printf("mat:");
  3. printf("%dx%d=%d\n",mat->col,mat->row,mat->size);
  4. for (int i = 0; i < mat->size; i++)
  5. {
  6. printf("%f,",mat->data[i]);
  7. if((i+1)%mat->col==0)
  8. printf("\n");
  9. }
  10. }

最后是main函数

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

验证一下

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

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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号