通过C#实现矩阵求逆-简单版

网上大部分C#实现矩阵求逆都比较复杂,现在在这里分享一种很好理解的矩阵求逆方法,而且可以适用于任何形式的可逆矩阵求逆,但是肯定运行效率不如其它的算法,正所谓鱼和熊掌不可兼得。

我们采用的是通过单位矩阵变换的这种方法来实现的,话不多说,下面解释实现原理。

将需要变化的矩阵与单位矩阵拼在一起形成增广矩阵。

A为需要求逆的矩阵,E为单位矩阵。

如图

通过C#实现矩阵求逆-简单版_第1张图片

 然后我们经过初等行列式变换,将增广矩阵左半部分变为单位矩阵,那么右半部分我们就可以得到A的逆矩阵,具体原理可以自行百度,这里就不再阐述原理了。

虽然我们通过手算可以轻易的进行初等行变换,知道通过调换两行来让计算更加简便,知道如何才能让除对角线元素都变为0,但是计算机想要实现我们灵活的思想似乎不太容易,所以此时我们想是否可以通过一种通用的行列式变换来达到目的。

我的想法是这样的,先让需要求逆的矩阵的左下部分变为零,之后再让右上部分变为零,这样似乎就可以实现我们的求逆了。

如图,按照以下逻辑进行变换,更高阶数的矩阵也可以使用同样的逻辑进行变换。

通过C#实现矩阵求逆-简单版_第2张图片

 此时我们发现右上角也可以用同样的逻辑进行变换,只不过用一个与之前相反的循环就可以了。

代码实现



//input_matrix应该为一个二维数组,如何创建二维数组这里不再阐述,请先将input_matrix变为二维数组
int row = input_matrix.GetLength(0);
int col = input_matrix.GetLength(1); //获取数组长度
double[,] temp_matrix = new double[1, col]; //创建一个临时数组,用以承接变量
            //消除左下元素
            for (int j = 0; j < col; j++)
            {
                for (int i = 0; i < row; i++) //两个循环来遍历整个数组
                {
                    if (i == j) //为了消除左下半元素,做一个元素位置的过滤,右上半元素不看
                    {
                        for (int item_i = i + 1; item_i < row; item_i++) //循环行
                        {
                            if (item_i == row)
                            {
                                continue; //边界判断,如果到达矩阵行边界,便跳出循环
                            }
                            else if (input_matrix[item_i, j] != 0) //如果下一行元素不为零,就开始进行行变换
                            {

                                double temp_value = input_matrix[item_i, j] / input_matrix[i, j]; //得到变换的倍数
                                for (int item_j = j; item_j < col; item_j++) //对同一行的每一列进行变换
                                {
                                    
                                    input_matrix[item_i, item_j] -= temp_value * input_matrix[i, item_j]; //对每一列乘以倍数以便进行行变换
                                    
                                }
else
                            {
                                //没有意义,单纯为了if语句的完整
                            }
                        }
                    }

                 }
             }

你可能感兴趣的:(矩阵,线性代数,c#)