| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 237 人关注过本帖
标题:求达人指教
只看楼主 加入收藏
xiaokiss2008
Rank: 2
等 级:论坛游民
帖 子:37
专家分:20
注 册:2011-7-8
结帖率:28.57%
收藏
 问题点数:0 回复次数:0 
求达人指教
我这个程序是实现矩阵运算AX=B,求出X,帮我看看错在哪里
程序代码:
#include <stdio.h>
#include<math.h>
#include <malloc.h>
float jisuanD(float *p,short int n);      //求矩阵的行列式
float jisuanM(float *p, short int m,short int n,short int k); //求代数余子式
float jieguo(float *p,short int n,float *q,short int m);
void print( float *p,short int n);     //打印n×n的矩阵

void main( void )
{
     float *buffer,*p,*q,*buffer1;   //定义数组首地址指针变量
     short int row,num; //定义矩阵行数row及矩阵元素个数
     short int i,j,n,m;
     float determ,deter1;      //定义矩阵的行列式

      printf("\nPlease input the number of rows: ");
     scanf("%d",&row);
   
     num=2 * row * row;
     buffer = (float *)calloc(num, sizeof(float));     //分配内存单元

     p=buffer;
     if(p != NULL)
     {
         for(i=0;i<row;i++)                   //输入各单元值
         {
             printf("Input the number of %d row ",i+1);
             for(j=0;j<row;j++)
             {
                 scanf("%f",p++);
             }
         } 
     }
     else
         printf( "Can't allocate memory\n" );

     printf("\nThe original matrix is:\n");
     print(buffer,row);     //打印该矩阵

     determ=jisuanD(buffer,row);     //求矩阵的行列式
     p=buffer + row * row;
     if (determ != 0)
     {
         for (i=0;i<row; i++)       //求逆矩阵
             for (j=0; j<row; j++)
                    *(p+j*row+i)=jisuanM(buffer,i,j,row)/determ;   
           
         printf("The determinant is %G\n",determ);

         p=buffer + row * row;
         printf("\nThe inverse matrix is:\n");
         print(p,row);     //打印该矩阵
     }
     else
         printf("The determnant is 0, and there is no inverse matrix !\n");
    
      printf("\nPlease input the number of rows: ");
     scanf("%d",&row);
   
    
     num=2 * row * row;
     buffer1 = (float *)calloc(num, sizeof(float));     //分配内存单元

     q=buffer1;
     if(q!= NULL)
     {
         for(i=0;i<row;i++)                   //输入各单元值
         {
             printf("Input the number of %d row ",i+1);
             for(j=0;j<row;j++)
             {
                 scanf("%f",q++);
             }
         } 
     }
     else
         printf( "Can't allocate memory\n" );

     printf("\nThe original matrix is:\n");
      q=buffer1 + row * row;
     print(buffer1,row);     //打印该矩阵
    
     deter1=jieguo(buffer,n,buffer1, m);
     print(buffer1,row);

     free( buffer );
     free(buffer1);
}

//功能:求矩阵 n X n 的行列式
//入口参数:矩阵首地址 p;矩阵行数 n
//返回值:矩阵的行列式值
float jisuanD(float *p,short int n) 
{
     short int i,j,m;         //i--row; j--column
     short int lop=0;
     float result=0;
     float mid=1;
   
     if (n!=1)
     {
         lop=(n==2)?1:n;     //控制求和循环次数,若为2阶,则循环1次,否则为n次

         for(m=0;m<lop;m++)
         {
             mid=1;          //顺序求和
             for(i=0,j=m;i<n;i++,j++)
                 mid=mid*(*(p+i*n+j%n) );
             result+=mid;
         }

         for(m=0;m<lop;m++)
         {                      
             mid=1;          //逆序相减
             for(i=0,j=n-1-m+n; i<n; i++,j--)
                 mid=mid*(*(p+i*n+j%n));  //算该元素的相对位置公式为:i*m+j (i,j=0,1,2, ...)
             result-=mid;
         }
        }
     else result=*p;
     return(result);
}

//功能:求k×k矩阵中元素A(mn)的代数余子式
//入口参数:k×k矩阵首地址;元素A的下标m,n; 矩阵行数 k
//返回值: k×k矩阵中元素A(mn)的代数余子式
float jisuanM(float *p, short int m,short int n,short int k)
{
     short int len;
     short int i,j;
     float mid_result=0;
     short int quo=1;
     float *p_jisuan,*p_mid;

     len=(k-1)*(k-1);
     p_jisuan = (float *)calloc(len, sizeof(float));     //分配内存单元
     p_mid=p_jisuan;
     for(i=0;i<k;i++)
         for(j=0;j<k;j++)
         {
             if (i!=m && j!=n)
                 *p_mid++ =* (p+i*k+j);           
         }
     //     print(p_jisuan,k-1);
     quo = (m + n) %2==0 ? 1:-1;
     mid_result = (float ) quo * jisuanD(p_jisuan,k-1);
     free(p_jisuan);
     return(mid_result);
}

//功能:求逆矩阵a与矩阵b的乘积
//入口参数:矩阵首地址 p,q;矩阵行数 n,m
//返回值:矩阵行列式
float jieguo(float *p,short int n,float *q,short int m)
{
    short int i,j,le,z;
    float *c,e,d;
    float a[100][100],b[100][100];
    c=(float *)calloc(le,sizeof(float));
    z=n>m?n:m;
    for(i=0;i<z;i++)
    {
        for(j=0;j<z;j++)
        {
            a[i][j]=*(p+i*z+j);
            b[i][j]=*(q+i*z+j);
        }
    }
    for(i=0;i<z;i++)
    {
        for(j=0;j<z;j++)
        {
            d=a[i][j]*b[j][i];
            e=e+d;
            *(c+i*z+j)=e;
        }
    }
    return (*c);
}


//功能:打印n×n的矩阵
//入口参数:n×n矩阵的首地址;该矩阵的行数 n
//返回值: 无
void print( float *p,short int n)   
{
     int i,j;
     for (i=0;i<n;i++)
     {
         for (j=0; j<n;j++)
             printf("%10G ",*p++);
         printf("\n");
     }
     printf("--------------\n");
}
2011-07-26 13:56
快速回复:求达人指教
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015366 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved