xqinghua.h

来自「该程序是用vc开发的对动态数组进行管理的DLL」· C头文件 代码 · 共 1,591 行 · 第 1/5 页

H
1,591 行
字号
  void bcmul(ar,ai,br,bi,m,n,k,cr,ci)
  int m,n,k;
  double ar[],ai[],br[],bi[],cr[],ci[];

2.2复矩阵相乘

ar--双精度实型二维数组,体积为m x n。存放矩阵A的实部。
ai--双精度实型二维数组.体积为m x n。存放矩阵A的虚部。
br--双精度实型二维数组,休积为n x k。存放矩阵B的实部。
bi--双精度实型二维数组,体积为n x k。存放矩阵B的虚部o
m--整型变量。矩阵A的行数,也是乘积矩阵C的行数。
n--整型变量。短阵A的列数,也是矩阵B的行数。
k--整型变量。矩阵B的列数,也是乘积矩阵C的列数o
cr--双精度实型二维数组,体积为mxk。返回乘积矩阵C的实部。
ci--双精度实型二维数组,体积为m x k。返回乘积矩阵C的虚部
                                                                                                                                                                                                                                                                                                                                                                                                                    
*/
/*--  Example (函数实例) --*/
/*

  #include "stdio.h"
  #include "bcmul.c"
  main()
  {  int i,j;
     static double cr[3][4],ci[3][4];
     static double ar[3][4]={ {1.0,2.0,3.0,-2.0},
            {1.0,5.0,1.0,3.0},{0.0,4.0,2.0,-1.0}};
     static double ai[3][4]={ {1.0,-1.0,2.0,1.0},
            {-1.0,-1.0,2.0,0.0},{-3.0,-1.0,2.0,2.0}};
     static double br[4][4]={ {1.0,4.0,5.0,-2.0},
            {3.0,0.0,2.0,-1.0},{6.0,3.0,1.0,2.0},
            {2.0,-3.0,-2.0,1.0}};
     static double bi[4][4]={ {-1.0,-1.0,1.0,1.0},
            {2.0,1.0,0.0,5.0},{-3.0,2.0,1.0,-1.0},
            {-1.0,-2.0,1.0,-2.0}};
     bcmul(ar,ai,br,bi,3,4,4,cr,ci);
     for (i=0; i<=2; i++)
       { for (j=0; j<=3; j++)
           printf("%13.7e ",cr[i][j]);
         printf("\n");
       }
     printf("\n");
     for (i=0; i<=2; i++)
       { for (j=0; j<=3; j++)
           printf("%13.7e ",ci[i][j]);
         printf("\n");
       }
  }

*/
/*-- Result (运行结果) --*/
/*
 3.100000e+01  1.900000e+01  1.200000e+01  8.000000e+00 
 3.500000e+01 -6.000000e+00  9.000000e+00  6.000000e+00 
 2.900000e+01  7.000000e+00  1.100000e+01  1.300000e+01 

 8.000000e+00  1.800000e+01  5.000000e+00  1.600000e+01 
 1.100000e+01  2.000000e+00  0.000000e+00  2.600000e+01 
 1.300000e+01 -2.000000e+00 -1.800000e+01  3.300000e+01 
*/


/*------------  define (函数原型定义)  ---------------------------*/  
  int bginv(double *a,int m,int n,double *aa,double eps,double *u,double *v,int ka);  
/*  
  int bginv(a,m,n,aa,eps,u,v,ka)
  int m,n,ka;
  double a[],aa[],u[],v[],eps;

2.13  求广义逆的奇异值分解法

a--双精度实型二维数组,体积为m x n。存放m*n的矩阵A;返回时其对角线依
次给出奇异值,其余元素均为零。
m--整型变量。矩阵A的行数。
n--整型变量。矩阵A的列数。
aa--双精度实型二维数组,体积为n x m。返回时存放矩阵A的广义逆A+。
eps--双精度实型变量。奇异值分解时的控制精度要求。
u--双精度实型二维数组,体积为m x m。返回时存放奇异值分解式中的定奇异向
  量U。
v--双精度实型二维数组,体积为n*n。返回时存放奇异值分解式中的右奇异向量VT。
  VT。
ka--整型变量。其值为max(m,n)+1。
                                                                                                                                                                                                                                                                                                                                                                                                                                                          
*/
/*--  Example (函数实例) --*/
/*

  #include "bmuav.c"
  #include "stdio.h"
  #include "bginv.c"
  main()
  { int m,n,ka,i,j;
    static double a[5][4]={ {1.0,2.0,3.0,4.0},
                  {6.0,7.0,8.0,9.0},{1.0,2.0,13.0,0.0},
                  {16.0,17.0,8.0,9.0},{2.0,4.0,3.0,4.0}};
    static double aa[4][5],c[5][4],u[5][5],v[4][4];
    double eps;
    m=5; n=4; ka=6; eps=0.000001;
    printf("MAT A IS:\n");
    for (i=0; i<=4; i++)
      { for (j=0; j<=3; j++)
          printf("%13.7e ",a[i][j]);
        printf("\n");
      }
    printf("\n");
    printf("MAT A+ IS:\n");
    i=bginv(a,m,n,aa,eps,u,v,ka);
    if (i>0)
      { for (i=0; i<=3; i++)
          { for (j=0; j<=4; j++)
              printf("%12.6e ",aa[i][j]);
            printf("\n");
          }
        printf("\n");
      }
    printf("MAT A++ IS:\n");
    i=bginv(aa,n,m,c,eps,v,u,ka);
    if (i>0)
      { for (i=0; i<=4; i++)
          { for (j=0; j<=3; j++)
              printf("%13.7e ",c[i][j]);
            printf("\n");
          }
        printf("\n");
      }
  }

*/
/*-- Result (运行结果) --*/
/*
MAT A IS:
 1.000000e+00  2.000000e+00  3.000000e+00  4.000000e+00 
 6.000000e+00  7.000000e+00  8.000000e+00  9.000000e+00 
 1.000000e+00  2.000000e+00  1.300000e+01  0.000000e+00 
 1.600000e+01  1.700000e+01  8.000000e+00  9.000000e+00 
 2.000000e+00  4.000000e+00  3.000000e+00  4.000000e+00 

MAT A+ IS:
-1.13487e-01  2.64449e-01 -2.97724e-02  4.51837e-02 -5.83187e-01 
 7.18009e-02 -3.47061e-01  2.86578e-02  4.90204e-02  5.98791e-01 
-3.85819e-03  3.36949e-02  7.47631e-02 -1.12316e-02 -4.66841e-02 
 5.79800e-02  1.60308e-01 -6.79684e-02 -5.34359e-02 -4.84417e-02 

MAT A++ IS:
 1.000001e+00  2.000001e+00  2.999997e+00  4.000000e+00 
 6.000003e+00  7.000003e+00  7.999991e+00  9.000001e+00 
 1.000002e+00  2.000001e+00  1.300000e+01  6.334456e-07 
 1.600001e+01  1.700000e+01  7.999985e+00  9.000002e+00 
 2.000002e+00  4.000001e+00  2.999996e+00  4.000001e+00 

*/


/*------------  define (函数原型定义)  ---------------------------*/                                         
  int blluu(double *a,int n,double *l,double *u);  
/*                                         
  int blluu(a,n,l,u)
  int n;
  double a[],l[],u[];

2.10  矩阵的三角分解

a--双精度实型二维数组,体积为n x n。存放n阶实矩阵A;返回时存放Q距阵。
n--整型变量。矩阵A的阶数。
1--双精度实型二维数组,体积为n x n。返回时存放下三角矩阵L。
u--双精度实型二维数组,体积为nx n。返回时存放上三角矩阵U。

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 
*/
/*--  Example (函数实例) --*/
/*

  #include "stdio.h"
  #include "blluu.c"
  main()
  { int i,j;
    static double l[4][4],u[4][4];
    static double a[4][4]={ {2.0,4.0,4.0,2.0},
                            {3.0,3.0,12.0,6.0},
                            {2.0,4.0,-1.0,2.0},
                            {4.0,2.0,1.0,1.0}};
    i=blluu(a,4,l,u);
    if (i!=0)
      { printf("MAT L IS:\n");
        for (i=0; i<=3; i++)
          { for (j=0; j<=3; j++)
              printf("%13.7e ",l[i][j]);
            printf("\n");
          }
        printf("\n");
        printf("MAT U IS:\n");
        for (i=0; i<=3; i++)
          { for (j=0; j<=3; j++)
              printf("%13.7e ",u[i][j]);
            printf("\n");
          }
        printf("\n");
      }
  }

*/
/*-- Result (运行结果) --*/
/*
MAT L IS:
 1.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00 
 1.500000e+00  1.000000e+00  0.000000e+00  0.000000e+00 
 1.000000e+00 -0.000000e+00  1.000000e+00  0.000000e+00 
 2.000000e+00  2.000000e+00  3.800000e+00  1.000000e+00 

MAT U IS:
 2.000000e+00  4.000000e+00  4.000000e+00  2.000000e+00 
 0.000000e+00 -3.000000e+00  6.000000e+00  3.000000e+00 
 0.000000e+00  0.000000e+00 -5.000000e+00  0.000000e+00 
 0.000000e+00  0.000000e+00  0.000000e+00 -9.000000e+00 

*/


/*------------  define (函数原型定义)  ---------------------------*/                                         
  int bmaqr(double *a,int m,int n,double *q);  
/*                                         
  int bmaqr(a,m,n,q)
  int m,n;
  double a[],q[];

 2.11  一般实矩阵的QR分解

a--双精度实型二维数组,体积为m x n。存放m*n的实矩阵A;返回时,其右上
  三角部分存放上三角矩阵R。
m--整型变量。实矩阵A的行数。
n--整型变量。实矩阵A的列数。
q-双精度实型二维数组,体积为m*m。返回时存放正交矩阵Q。

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
*/
/*--  Example (函数实例) --*/
/*

  #include "stdio.h"
  #include "bmaqr.c"
  main()
  { int i,j;
    static double q[4][4],a[4][3]={ {1.0,1.0,-1.0},
       {2.0,1.0,0.0},{1.0,-1.0,0.0},{-1.0,2.0,1.0}};
    i=bmaqr(a,4,3,q);
    if (i!=0)
      { printf("MAT Q IS:\n");
        for (i=0; i<=3; i++)
          { for (j=0; j<=3; j++)
              printf("%13.7e ",q[i][j]);
            printf("\n");
          }
        printf("\n");
        printf("MAT R IS:\n");
        for (i=0; i<=3; i++)
          { for (j=0; j<=2; j++)
              printf("%13.7e ",a[i][j]);
            printf("\n");
          }
        printf("\n");
      }
  }

*/
/*-- Result (运行结果) --*/
/*
MAT Q IS:
-3.779645e-01 -3.779645e-01  7.559289e-01  3.779645e-01 
-7.559289e-01 -3.779645e-01 -3.779645e-01 -3.779645e-01 
-3.779645e-01  3.779645e-01 -3.779645e-01  7.559289e-01 
 3.779645e-01 -7.559289e-01 -3.779645e-01  3.779645e-01 

MAT R IS:
-2.645751e+00 -1.955901e-16  7.559289e-01 
 0.000000e+00 -2.645751e+00 -3.779645e-01 
 0.000000e+00  0.000000e+00 -1.133893e+00 
 0.000000e+00  0.000000e+00  0.000000e+00 

*/


/*------------  define (函数原型定义)  ---------------------------*/                                          
  int bmuav(double *a,int m,int n,double *u,double *v,double eps,int ka);  
/*                                          
  int bmuav(a,m,n,u,v,eps,ka)
  int m,n,ka;
  double eps,a[],u[],v[];

 2.12  一般实矩阵的奇异值分解

a--双精度实型二维数组,体积为mxn。存放m*n的实矩阵A;返回时其对角线
给出奇异值(以非递增次序排列),其余元素均为零。
m--整型变量。实矩阵A的行数。
n--整型变量。实矩阵A的列数。
u--双精度实型二维数组,体积为m*m。返回时存放左奇异向量U。
v--双精度实型二维数组,体积为n x n。返回时存放右奇异向量vt。
eps--双精度实型变量。给定的精度要求。
ka--整型变量。其值为max(m,n)+1。

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
*/
/*--  Example (函数实例) --*/
/*

  #include "stdio.h"
  #include "bmuav.c"
  #include "brmul.c"
  main()
  { int i,j;
    static double a[4][3]={ {1.0,1.0,-1.0},{2.0,1.0,0.0},
                           {1.0,-1.0,0.0},{-1.0,2.0,1.0}};
    static double b[3][4]={ {1.0,1.0,-1.0,-1.0},{2.0,1.0,
                            0.0,2.0},{1.0,-1.0,0.0,1.0}};
    static double u[4][4],v[3][3],c[4][3],d[3][4];
    double eps;
    eps=0.000001;
    i=bmuav(a,4,3,u,v,eps,5);
    printf("\n");
    printf("EXAMPLE(1)\n");

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?