Mtrans_uptriangle <- function(X)
{
if(is.null(dim(X))|dim(X)[1]==1|dim(X)[2]==1)#不是矩阵时,直接返回本身
{
return(as.vector(X))
}
else#处理矩阵
{
Mrow <- dim(X)[1]#行
Mcol <- dim(X)[2]#列
Mcol_index <- 1#列的索引
for(i in 1:(min(Mrow,Mcol) - 1))#n - 1次可以化为上三角
{
da <- X[,Mcol_index]#取出当前判断的列
da <- da[i:Mrow]#从i到末尾
temp1 <- which(da!=0)[1]
#找出列向量第一个不为0的元素的下标
if(is.na(temp1))
{
Mcol_index <- Mcol_index + 1
}
else
{
if(X[i,i] != 0)
{
for(j in (i+1):Mrow)#剩下的列化0
{
if(X[j,Mcol_index] !=0)
{
X[j,] <- X[j,] - X[i,]*X[j,Mcol_index]/X[i,Mcol_index]
}
}
Mcol_index <- Mcol_index + 1
}
else#X[i,i] == 0
{
temp2 <- X[i+temp1-1,]
X[i+temp1-1,] <- X[i,]
X[i,] <- temp2
for(j in (i+1):Mrow)#剩下的列化0
{
if(X[j,Mcol_index] !=0)
{
X[j,] <- X[j,] - X[i,]*X[j,Mcol_index]/X[i,Mcol_index]
}
}
Mcol_index <- Mcol_index + 1
}
}
}
}
Y <- matrix(rep(0,Mcol*Mrow), ncol = Mcol)
iii <- 1
for(i in 1: Mrow)
{
if(!is.na(which(X[i,]!=0)[1]))
{
Y[iii,] <- X[i,]
iii <- iii + 1
}
}
X <- Y
return(X)
}
Mtrans_uptriangle(magic::magic(4))
#利用上面函数的化为阶梯型在化为标准型
standard <- function(X)
{
options(digits = 5,scipen = 50)
X <- Mtrans_uptriangle(X)
zhi <- Matrix::rankMatrix(X)
Mcol <- zhi
for(ii in zhi:2)
{
for(jj in 1:(ii-1))
{
X[jj,] <- X[jj,]-X[ii,] * X[jj,Mcol]/X[ii,ii]
}
Mcol <- Mcol - 1
}
for(ii in 1:zhi)
{
X[ii,] <- X[ii,]/X[ii,ii]
}
print("标准型为")
X
}
standard(magic::magic(4))