二维矩阵求逆_linux和fortran的站点_百度空间

        static double [,] MatrixInverse(double[,] matrixIn)
        {
            //二维矩阵求逆
            //该方法为:采用全选主元高斯-约当(gauss-jordan)消去法;算法描述:《常用算法程序集(C语言描述)》(第三版) 徐士良 清华大学出版
            //该书40页,具体方法为一般实矩阵求逆
            //该函数没有判断该矩阵是否可逆,(如果不可逆,原样输出),该函数判断了是否为方阵,(非方阵,原样输出)
            //program by c#
            //by
            //last modify 2010-1-25
            int n = matrixIn.GetLength(0);//获得矩阵大小,行数
            int m = matrixIn.GetLength(1);//获得矩阵列数
            double[,] matrix=new double[n,m];
            for (int i = 0; i <= n - 1;i++ )
            {
                for (int j = 0; j <= m - 1;j++ )
                {
                    matrix[i,j]=matrixIn[i,j];
                }
            }
            if (n!=m)
            {
                //输入矩阵不为方阵
                //Console.WriteLine("input matrix have problem!");
                goto endResult;
            }
            double temp=0.0;
            double maxValue=0.0;
            int [] iz =new int[n];
            int[] jz = new int[n];
            int k;
            for (k = 0; k <= n - 1;k++ )
            {
                maxValue = 0.0;
                for (int i = k; i <= n - 1;i++ )
                {
                    for (int j=k;j<=n-1;j++)
                    {
                        double value = Math.Abs(matrix[i, j]);
                        if (value>maxValue)
                        {
                            maxValue = value;
                            iz[k] = i;
                            jz[k] = j;
                        }
                    }
                   
                }
                if (maxValue+1.0==1.0)
                {
                   // Console.WriteLine("NOT FIND MAX VALUE!");
                }
                if (iz[k]!=k)
                {
                    //行交换
                    for (int i = 0; i <= n - 1;i++ )
                    {
                        temp=matrix[k,i];
                        matrix[k,i]=matrix[iz[k],i];
                        matrix[iz[k], i] = temp;
                    }
                }
                if (jz[k]!=k)
                {
                    //列交互
                    for (int j = 0; j <= n - 1;j++ )
                    {
                        temp=matrix[j,k];
                        matrix[j,k]=matrix[j,jz[k]];
                        matrix[j, jz[k]] = temp;
                    }
                }
                //归一化
                matrix[k,k]=1.0/matrix[k,k];
                for (int j = 0; j <= n - 1;j++ )
                {
                    if (j!=k)
                    {
                        matrix[k,j]=matrix[k,j]*matrix[k,k];
                    }
                }
                //消元计算
                for (int i = 0; i <= n - 1;i++ )
                {
                    if (i!=k)
                    {
                        for (int j = 0; j <= n - 1;j++ )
                        {
                            if (j!=k)
                            {
                                matrix[i,j]=matrix[i,j]-matrix[i,k]*matrix[k,j];
                            }
                        }
                    }
                }
                for (int i = 0; i <= n - 1;i++ )
                {
                    if (i!=k)
                    {
                        matrix[i,k]=-matrix[i,k]*matrix[k,k];
                    }
                }
            }
            for (k = n - 1; k >= 0;k-- )
            {
                if (jz[k]!=k)
                {
                    for (int j = 0; j <= n - 1;j++ )
                    {
                        temp=matrix[k,j];
                        matrix[k,j]=matrix[jz[k],j];
                        matrix[jz[k], j] = temp;
                    }
                }
                if (iz[k]!=k)
                {
                    for (int i = 0; i <= n - 1;i++ )
                    {
                        temp=matrix[i,k];
                        matrix[i,k]=matrix[i,iz[k]];
                        matrix[i, iz[k]] = temp;
                    }
                }
            }
            endResult:
            return matrix;
        }



郑重声明:资讯 【二维矩阵求逆_linux和fortran的站点_百度空间】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——