// Matrix.hpp
#如果!已定義(_矩陣計算_ HPP _ _包含_)
# define _ matrix calculate _ HPP _ _ INCLUDED _
# if _ MSC _ VER & gt;1000
#雜註壹次
# endif//_ MSC _ VER & gt;1000
# include & ltmath.h & gt
CMatrixCalculate類
{
公共:
////求矩陣的行列式值,其中n為維數。
double calculate line(double * matrix,int n)
{
雙線= 0;
int i=0,j=0,k = 0;
int p=0,q = 0;
如果(n==1)
返回矩陣[0];
其他
{
double * tr =(double *)calloc((n-1)*(n-1),sizeof(double));
for(k = 0;k & ltn;k++)
{
p = 0;
for(I = 0;我& ltn;i++)
{
如果(我!=0)
{
q = 0;
for(j = 0;j & ltn;j++)
{
如果(j!=k)
{
tr[p *(n-1)+q]=矩陣[I * n+j];
q++;
}
}
p++;
}
}
liner+=matrix[k]*pow(-1,k)*CalculateLiner(tr,n-1);
}
免費(tr);
回程班輪;
}
}
////求矩陣第I行第J列的代數余因子,其中n為維數。
double calculate cofactor(double * matrix,int i,int j,int n)
{
int x=0,y = 0;
int p=0,q = 0;
如果(n==1)
返回矩陣[0];
其他
{
double * tr =(double *)calloc((n-1)*(n-1),sizeof(double));
p = 0;
for(x = 0;x & ltn;x++)
{
如果(x!=i)
{
q = 0;
for(y = 0;y & ltn;y++)
{
如果(y!=j)
{
tr[p *(n-1)+q]=矩陣[x * n+y];
q++;
}
}
p++;
}
}
double cc=pow(-1,i+j)*CalculateLiner(tr,n-1);
免費(tr);
返回cc;
}
}
////矩陣轉置,matrixAT=(matrixA)T,m,n是matrixA的行數和列數。
void CalculateAT(double *matrixA,double *matrixAT,int m,int n)
{
for(int I = 0;我& ltm;i++)
{
for(int j = 0;j & ltn;j++)
{
matrix at[j * m+I]= matrix a[I * n+j];
}
}
}
////矩陣乘法,matrixAB=matrixA*matrixB,I,j是matrixA的行和列,j,k是matrixB的行和列。
void CalculateAB(double *matrixA,double *matrixB,double *matrixAB,int i,int j,int k)
{
for(int m = 0;m & lt我;m++)
{
for(int n = 0;n & ltk;n++)
{
matrix ab[m * k+n]= 0;
for(int s = 0;s & ltj;s++)
{
matrix ab[m * k+n]+= matrix a[m * j+s]* matrix b[s * k+n];
}
}
}
}
////matrix ATA =(matrixa)t * matrix a,m,n分別是matrix a的行和列。
void calculate ATA(double * matrix a,double *matrixATA,int m,int n)
{
double * at =(double *)calloc((m)*(n),sizeof(double));
CalculATeAT(matrixA,at,m,n);
CalculateAB(at,matrixA,matrixATA,n,m,n);
免費(at);
}
////matrixA_是matrixA的逆,m是階。
void calculate a _(double * matrix,double * matrixA _,int m)
{
double liner = calculate liner(matrix a,m);
for(int I = 0;我& ltm;i++)
{
for(int j = 0;j & ltm;j++)
matrix a _[j * m+I]= calculatecofactor(matrix a,I,j,m)/liner;
}
}
////////////////////////////////////////////////////////////////////
////求正定矩陣A的逆矩,其中n為階。
int MatrixInversion(double *a,int n)
{
int i,j,k,m;
雙w,g,* b;
b =新double[n];
for(k = 0;k & lt= n-1;k++)
{
w = a[0];
w = a[0]+1.0e-15;
/*
if(fabs(w)+1.0 = = 1.0)
{
刪除b;
printf(" fail \ n ");
return(-2);
}
*/
m = n-k-1;
for(I = 1;我& lt= n-1;i++)
{
g = a[I * n];
b[I]= g/w;
如果(我& lt= m)
b[I]=-b[I];
for(j = 1;j & lt= I;j++)
a[(I-1)* n+j-1]= a[I * n+j]+g * b[j];
}
a[n * n-1]= 1.0/w;
for(I = 1;我& lt= n-1;i++)
a[(n-1)* n+I-1]= b[I];
}
for(I = 0;我& lt= n-2;i++)
for(j = I+1;j & lt= n-1;j++)
a[I * n+j]= a[j * n+I];
刪除b;
返回(2);
}
////求正定矩陣A的逆矩,其中n為階。
void MatInversion(double *a,int n)
{
int i,j,k;
for(k = 0;k & ltn;k++)
{
for(I = 0;我& ltn;i++)
{
如果(我!= k)*(a+I * n+k)=-*(a+I * n+k)/(*(a+k * n+k));
}
*(a+k * n+k)= 1/(*(a+k * n+k));
for(I = 0;我& ltn;i++)
{
如果(我!=k)
{
for(j = 0;j & ltn;j++)
{
如果(j!= k)*(a+I * n+j)+= *(a+k * n+j)* *(a+I * n+k);
}
}
}
for(j = 0;j & ltn;j++)
{
如果(j!= k)*(a+k * n+j)* = *(a+k * n+k);
}
}
}
/*矩陣求逆子程序(好)*/
int inverse _ matrix(double * m 1,int n)
{
int *is,* js
int i,j,k,l,u,v;
雙溫max _ v;
is =(int *)malloc(n * sizeof(int));
js =(int *)malloc(n * sizeof(int));
if(is==NULL||js==NULL)
{
printf("內存不足!\ n ");
return(0);
}
for(k = 0;k & ltn;k++)
{
max _ v = 0.0
for(I = k;我& ltn;i++)
{
for(j = k;j & ltn;j++)
{
temp = fabs(m 1[I * n+j]);
if(temp & gt;max_v)
{
max _ v = tempis[k]= I;js[k]= j;
}
}
}
if(max_v==0.0)
{
免費(是);免費(js);
printf(" inverse不可用!\ n ");
return(0);
}
如果(是[k]!=k)
{
for(j = 0;j & ltn;j++)
{
u = k * n+j;v = is[k]* n+j;
temp = m 1[u];m 1[u]= m 1[v];m 1[v]= temp;
}
}
if(js[k]!=k)
for(I = 0;我& ltn;i++)
{
u = I * n+k;v = I * n+js[k];
temp = m 1[u];m 1[u]= m 1[v];m 1[v]= temp;
}
l = k * n+k;
m 1[l]= 1.0/m 1[l];
for(j = 0;j & ltn;j++)
{
如果(j!=k)
{
u = k * n+j;
m 1[u]* = m 1[l];
}
}
for(I = 0;我& ltn;i++)
{
如果(我!=k)
{
for(j = 0;j & ltn;j++)
{
如果(j!=k)
{
u = I * n+j;
m 1[u]-= m 1[I * n+k]* m 1[k * n+j];
}
}
}
}
for(I = 0;我& ltn;i++)
{
如果(我!=k)
{
u = I * n+k;
m 1[u]* =-m 1[l];
}
}
}
for(k = n-1;k & gt=0;k -)
{
if(js[k]!=k)
for(j = 0;j & ltn;j++)
{
u = k * n+j;v = js[k]* n+j;
temp = m 1[u];m 1[u]= m 1[v];m 1[v]= temp;
}
如果(是[k]!=k)
for(I = 0;我& ltn;i++)
{
u = I * n+k;v = I * n+是[k];
temp = m 1[u];m 1[u]= m 1[v];m 1[v]= temp;
}
}
免費(是);免費(js);
返回(1);
}
////求矩陣方程matrixA*matrixX=matrixL的最小二乘解,其中m和n分別是matrixA矩陣的行數和列數。
void equation resolution(double * matrix a,double *matrixL,double *matrixX,int m,int n)
{
如果(m & ltn)返回;
double * at =(double *)malloc((m)*(n)* sizeof(double));
double * ATA =(double *)malloc((n)*(n)* sizeof(double));
double * atl =(double *)malloc((n)* sizeof(double));
CalculateATA(matrixA,ATA,m,n);
MatrixInversion(ata,n);
CalculATeAT(matrixA,at,m,n);
CalculateAB(at,matrixL,atl,n,m,1);
CalculateAB(ata,atl,matrixX,n,n,1);
免費(at);
免費(ATA);
免費(atl);
}
}
#endif //!已定義(_矩陣計算_ HPP _ _包含_)