怎样用C语言求矩阵的秩

 我来答
tattackor
推荐于2018-03-04 · TA获得超过3.5万个赞
知道大有可为答主
回答量:5083
采纳率:94%
帮助的人:895万
展开全部
  1. 这是一个算法的实现过程。首先需要了解什么是矩阵的秩,它的计算方法是啥。弄清楚算法之后,用C语言实现即可。

  2. 线性代数中,一个矩阵A的列秩是A的线性独立的纵列的极大数目。类似地,行秩是A的线性无关的横行的极大数目。通俗一点说,如果把矩阵看成一个个行向量或者列向量,秩就是这些行向量或者列向量的秩,也就是极大无关组中所含向量的个数。

  3. 算法主要就是消元法,下面是例程:

    /*开始输入的m为矩阵行数,输入的n为矩阵列数*/
    #include<stdio.h>
    #include<conio.h>
    #include<dos.h>
    #define MAX 10  //最大行(列)数
    typedef struct
    { int m,n;
      int a[MAX][MAX];
    } matrix;
    void input_matrix(matrix *dat);
    void output_matrix(matrix dat);
    void exchang_row(int *a,int *b,int n);  //交换两行
    void mul_row(int *a,int k,int n);  //将某一行乘以k
    void add_row(int *a1,int *a2,int k,int n); //将a2行的k倍加到a1行上
    int rank_matrix(matrix dat,matrix *res);
    void main()
    { matrix a,b;
      int r;
      input_matrix(&a);
      r=rank_matrix(a,&b);
      system("cls");
      printf("The original matrix:\n");
      output_matrix(a);
      printf("After transforming:\n");
      output_matrix(b);
      printf("\nr(A)=%d\n",r);
      getch(); 
    }
    void input_matrix(matrix *dat)   //输入矩阵
    { int i,j;
      do
       { printf("m(1-%d)=",MAX);
         scanf("%d",&(dat->m));
       } while((dat->m)<1||(dat->m)>MAX);
      do
       { printf("n(1-%d)=",MAX);
         scanf("%d",&(dat->n));
       } while((dat->n)<1||(dat->n)>MAX);
      for(i=0;i<(dat->m);i++)
       for(j=0;j<(dat->n);j++)
        { printf("a(%d,%d)=",i+1,j+1);
          scanf("%d",&(dat->a[i][j]));
        }
    }
    void output_matrix(matrix dat)  //显示矩阵
    { int m,n,i,j;
      m=dat.m;n=dat.n;
      for(i=0;i<m;i++)
       { for(j=0;j<n;j++)
          printf("%-4d",dat.a[i][j]);
         printf("\n");
       }
    }
    void exchang_row(int *a,int *b,int n)
    { int i,t;
      for(i=0;i<n;i++)
       { t=a[i];
         a[i]=b[i];
         b[i]=t;
       }
    }
    void mul_row(int *a,int k,int n)
    { int i;
      for(i=0;i<n;i++)
       a[i]*=k;
    }
    void add_row(int *a1,int *a2,int k,int n)
    { int i;
      for(i=0;i<n;i++)
       a1[i]+=a2[i]*k;
    }
    int rank_matrix(matrix dat,matrix *res) //求秩(返回值为秩,第2个参数为变换得到的阶梯阵)
    { int m,n,i,t;
      int ri,ci;  //行标记与列标记
      int f_z;    //某列是否全为0的标志,为1表示全为0
      m=dat.m;n=dat.n;
      for(ri=ci=0;ci<n;ci++)
       { f_z=1;
         for(i=ri;i<m;i++)
          if(dat.a[i][ci]!=0)
           { if(i!=ri)
              if(f_z)
               exchang_row(&(dat.a[ri][ci]),&(dat.a[i][ci]),n-ci);
              else
               { t=dat.a[i][ci];
                mul_row(&(dat.a[i][ci]),dat.a[ri][ci],n-ci);
                add_row(&(dat.a[i][ci]),&(dat.a[ri][ci]),-t,n-ci);
               }
             f_z=0;
           }
         if(!f_z) ri++;
       }
      *res=dat;
      return ri;
    }
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式