#include<iostream>
#include<fstream>
#include<cstdio>
#include<cmath>
#include<string>
using namespace std;
void matrix_mul(int m,int n,int l,double a[],double b[],double c[])
{
for(int i=0;i<m;i++)
{
for(int k=0;k<l;k++)
{
c[i*l+k]=0;
for(int j=0;j<n;j++)
c[i*l+k]+=a[i*n+j]*b[j*l+k];
}
}
}
void matrix_sub(int m,int n,double a[],double b[],double c[])
{
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
c[i*n+j]=a[i*n+j]-b[i*n+j];
}
//**************** 求矩陣行列式 **********************8***************
double Surplus(double *A,int m,int n)
{
int i,j,k,p,r;
double X,temp=1,temp1=1,s=0,s1=0;
if(n==2)
{for(i=0;i<m;i++)
for(j=0;j<n;j++)
if((i+j)%2)
temp1*=*(A+i*n+j);
else
temp*=*(A+i*n+j);
X=temp-temp1;
}
else{
for(k=0;k<n;k++)
{
for(i=0,j=k;i<m,j<n;i++,j++)
temp*=*(A+i*n+j);
if(m-i)
{
for(p=m-i,r=m-1;p>0;p--,r--)
temp*=*(A+r*n+p-1);}
s+=temp;
temp=1;
}
for(k=n-1;k>=0;k--)
{
for(i=0,j=k;i<m,j>=0;i++,j--)
temp1*=*(A+i*n+j);
if(m-i)
{
for(p=m-1,r=i;r<m;p--,r++)
temp1*=*(A+r*n+p);
}
s1+=temp1;
temp1=1;
}
X=s-s1;
}
return X;
}
//***************** 矩陣求逆 *************************************
double * MatrixOpp(double *A,int m,int n)
{
int i,j,x,y,k;
double X;
double *C=new double [m*n];
double *SP=new double[m*n];
double *AB=new double[m*n];
double *B=new double[m*n];
X=Surplus(A,m,n);
X=1/X;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{
for(k=0;k<m*n;k++)
B[k]=A[k];
{
for(x=0;x<n;x++)
*(B+i*n+x)=0;
for(y=0;y<m;y++)
*(B+m*y+j)=0;
*(B+i*n+j)=1;
*(SP+i*n+j)=Surplus(B,m,n);
*(AB+i*n+j)=X*(*(SP+i*n+j));
}
}
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
*(C+j*m+i)=*(AB+i*n+j);
}
return C;
}
int main(){
ifstream infile;
infile.open("test_in.txt");
ofstream outfile;
outfile.open("test_out.txt");
int i,j;
int n,t,m;
infile>>n>>t>>m;
cout<<"b矩陣為"<<endl;
double *b=new double [n*t];
double *bt=new double[t*n];
double *p=new double [n*n];
double *l=new double [n*m];
for(i=0;i<n;i++){
for(j=0;j<t;j++)
infile>>*(b+i*t+j);
}
for(i=0;i<n;i++)
{
for(j=0;j<t;j++)
cout<<*(b+i*t+j)<<" ";
cout<<endl;
}
for(i=0;i<n;i++)
for(j=0;j<t;j++)
*(bt+j*n+i)=*(b+i*t+j);
cout<<"轉置后"<<endl;
for(i=0;i<t;i++)
{
for(j=0;j<n;j++)
{
cout<<*(bt+i*n+j)<<" ";
}
cout<<endl;
}
cout<<"P矩陣為"<<endl;
//double *p=new double [n*n];
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
infile>>*(p+i*n+j);
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
cout<<*(p+i*n+j)<<" ";
cout<<endl;
}
cout<<"l矩陣為"<<endl;
//double *l=new double [n*1];
for(i=0;i<n;i++)
{
for(j=0;j<1;j++)
infile>>*(l+i*1+i);
}
for(i=0;i<n;i++)
{
for(j=0;j<1;j++)
cout<<*(l+i*1+i);
cout<<endl;
}
double *btp=new double [t*n];
matrix_mul(t,n,n,bt,p,btp);
cout<<endl<<"BTP:"<<endl;
for(i=0;i<t;i++)
{
for(j=0;j<n;j++)
cout<<*(btp+i*n+j)<<" ";
cout<<endl;
}
double *btp1=new double [t*n];
matrix_mul(t,n,n,bt,p,btp1);
double *btpl=new double [t*m];
matrix_mul(t,n,m,btp1,l,btpl);
cout<<endl<<"BTPL:"<<endl;
for(i=0;i<t;i++)
{
for(j=0;j<m;j++)
cout<<*(btpl+i*m+j)<<" ";
cout<<endl;
}
double *btpb=new double [t*t];
matrix_mul(t,n,t,btp,b,btpb);
cout<<endl<<"BTPB:"<<endl;
for(i=0;i<t;i++)
{
for(j=0;j<t;j++)
cout<<*(btpb+i*t+j)<<" ";
cout<<endl;
}
double *W=new double [t*t];
W=MatrixOpp(btpb,t,t);
cout<<"W=:"<<endl;
for(i=0;i<t;i++)
{
for(j=0;j<t;j++)
{
cout<<*(W+i*t+j)<<" ";
}
cout<<endl;
}
/* double *wbt=new double [t*n];
matrix_mul(t,t,n,W,bt,wbt);
cout<<endl<<"wbt:"<<endl;
for(i=0;i<t;i++)
{
for(j=0;j<n;j++)
cout<<*(wbt+i*n+j)<<" ";
cout<<endl;
}
double *wbtp=new double [t*n];
matrix_mul(t,n,n,wbt,p,wbtp);
cout<<endl<<"wbtp:"<<endl;
for(i=0;i<t;i++)
{
for(j=0;j<n;j++)
cout<<*(wbtp+i*n+j)<<" ";
cout<<endl;
}*/
double *X=new double [t*m];
matrix_mul(t,n,m,W,l,X);
cout<<"X為:"<<endl;
for(i=0;i<t;i++)
{
for(j=0;j<m;j++)
cout<<*(X+i*m+j)<<" ";
cout<<endl;
}
double *bx=new double [n*1];
matrix_mul(n,t,1,b,X,bx);
cout<<"bx為:"<<endl;
for(i=0;i<n;i++)
{
for(j=0;j<1;j++)
cout<<*(bx+i*1+j)<<" ";
cout<<endl;
}
double *v=new double [t*1];
matrix_sub(n,1,bx,l,v);
cout<<endl<<"V為:"<<endl;
for(i=0;i<t;i++)
{
for(j=0;j<1;j++)
cout<<*(v+i*1+j)<<" ";
cout<<endl;
}
double *vt=new double[1*n];
for(i=0;i<n;i++)
for(j=0;j<1;j++)
*(vt+j*n+i)=*(v+i*1+j);
/*cout<<"轉置后"<<endl;
for(i=0;i<1;i++)
{
for(j=0;j<n;j++)
{
cout<<*(vt+i*n+j)<<" ";
}
cout<<endl;
}*/
cout<<"單位權中誤差為"<<endl;
double *vtp=new double [1*n];
matrix_mul(1,n,n,vt,p,vt);
double *vtpv=new double [1*1];
matrix_mul(1,n,1,vtp,v,vtpv);
double D;
D=sqrt(*vtpv/(n-t));
cout<<D<<endl;
cout<<"平差引數的協方差陣為"<<endl;
double *DXX=new double [t*t];
for(i=0;i<t;i++)
{
for(j=0;j<t;j++)
*(DXX+i*t+j)=D**(W+i*t+j);
}
for(i=0;i<t;i++)
{
for(j=0;j<t;j++)
cout<<*(DXX+i*t+j)<<" ";
cout<<endl;
}
delete []b;
delete []bt;
delete []p;
delete []l;
delete []btpb;
// delete []btpl;
delete []W;
delete []X;
delete []bx;
delete []v;
delete []vt;
delete []vtp;
delete []vtpv;
delete []DXX;
infile.close();
outfile.close();
return 0;
}
主要是BTPL那個實作不了,求大神
uj5u.com熱心網友回復:
在線求助....轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/113023.html
標籤:基礎類
上一篇:delphiXE代碼生成的bpl,bpi,dcp,obj,那么cbc XE可以參考bpl來直接帶包編譯嗎?沒生成hpp頭檔案!
