网上大部分C#实现矩阵求逆都比较复杂,现在在这里分享一种很好理解的矩阵求逆方法,而且可以适用于任何形式的可逆矩阵求逆,但是肯定运行效率不如其它的算法,正所谓鱼和熊掌不可兼得。
我们采用的是通过单位矩阵变换的这种方法来实现的,话不多说,下面解释实现原理。
将需要变化的矩阵与单位矩阵拼在一起形成增广矩阵。
A为需要求逆的矩阵,E为单位矩阵。
如图
然后我们经过初等行列式变换,将增广矩阵左半部分变为单位矩阵,那么右半部分我们就可以得到A的逆矩阵,具体原理可以自行百度,这里就不再阐述原理了。
虽然我们通过手算可以轻易的进行初等行变换,知道通过调换两行来让计算更加简便,知道如何才能让除对角线元素都变为0,但是计算机想要实现我们灵活的思想似乎不太容易,所以此时我们想是否可以通过一种通用的行列式变换来达到目的。
我的想法是这样的,先让需要求逆的矩阵的左下部分变为零,之后再让右上部分变为零,这样似乎就可以实现我们的求逆了。
如图,按照以下逻辑进行变换,更高阶数的矩阵也可以使用同样的逻辑进行变换。
此时我们发现右上角也可以用同样的逻辑进行变换,只不过用一个与之前相反的循环就可以了。文章来源:https://www.toymoban.com/news/detail-709257.html
代码实现文章来源地址https://www.toymoban.com/news/detail-709257.html
//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#实现矩阵求逆-简单版的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!