矩阵求逆 C程序

请问谁有对矩阵求逆,相乘等一系列的程序?C语言或者C++的
如果有多元线性回归的C程序就更好了,谢谢!

#include <stdlib.h>
#include <math.h>
#include <stdio.h>
int brinv(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);
}

void brmul(double a[], double b[],int m,int n,int k,double c[])
{ int i,j,l,u;
for (i=0; i<=m-1; i++)
for (j=0; j<=k-1; j++)
{ u=i*k+j; c[u]=0.0;
for (l=0; l<=n-1; l++)
c[u]=c[u]+a[i*n+l]*b[l*k+j];
}
return;
}

int main()
{ int i,j;
static double a[4][4]={ {0.2368,0.2471,0.2568,1.2671},
{1.1161,0.1254,0.1397,0.1490},
{0.1582,1.1675,0.1768,0.1871},
{0.1968,0.2071,1.2168,0.2271}};
static double b[4][4],c[4][4];
for (i=0; i<=3; i++)
for (j=0; j<=3; j++)
b[i][j]=a[i][j];
i=brinv(a,4);
if (i!=0)
{ printf("MAT A IS:\n");
for (i=0; i<=3; i++)
{ for (j=0; j<=3; j++)
printf("%13.7e ",b[i][j]);
printf("\n");
}
printf("\n");
printf("MAT A- IS:\n");
for (i=0; i<=3; i++)
{ for (j=0; j<=3; j++)
printf("%13.7e ",a[i][j]);
printf("\n");
}
printf("\n");
printf("MAT AA- IS:\n");
brmul(b,a,4,4,4,c);
for (i=0; i<=3; i++)
{ for (j=0; j<=3; j++)
printf("%13.7e ",c[i][j]);
printf("\n");
}
}
}
这个行么?不知道是不是你要的,希望对你有用
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-04-08
1.矩阵相乘很简单的,你自己把每一项拆开,把公式输给电脑,让它算就行了。
2.自己编写的,可以计算行列式的值和逆矩阵的程序:我的程序优点是结果能以分数而不是小数显示,比一般的程序方便实用多了,望采纳。
/*1.本程序理论上是可以计算任意阶矩阵的,但考虑到存储空间有限,设定范围在6阶以内矩阵;
2.若想试验更高阶的矩阵,请将第一部分中第三行的w[800][JS+1]中的800改成不低于阶数的阶乘的值
3.网络上也有相关的程序,但大多不能显示元素为分数的逆矩阵,而我的程序能实现结果的分数显示
*/

#include<stdio.h>
#include<math.h>
#define JS 4 /*注:可在本行改所要计算的阶数,只要把数字改了就行*/
void main()
{
printf("注:请先在源程序中修改要计算矩阵的阶数(当前计算的是%d阶矩阵)\n\n",JS);
int i,j,m,n,g,c,k,l,p,u,v,r;
int t[JS+1],zs[JS+1];
int w[800][JS+1];
int a[JS+1][JS+1];
int deta,xiang;
int hls[JS][JS];
int bs[JS+1][JS+1];
int det;
chongxin:for(t[JS-1]=1,i=2;i<=JS;i++)t[JS-i]=t[JS-i+1]*i;t[JS]=1;
for(i=0;i<JS;i++)zs[i]=t[0]/t[i];zs[JS]=t[0];
for(c=1;c<=JS;c++)
{
for(i=1;i<=zs[c-1];i++)
{
n=0;m=0;loop:m++;
while(m<=JS)
{
for(g=0;g<c;g++)if(m==w[(i-1)*t[c-1]+n*t[c]+1][g])goto loop;
for(g=1;g<=t[c];g++)w[(i-1)*t[c-1]+n*t[c]+g][c]=m;n++;m++;
}
}
}
printf("以下用空格隔开元素,回车结束每行的输入\n");
for(i=1;i<=JS;i++)
{
printf("请输入第%d行的元素:",i);
for(j=1;j<=JS;j++)scanf("%d",&a[i][j]);
}
for(deta=0,i=1;i<=t[0];i++)
{
for(xiang=1,j=1;j<=JS;j++)
{
xiang*=a[j][w[i][j]];
}
for(m=1,g=0;m<JS;m++) for(n=m+1;n<=JS;n++) if(w[i][n]<w[i][m])g++;
deta+=int(pow(-1,g)*xiang);
det=deta;
}
printf("\n行列式的值|A|=%d",deta);
if(deta==0){printf("\n此矩阵不可逆!\n\n");goto chongxin;}
for(t[JS-2]=1,i=2;i<JS;i++)t[JS-i-1]=t[JS-i]*i;t[JS-1]=1;
for(i=0;i<JS-1;i++)zs[i]=t[0]/t[i];zs[JS-1]=t[0];
for(c=1;c<JS;c++)
{
for(i=1;i<=zs[c-1];i++)
{
n=0;m=0;lop:m++;
while(m<JS)
{
for(g=0;g<c;g++)if(m==w[(i-1)*t[c-1]+n*t[c]+1][g])goto lop;
for(g=1;g<=t[c];g++)w[(i-1)*t[c-1]+n*t[c]+g][c]=m;n++;m++;
}
}
}
for(k=1;k<=JS;k++)
{
for(l=1;l<=JS;l++)
{
for(m=1;m<JS;m++)
{
for(n=1;n<JS;n++)
{
if(m<k&&n<l)hls[m][n]=a[m][n];
else if(m<k&&n>=l)hls[m][n]=a[m][n+1];
else if(m>=k&&n<l)hls[m][n]=a[m+1][n];
else hls[m][n]=a[m+1][n+1];
}
}
for(deta=0,p=1;p<=t[0];p++)
{
for(xiang=1,c=1;c<JS;c++)
xiang*=hls[c][w[p][c]];
for(u=1,g=0;u<JS-1;u++) for(v=u+1;v<JS;v++) if(w[p][v]<w[p][u])g++;
deta+=int(pow(-1,g)*xiang);
}
bs[l][k]=deta*int(pow(-1,k+l));
}
}
printf("\n逆矩阵为\n");
for(i=1;i<=JS;i++)
{
for(j=1;j<=JS;j++)
{
m=bs[i][j];
n=det;
for(r=1;r!=0;)
{r=m%n;
m=n;
n=r;
}
k=bs[i][j]/m;
l=det/m;
if(l==1)printf("%-d\t",k);
else if(l<0)
{ k=-k;
l=-l;
printf("%-d/%d\t",k,l);}
else printf("%-d/%d\t",k,l);
}
printf("\n");
}
printf("\n\n");
goto chongxin;
}本回答被提问者采纳
第2个回答  2010-06-13
#include <stdlib.h>
#include <math.h>
#include <stdio.h>
int brinv(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);
}

void brmul(double a[], double b[],int m,int n,int k,double c[])
{ int i,j,l,u;
for (i=0; i<=m-1; i++)
for (j=0; j<=k-1; j++)
{ u=i*k+j; c[u]=0.0;
for (l=0; l<=n-1; l++)
c[u]=c[u]+a[i*n+l]*b[l*k+j];
}
return;
}

int main()
{ int i,j;
static double a[4][4]={ {0.2368,0.2471,0.2568,1.2671},
{1.1161,0.1254,0.1397,0.1490},
{0.1582,1.1675,0.1768,0.1871},
{0.1968,0.2071,1.2168,0.2271}};
static double b[4][4],c[4][4];
for (i=0; i<=3; i++)
for (j=0; j<=3; j++)
b[i][j]=a[i][j];
i=brinv(a,4);
if (i!=0)
{ printf("MAT A IS:\n");
for (i=0; i<=3; i++)
{ for (j=0; j<=3; j++)
printf("%13.7e ",b[i][j]);
printf("\n");
}
printf("\n");
printf("MAT A- IS:\n");
for (i=0; i<=3; i++)
{ for (j=0; j<=3; j++)
printf("%13.7e ",a[i][j]);
printf("\n");
}
printf("\n");
printf("MAT AA- IS:\n");
brmul(b,a,4,4,4,c);
for (i=0; i<=3; i++)
{ for (j=0; j<=3; j++)
printf("%13.7e ",c[i][j]);
printf("\n");
}
}
}

参考资料:C常用算法程序集-徐士良

相似回答
大家正在搜