| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 259 人关注过本帖
标题:求助! 大神都过来看看! 谢谢了!
只看楼主 加入收藏
机械男
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2012-2-21
结帖率:0
收藏
 问题点数:0 回复次数:2 
求助! 大神都过来看看! 谢谢了!
函数头 void PrintOut(double M[n][n])  中m[n][n]中n没被定义,怎么定义啊
搜索更多相关主题的帖子: double void 
2012-03-22 21:57
nicum
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:180
专家分:712
注 册:2011-2-1
收藏
得分:0 
void PrintOut(double M[][]);就可以了
2012-03-22 22:28
机械男
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2012-2-21
收藏
得分:0 
回复 2楼 nicum
不行啊
#include <stdio.h>
#include <math.h>


//打印矩阵


void PrintOut(int n,double M[][n])
{
 int i,j,n;
 for(i = 0; i<n;  i++) //行
 {
  printf("\n");
  for(j=0; j<n; j++)
  {
   printf("%4.3f\t",M[i][j]);
  }
 }
 printf("\n");
}


//采用部分主元法的高斯消去法求方阵A的逆矩阵B
//
//A 方阵  (IN)
//n 方阵的阶数 (IN)
//B 方阵  (OUT)
//返回true 说明正确计算出逆矩阵
//返回false说明矩阵A不存在逆矩阵


bool gaussj(double A[][], double B[][])
{
 int i,j,k,n;
 double lMax,temp;

 //临时矩阵存放A
 double tt[n][n];
 for(i=0;i<n;i++)
 {
  for(j=0;j<n;j++)
  {
   tt[i][j] = A[i][j];
  }
 }

 //初始化B为单位阵
 for(i=0;i<n;i++)
 {
  for(j=0;j<n;j++)
  {
   if(i!=j)B[i][j] = 0;
   else B[i][j] = 1;
  }
 }
 for(i=0;i<n;i++)
 {
  //寻找主元
  lMax = tt[i][i];
  k = i;
  for(j=i+1;j<n;j++) //扫描从i+1到n的各行
  {
   if( fabs(tt[j][i]) > fabs(lMax))
   {
    lMax = tt[j][i];
    k = j;
   }
  }
  //如果主元所在行不是第i行,进行行交换
  if(k!=i)
  {
   for(j=0;j<n;j++)
   {
    temp = tt[i][j] ;
    tt[i][j] = tt[k][j];
    tt[k][j] = temp;
    //B伴随计算
    temp = B[i][j];
    B[i][j] = B[k][j];
    B[k][j] = temp;
   }
  }
  //判断主元是否是0,如果是,则矩阵A不是满秩矩阵,不存在逆矩阵
  if(tt[i][i] == 0) return false;
  //消去A的第i列除去i行以外的各行元素
  temp = tt[i][i];
  for(j=0;j<n;j++)
  {
   tt[i][j] = tt[i][j] / temp; //主对角线上元素变成1
   B[i][j] = B[i][j] / temp; //伴随计算
  }

  for(j=0;j<n;j++) //行 0 -> n
  {
   if(j!=i)  //不是第i行
   {
    temp = tt[j][i];
    for(k=0;k<n;k++) // j行元素 - i行元素* j行i列元素
    {
     tt[j][k] = tt[j][k] - tt[i][k] * temp;
     B[j][k] = B[j][k] - B[i][k] * temp;
    }
   }
  }
 }
 return true;
}


//计算两个矩阵的乘积
// AB -> C


void Multi(double A[][], double B[][], double C[][])
{
 int i,j,k,n;
 for(i=0;i<n;i++)
 {
  for(j=0;j<n;j++)
  {
   C[i][j] = 0;
   for(k=0;k<n;k++)
   {
    C[i][j] += A[i][k] * B[k][j];
   }
  }
 }
}



//测试
void  main()
{
 double A[6][6] = { {1 ,2, -5,7,3,5},
      {1,1,2,-3,2,5},
      {2,0,1,2,5,7},
      {3,0,0,1,8,4},
 {4,3,6,2,5,4},
 {5,3,4,2,4,6}
     };
 double B[6][6];
 double C[6][6];

 printf("矩阵:");
 PrintOut(A);

 if(!gaussj(A,B))
 {
  printf("没有逆矩阵!\n");
 }
 else
 {
  printf("\n的逆矩阵是:");
  PrintOut(B);

  printf("\nA*B = ");
  Multi(A,B,C);
  PrintOut(C);
 }
 printf("\nTest Completed!\n");
}

就是这程序 矩阵求逆的  本来是M[4][4]的。我想整成M[N][N]的,到时候测试的主函数能随便几阶矩阵都能算出来了 不知道我这种想法可行不 大神再给指点指点
2012-03-22 23:40
快速回复:求助! 大神都过来看看! 谢谢了!
数据加载中...
 
   



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

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