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 + -
显示快捷键?