當前位置:編程學習大全網 - 編程語言 - 矩陣解編程

矩陣解編程

下面的文件是矩陣運算的壹些操作。可以使用最後壹個函數EquationResolution來解決最小二乘問題。當然,在計算之前,妳需要構造上面提到的系數矩陣和常數矩陣,其實就是兩個數組。

// 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 _ _包含_)

  • 上一篇:用SolIDWorks畫三個零件,組裝成壹個按摩器!
  • 下一篇:fpga和asic開發流程的區別?
  • copyright 2024編程學習大全網