搜索
查看: 306|回复: 0
打印 上一主题 下一主题

求助!关于cholesky矩阵分解的代码,但是无法输出结果,望帮忙解决,十分感谢!!!

[复制链接]
跳转到指定楼层
楼主
 楼主| 发表于 2020-10-6 02:27:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
5啊哈币
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <malloc.h>
  4. #include <math.h>
  5. double**MonAlloc(int n,int m)
  6. {
  7.     int i,j;
  8.     double *vect,**mat;
  9.     vect=(double*)malloc((n*m)*sizeof(double));
  10.     mat=(double**)malloc(n*sizeof(double));
  11.     for(i=0;i<n;i++)
  12.     {
  13.         mat[i]=vect;
  14.         vect=vect+m;
  15.     }
  16.     return(mat);
  17. }


  18. double* sol(int N,double** A,double* b)
  19. {
  20.     int i,j;
  21.     double sum,*x;
  22.     x=(double*)malloc(N*sizeof(double));
  23.     for(i=0;i<N;i++)
  24.     {
  25.         sum=0.0;
  26.         for(j=0;j<i;j++)
  27.         {
  28.             sum=sum + A[i][j]*x[j];
  29.         }
  30.         x[i]=(b[i]-sum)/A[i][i];
  31.     }
  32.     return(x);
  33. }


  34. double* Cholesky(int N,double** A,double* b)
  35. {
  36.     int i,j,k;
  37.     double **L,**temp,*x,*y,sum;
  38.     L=MonAlloc(N,N);
  39.     temp=MonAlloc(N,N);
  40.     L[0][0]=sqrt(A[0][0]);
  41.     for(k=0;k<N;k++)
  42.     {
  43.         sum=0;
  44.         for(i=0;i<k;i++)
  45.             sum+=sum+L[k][j]*L[k][i];
  46.         sum=A[k][k] - sum;
  47.         L[k][k] = sqrt(sum>0? sum : 0);
  48.         for(i=k+1;i<N;i++)
  49.         {
  50.             sum=0;
  51.             for(j=0;j<k;j++)
  52.                 sum += L[i][j]*L[k][j];
  53.             L[i][k]=(A[i][k]-sum)/L[k][k];
  54.         }
  55.         for(int j=0; j<k; j++)
  56.          L[j][k]=0;
  57.     }
  58.     y=sol(N,L,b);
  59.     for(i = 0;i < N;i++)
  60.         for(j = 0;j < i;j++)
  61.         {
  62.             temp[i][j] = L[i][j];
  63.             L[i][j] = L[j][i];
  64.             L[j][i] = temp[i][j];
  65.         }
  66.     x=sol(N,L,y);
  67.     return(x);
  68. }
  69. void main()
  70. {
  71.     int i,N;
  72.     double **A,*b,*x;
  73.     N=4;
  74.     A=MonAlloc(N,N);
  75.     x=(double*)malloc(N*sizeof(double));
  76.     b=(double*)malloc(N*sizeof(double));
  77.     A[0][0]=10; A[0][1]=7;   A[0][2]=8;   A[0][3]=7;
  78.     A[1][0]=7;  A[1][1]=5;   A[1][2]=6;   A[1][3]=5;
  79.     A[2][0]=8;  A[2][1]=6;   A[2][2]=10;  A[2][3]=9;
  80.     A[3][0]=7;  A[3][1]=5;   A[3][2]=9;   A[3][3]=10;
  81.     b[0]=32;   b[0]=23;   b[0]=33;   b[0]=31;
  82.     Cholesky(N,A,b);
  83. }
复制代码

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表