用初等行变换求矩阵的逆

高等代数的理论知识

(A | E) 经过初等行变换(E | A-1)(A-1 代表A的逆)

matrix_inv <- function(A)
{
  A_zhi <- Matrix::rankMatrix(A)[1]
  n_row <- dim(A)[1]
  n_col <- dim(A)[2]
  if((n_col==n_row)&(n_row == A_zhi))
  {
    B <- diag(1,n_col)
    col_index <- 1
    for(row_index in 1:(n_row - 1))
    {
      temp_col <- A[col_index:n_row,col_index]
    
      non_zreo_row <- which(temp_col!=0)[1]
      #一定找出当前行第一个元素不为零
      temp_row <- A[col_index,]
      A[col_index,] <- 
        A[col_index + non_zreo_row - 1,]
      A[col_index + non_zreo_row - 1,] <- temp_row 
      temp_row1 <- B[col_index,]
      B[col_index,] <- 
        B[col_index + non_zreo_row - 1,]
      B[col_index + non_zreo_row - 1,] <- temp_row1
      #其余的元素化零
      for(j in (col_index + 1):n_row)
      {
        temp_number <-
          A[j,col_index]/A[col_index,col_index]
        A[j,] <- A[j,] - A[col_index,]*  temp_number
        B[j,] <- B[j,] - B[col_index,]* temp_number
      }
      col_index <- col_index + 1
    }
    #此是的A时候一个上三角,接下来化为对角矩阵
    col_index <- n_col
    for(row_index in n_row:2)
    {
      for(j in (col_index - 1):1)
      {
        temp_number <-  
          A[j,col_index]/A[col_index,col_index]
        A[j, ] <- A[j, ] - A[col_index,] *  
          temp_number
        B[j,] <- B[j,] - B[col_index,] *
          temp_number
      }
      col_index <- col_index - 1
    }
    #此是的A时候一个对角矩阵,接下来化为对角矩阵
    #标准化
    for(i in 1:n_col)
    {
      B[i,] <- B[i,]/A[i,i]
    }
    return(MASS::fractions(B))
  }
  else
  {
    print("输入的矩阵无法求逆")
  }
}

matrix_inv(A)
 [,1] [,2] [,3]
[1,]  1    0   -1  
[2,] -1    1    1  
[3,]  0    0    1 

    原文作者:2018每天打卡
    原文地址: https://blog.csdn.net/jqm299299/article/details/80553086
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞