小弟的C++机试题,有学分的。小弟不才,望高人指点,救救小弟!
要求:提交类声明头文件、类实现文件和测试程序文件3个源代码文件;
题目:
2. (A) 使用C++设计矩阵类及相应的测试主程序。该矩阵类可进行基本的统计计算,矩阵类的每一行为一向量,基本统计计算针对该向量进行。矩阵生成可如1方式实现,也应该可以从磁盘文件中读入。矩阵的行、列数有默认值,也可通过类成员函数设置更改;如从磁盘文件读入,该磁盘文件名及其存储路径有默认值,也可通过类成员函数设置更改;矩阵类有加、减、乘、判断相等的运算成员函数;基本统计计算包括求均值、协方差;基本统计计算结果在该类对象退出作用域时可自动存入磁盘文件,该磁盘文件名及其存储路径有默认值,也可通过类成员函数设置更改。
(B) 在按上述要求实现的C++类中添加可求协方差矩阵对应的行列式值和求矩阵(方阵)逆的类成员,更改测试主程序对此加以验证。
提示:
(A) 矩阵类的加、减、乘、判断相等的运算成员函数可实现成普通函数, 也可实现成重载的运算符函数(+, -, *, ==)。磁盘文件名及其存储路径可分别用字符串类(string)实现。
(B) 矩阵(方阵)对应的行列式值和逆
实现行列式值求解的全选主元高斯(Gauss)消去法的C函数示例如下:
#include "math.h"
double sdet(double a[], int n)
{ int i,j,k,is,js,l,u,v;
double f,det,q,d;
f=1.0; det=1.0;
for (k=0; k<=n-2; k++)
{ q=0.0;
for (i=k; i<=n-1; i++)
for (j=k; j<=n-1; j++)
{ l=i*n+j; d=fabs(a[l]);
if (d>q) { q=d; is=i; js=j;}
}
if (q+1.0==1.0)
{ det=0.0; return(det);}
if (is!=k)
{ f=-f;
for (j=k; j<=n-1; j++)
{ u=k*n+j; v=is*n+j;
d=a[u]; a[u]=a[v]; a[v]=d;
}
}
if (js!=k)
{ f=-f;
for (i=k; i<=n-1; i++)
{ u=i*n+js; v=i*n+k;
d=a[u]; a[u]=a[v]; a[v]=d;
}
}
l=k*n+k;
det=det*a[l];
for (i=k+1; i<=n-1; i++)
{ d=a[i*n+k]/a[l];
for (j=k+1; j<=n-1; j++)
{ u=i*n+j;
a[u]=a[u]-d*a[k*n+j];
}
}
}
det=f*det*a[n*n-1];
return(det);
}
实现方阵逆求解的全选主元高斯-约当(Gauss-Jordan)消去法的C函数示例如下:
#include "stdlib.h"
#include "math.h"
#include "stdio.h"
int rinv(double a[], int n)
{ int *is,*js,i,j,k,l,u,v;
double d,p;
is=malloc(n*sizeof(int));
js=malloc(n*sizeof(int));
for (k=0; k<=n-1; k++)
{ d=0.0;
for (i=k; i<=n-1; i++)
for (j=k; j<=n-1; j++)
{ l=i*n+j; p=fabs(a[l]);
if (p>d) { d=p; is[k]=i; js[k]=j;}
}
if (d+1.0==1.0)
{ free(is); free(js); printf("err**not inv\n");
return(0);
}
if (is[k]!=k)
for (j=0; j<=n-1; j++)
{ u=k*n+j; v=is[k]*n+j;
p=a[u]; a[u]=a[v]; a[v]=p;
}
if (js[k]!=k)
for (i=0; i<=n-1; i++)
{ u=i*n+k; v=i*n+js[k];
p=a[u]; a[u]=a[v]; a[v]=p;
}
l=k*n+k;
a[l]=1.0/a[l];
for (j=0; j<=n-1; j++)
if (j!=k)
{ u=k*n+j; a[u]=a[u]*a[l];}
for (i=0; i<=n-1; i++)
if (i!=k)
for (j=0; j<=n-1; j++)
if (j!=k)
{ u=i*n+j;
a[u]=a[u]-a[i*n+k]*a[k*n+j];
}
for (i=0; i<=n-1; i++)
if (i!=k)
{ u=i*n+k; a[u]=-a[u]*a[l];}
}
for (k=n-1; k>=0; k--)
{ if (js[k]!=k)
for (j=0; j<=n-1; j++)
{ u=k*n+j; v=js[k]*n+j;
p=a[u]; a[u]=a[v]; a[v]=p;
}
if (is[k]!=k)
for (i=0; i<=n-1; i++)
{ u=i*n+k; v=i*n+is[k];
p=a[u]; a[u]=a[v]; a[v]=p;
}
}
free(is); free(js);
return(1);
}