首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

紧急求教 !关于逆矩阵的实现,该如何处理

2012-03-25 
紧急求教 !!!关于逆矩阵的实现doubleair(doublea[],intn){int*is,*jsinti,j,k,l,u,vdoubled,pis(int*)

紧急求教 !!!关于逆矩阵的实现
double   air(double       a[]       ,       int       n)      
{      
int       *is,*js;      
            int       i,j,k,l,u,v;      
            double       d,p;      
            is=(int       *)malloc(n*sizeof(int));      
            js=(int       *)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);      
                                return(0);      
                        }      
                        if       (is[k]!=k)      
                            for       (j=0;       j <=n-1;       j++)      
                            {      
        u=k*n+j;      
                v=is[k]*n+j;      
                                        p=a;      
        a=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;      
        a=a[v];      
        a[v]=p;      
                            }      
                        l=k*n+k;      
                        a[l]=1/a[l];      
                        for       (j=0;       j <=n-1;       j++)      
                            if       (j!=k)      
                            {      
        u=k*n+j;      
        a=a*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=a-a[i*n+k]*a[k*n+j];      
                                        }      
                        for       (i=0;       i <=n-1;       i++)      
                            if       (i!=k)      


                            {      
        u=i*n+k;      
        a=-a*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;      
        a=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;      
        a=a[v];      
        a[v]=p;      
                            }      
            }      
            free(is);      
free(js);      
            return(1);      
        }  

double   air(double   a[],intn);
int   main(void)
{
int   my[2][2]={1,2,3,4};
double   yu[][];
yu=air(my,2);
printf( "ni   juzhen   is   %8.3f ",yu[][]);
}

编译提示....yu=air(my,2);ERROR:Lovale   required   in   function   main
还有就是提示   main函数里存在几处警告...
可是,我真的看不出来那里错了.
麻烦好心人给我解释下..   怎么修改.谢谢了


[解决办法]
double * MatrixOpp(double A[],int m,int n) /*矩阵求逆*/
{
int i,j,x,y,k;
double *SP=NULL,*AB=NULL,*B=NULL,X,*C;
SP=(double *)malloc(m*n*sizeof(double));


AB=(double *)malloc(m*n*sizeof(double));
B=(double *)malloc(m*n*sizeof(double));

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];
}
}
C=MatrixInver(AB,m,n);

return C;
}

double * MatrixInver(double A[],int m,int n) /*矩阵转置*/
{
int i,j;
double *B=NULL;
B=(double *)malloc(m*n*sizeof(double));

for(i=0;i <n;i++)
for(j=0;j <m;j++)
B[i*m+j]=A[j*n+i];

return B;
}

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 air(double a[],intn);
int main(void)
{
int my[2][2]={1,2,3,4};
double yu[][];
yu=air(my,2);
printf( "ni juzhen is %8.3f ",yu[][]);
}
==》
double air(double a[],int n); //函数本身是否正确就不检查了
int main(void)
{
int my[2][2]={1,2,3,4};
double yu[][];
yu=air(my,2); //这里, 这样操作有效么 yu 是 double2维数组!那里可以这么接收,类型也不对
printf( "ni juzhen is %8.3f ",yu[][]); //!!错!
//printf( "ni juzhen is %8.3f ",yu[i][j]); //对一个数组,输出只能按元素,不能输出数组
}
[解决办法]
呵呵,切忌这样看自己。。

热点排行