zoukankan      html  css  js  c++  java
  • matlab中求逆矩阵的高斯消元法实现的代码

    function qiuni =INV_GET(a)
    N=length(a);
    M=eye(N);
    %得到上三角矩?
    for i=1:N
    max=a(i,i);
    A=i;
    for j=i+1:N
    if(abs(a(j,i))>abs(max))%找最大值
    max=a(j,i);
    A=j;
    end
    end
    for m=1:N
    temp1=a(i,m);%交换最大值值所在的行和当前行
    a(i,m)=a(A,m);
    a(A,m)=temp1;
    temp2=M(i,m);
    M(i,m)=M(A,m);
    M(A,m)=temp2;
    end
    for k=i+1:N
    jiaquan=a(k,i)/a(i,i);%其他行加权得到上三角
    for n=1:N
    a(k,n)=a(k,n)-jiaquan*a(i,n);
    M(k,n)=M(k,n)-jiaquan*M(i,n);
    end
    end

    end
    temp3=a;
    %得到单位矩阵
    for s=N:-1:1
    xishu1 =a(s,s);
    for p=s:N
    a(p,s)=a(p,s)/xishu1;
    end
    for q=1:N
    M(s,q)=M(s,q)/xishu1;
    end
    for w=s-1:-1:1
    xishu=a(w,s);
    a(w,s)=0;
    for t=1:N
    M(w,t)=M(w,t)-xishu*M(s,t);
    end
    end
    end
    temp2=a;
    qiuni=M;

     参考的c语言程序和注释

    #include<stdio.h>

    #include<math.h>

    long int const N=1000;     //定义矩阵最大为1000阶

    int n;              //n表示矩阵的行数和列数。

    double juzhen[N][N]; //定义一个1000阶矩阵

    double danwei[N][N];   //定义一个单位矩阵

    bool zhaozuidazhi(int s)//定义一个布尔型从s行到n行选择最大的元素作为主元的函数。

    {

        int i,j,A;

        double mas,temp;   //temp为中间变量,实现行交换

        mas=fabs(juzhen[s][s]);    //数学函数:fabs  功能:求浮点数juzhen[s][s]的绝对值

        //计算juzhen[s][s], 当juzhen[s][s]不为负时返回juzhen[s][s],否则返回-juzhen[s][s]

        A=s;

        for(i=s+1;i<n;i++)

        {

           if(mas<fabs(juzhen[i][s]))

           {

               mas=fabs(juzhen[i][s]);

               A=i;

           }

        }

        if(mas==0)

           return false;

        //交换两行

        for(j=0;j<n;j++)

        {

           temp=juzhen[s][j];

           juzhen[s][j]=juzhen[A][j];

           juzhen[A][j]=temp;

          

           temp=danwei[s][j];

           danwei[s][j]=danwei[A][j];

           danwei[A][j]=temp;

        }

        return true;

    }

    void jisuan(int s)  //消元计算

    {

        int i,j;

        double mas=juzhen[s][s],r;

        for(i=s+1;i<n;i++)

        {

           r=juzhen[i][s]/mas;

           for(j=0;j<n;j++)

           {    //利用消元计算方阵使之成为上三角矩阵,最后使主对角线上的元素相乘就是最终结果 

               juzhen[i][j]=juzhen[i][j]-juzhen[s][j]*r;

               danwei[i][j]=danwei[i][j]-danwei[s][j]*r;

           }

        }

    }

    void HH(int s)

    {

        int i,j;

        double mas;

        mas=juzhen[s][s];

        for(i=s;i<n;i++)

           juzhen[s][i]=juzhen[s][i]/mas;

        for(i=0;i<n;i++)

           danwei[s][i]=danwei[s][i]/mas;

        for(i=s-1;i>=0;i--)

        {

           mas=juzhen[i][s];

           juzhen[i][s]=0;

            for(j=0;j<n;j++)

               danwei[i][j]=danwei[i][j]-mas*danwei[s][j];

        }

    }

    int main()

    {

        int i,j;

    zl: printf("第一行输入矩阵的阶数,然后回车输入原始矩阵: ");

        scanf("%d",&n);

        for(i=0;i<n;i++)

        {

           for(j=0;j<n;j++)

           {

               if(i==j) danwei[i][j]=1;

               else danwei[i][j]=0;

               scanf("%lf",&juzhen[i][j]);//C语言的函数参数是传值而不是传引用的,

               //通常函数无法修改和操作参数.scanf可以修改参数的原因是传给scanf的

               // 那个参数是一个指针,scanf通过传过来的指针来修改指针指向的内容。所以,

               //把x取地址再传过去。&是取juzhen[i][j]的地址,%lf是说juzhen[i][j]是一个双精度浮点型.

           }

        }

       

        //将原始矩阵转成上三角矩阵

        for(i=0;i<n-1;i++)

        {

           //每一次选一个绝对值最大的值作为a[i]即主元

           if(zhaozuidazhi(i)) //函数调用

           {

               jisuan(i);   //函数调用

     

           }

           else

           {

               printf("该矩阵不可逆");//高斯消去法不能将原始矩阵化为三角形的格式,

                                     //那就代表原始矩阵是一个不可逆的矩阵,

               return 0;

           }

        }

        //将原始矩阵转化成单位矩阵

        for(i=n-1;i>=0;i--)

        {

           HH(i);

        }

             printf(" 原始矩阵的逆矩阵为: ");//输出逆矩阵语句

             for(i=0;i<n;i++)

             {    

                 for(j=0;j<n;j++)

                    printf("%.2lf ",danwei[i][j]);//%.2lf在printf()里表示按下面格式

                 // 输出一个long double型数:整数部分输出全部输出小数部分输出2位,

                 //没有小数的输出两个0,不足两位的后面补0,大于两位的截短到两位。

                  //测试结果会出现两位小数

         

                 printf(" ");

             }

             goto zl;

    }

  • 相关阅读:
    获取指定位置的颜色值
    《QTP自动化测试进阶》读书笔记
    Delphi自动化测试
    QTP中DOM的递归调用取html页面值
    PowerShell
    Dictionary对象与XML文件之间的导入导出
    BPT业务流程自动化测试
    VisualStudio 自动化测试框架 Coded UI Test
    使用QTP查找邮件
    QTP11视频
  • 原文地址:https://www.cnblogs.com/lianjiehere/p/3975455.html
Copyright © 2011-2022 走看看