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

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

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

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

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

如图

67f494d352a1466d836ff220c144061e.jpeg

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

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

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

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

a866dbf078514b188c91a201d67bfcad.jpeg

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

代码实现



//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语句的完整
                            }
                        }
                    }

                 }
             }
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

傲娇邂逅双马尾.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值