📄 cmatrix.cpp
字号:
#include <iostream.h>
#include <math.h>
class Cmatrix
{
public:
Cmatrix();
Cmatrix(int i,int j,double a[]);
~Cmatrix();
//void SetA(int,int,double );//设置矩阵元素值
//void SetA(double B[]);//矩阵整体赋值
double getA(int,int);//得到矩阵元素
int getH();
int getL();
double* getpt();
double getHL_value();//计算行列式的值
Cmatrix inv();//求逆
void setpt(double*);//设置矩阵元素值
Cmatrix T();//转置
//重载操作符
Cmatrix operator =(Cmatrix);
Cmatrix operator *(Cmatrix);
Cmatrix operator +(Cmatrix);
Cmatrix operator -(Cmatrix);
private:
int H; //矩阵行数
int L;//矩阵列数
double* pt;//矩阵的值,以一维数组的形式存放
};
Cmatrix::Cmatrix()
{
H=0;
L=0;
pt=NULL;
}
Cmatrix::Cmatrix(int i,int j,double a[])
{
H=i;
L=j;
pt=a;
}
Cmatrix::~Cmatrix()
{
}
void Cmatrix::setpt(double* p)
{
pt=p;
}
double* Cmatrix::getpt()
{
return pt;
}
int Cmatrix::getH()
{
return H;
}
int Cmatrix::getL()
{
return L;
}
double Cmatrix::getA(int i,int j)
{
//return *(pt+(i-1)*H+(j-1));
return pt[(i-1)*H+(j-1)];
}
Cmatrix Cmatrix::operator =(Cmatrix x)
{
delete []pt;
pt=new double[x.getH()*x.getL()];
long i;
for (i=0;i<x.getH()*x.getL();i++)
{
pt[i]=x.getpt()[i];
}
H=x.getH();
L=x.getL();
return *this;
}
Cmatrix Cmatrix::operator *(Cmatrix x)
{
Cmatrix temp(H,x.getL(),NULL);
double *p;
p=new double[H*x.getL()];
int i,j,k;
for(i=0;i<H;i++)
{
for(j=0;j<x.getL();j++)
{
p[i*x.getL()+j]=0;
for(k=0;k<L;k++)
{
p[i*x.getL()+j]+=pt[i*L+k]*x.getpt()[k*x.getL()+j];
}
}
}
temp.setpt(p);
return temp;
}
Cmatrix Cmatrix::operator +(Cmatrix x)
{
Cmatrix temp(H,L,NULL);
double *p;
p=new double[H*L];
int i;
for(i=0;i<H*L;i++)
{
p[i]=pt[i]+x.getpt()[i];
}
temp.setpt(p);
return temp;
}
Cmatrix Cmatrix::operator -(Cmatrix x)
{
Cmatrix temp(H,L,NULL);
double *p;
p=new double[H*L];
int i;
for(i=0;i<H*L;i++)
{
p[i]=pt[i]-x.getpt()[i];
}
temp.setpt(p);
return temp;
}
Cmatrix Cmatrix::T()
{
Cmatrix temp(L,H,NULL);
double *p;
p=new double[H*L];
int i,j;
for (i=0;i<L;i++)
{
for (j=0;j<H;j++)
{
p[i*H+j]=pt[j*L+i];
}
}
temp.setpt(p);
p=NULL;
return temp;
}
//double Cmatrix::getHL_value(int i,double* pd)
//{
// double* p;
// double num;
// long cha;
// long T0,T1,T2,T3;
// cha=0;
// p= new double[(i-1)*(i-1)];
//
// if (i==1)
// {
// return (*pd)*(*(pd+3))-*(pd+1)*(*(pd+2));
// delete []p;
// }
//
// for(T0=0;T0<i;T0++)
// {
// for(T1=1;T1<i;T1++)
// {
// for(T2=0;T2<i-1;T2++)
// {
// if (T2=T0)
// cha=1;
// p[(T1-1)*(i-1)+T2]=pd[T1*i+T2+cha];
//
// }
// cha=0;
// }
// num=num+pd[T0]*getHL_value(i-1,p)*pow(-1,T0);
// }
// return num;
// delete []p;
//
//}
double Cmatrix::getHL_value()
{
double max,temp,a;
double num=1;
double *p;
p=new double[H*H];
int maxid;
int i,j,k,s,n;
int flag=1;
for(i=0;i<H*H;i++)
{
p[i]=pt[i];
}
for(i=0;i<H-1;i++)
{
max=fabs(p[i*H+i]);
maxid=i;
for(s=i+1;s<=H-1;s++)
{
if(fabs(p[s*H+i])>max)
{
max=fabs(p[s*H+i]);
maxid=s;
}
}
if(max==0)
return 0;
if(maxid!=i)
{ flag=flag*(-1);
for(n=i;n<=H-1;n++)
{
temp=p[maxid*H+n];
p[maxid*H+n]=p[i*H+n];
p[i*H+n]=temp;
}
}
for(j=i+1;j<=H-1;j++)
{
a=-p[j*H+i]/p[i*H+i];
for(k=i;k<=H-1;k++)
{
p[j*H+k]=p[j*H+k]+a*p[i*H+k];
}
}
}
for(i=0;i<=H-1;i++)
{
num=num*p[i*H+i];
}
delete []p;
return flag*num;
}
Cmatrix Cmatrix::inv()
{
int i,j,k,n;
int chax=0,chay=0;
double add;
double *p;
double *q;
p=new double[H*H];
q=new double[(H-1)*(H-1)];
Cmatrix temp1(H,H,NULL);
Cmatrix temp2(H-1,H-1,NULL);
add=1/this->getHL_value();
for(k=0;k<H;k++)
{
for(n=0;n<H;n++)
{
for(i=0;i<H-1;i++)
{
if(i<k)
chax=0;
else
chax=1;
for(j=0;j<H-1;j++)
{
if(j<n)
chay=0;
else
chay=1;
q[i*(H-1)+j]=pt[(i+chax)*H+(j+chay)];
}
}
temp2.setpt(q);
p[n*H+k]=pow(-1,k+n)*add*temp2.getHL_value();
}
}
temp1.setpt(p);
delete []q;
return temp1;
}
void main()
{
double b[28]={1.34,5.67,5.7,7.56,
1.34,9.00,12.56,7.3,
3.45,6.78,13.4,3.56,
23.5,67.3,33.1,7.3,
3.4,6.78,22.3,5.44,
3.67,8.33,9.12,3.77,
4.77,2.77,8.67,4.44
};
double a[28]={1.34,1.34,3.45,23.5,3.4,3.67,4.77,
5.67,9,6.78,67.3,6.78,8.33,2.77,
5.7,12.56,13.4,33.1,22.3,9.12,8.67,
7.56,7.3,3.56,7.3,5.44,3.77,4.44
};
double c[7]={45.34,56.66,23.44,5.66,45.67,84.3,22.34
};
// double h[5]={2.34,5.78,22.34,2.31,3.55
// };
Cmatrix f55(7,4,b);
Cmatrix d55(7,1,c);
Cmatrix ss(4,7,a);
// Cmatrix s(5,1,h);
Cmatrix f,x;
/*double c=matrix.getA(1,1);*/
// double d;
// d=matrix.getHL_value();
// cout<<d<<endl;
// f=matrix.inv();
// matrix.setpt(NULL);
// cout<<c<<endl;
// f=d55*f55;
f=f55.T()*f55;
x=f.inv()*f55.T()*d55;
f=f55*x-d55;
for(int i=0;i<f.getH();i++)
{
// int gg=f.getL();
for(int j=0;j<f.getL();j++)
{
cout<<f.getpt()[i*f.getL()+j]<<" ";
}
cout<<endl;
}
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -