矩陣化爲代數裏面的階梯型和它的標準型

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))


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章