高等代数的理论知识
(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