11
votes

Forme d'échelon de rangée réduite

y a-t-il une fonction dans laquelle produit la forme de ligne d'une matrice ?. Cette référence dit qu'il n'y a pas. Êtes-vous d'accord?


0 commentaires

4 Réponses :


4
votes

Ne ressemble pas à une entreprise intégrée mais j'ai trouvé cette fonction RREF sur Cette Page .

 rref <- function(A, tol=sqrt(.Machine$double.eps),verbose=FALSE,
                 fractions=FALSE){
  ## A: coefficient matrix
  ## tol: tolerance for checking for 0 pivot
  ## verbose: if TRUE, print intermediate steps
  ## fractions: try to express nonintegers as rational numbers
  ## Written by John Fox
  if (fractions) {
    mass <- require(MASS)
    if (!mass) stop("fractions=TRUE needs MASS package")
  }
  if ((!is.matrix(A)) || (!is.numeric(A)))
    stop("argument must be a numeric matrix")
  n <- nrow(A)
  m <- ncol(A)
  for (i in 1:min(c(m, n))){
    col <- A[,i]
    col[1:n < i] <- 0
    # find maximum pivot in current column at or below current row
    which <- which.max(abs(col))
    pivot <- A[which, i]
    if (abs(pivot) <= tol) next     # check for 0 pivot
    if (which > i) A[c(i, which),] <- A[c(which, i),]  # exchange rows
    A[i,] <- A[i,]/pivot            # pivot
    row <- A[i,]
    A <- A - outer(A[,i], row)      # sweep
    A[i,] <- row                    # restore current row
    if (verbose)
      if (fractions) print(fractions(A))
      else print(round(A,round(abs(log(tol,10)))))
  }
  for (i in 1:n)
    if (max(abs(A[i,1:m])) <= tol)
      A[c(i,n),] <- A[c(n,i),] # 0 rows to bottom
  if (fractions) fractions (A)
  else round(A, round(abs(log(tol,10))))
}


0 commentaires

9
votes

Le paquet PRACMA contient également une implémentation. Voir Pracma :: Rref.


0 commentaires

18
votes

Je n'ai pas assez de représentant à commenter, mais la fonction donnée ci-dessus par soldat.moth dans la réponse acceptée [Modifier 2018: plus la réponse acceptée] est Buggy - il ne le fait pas Manipuler des matrices où la solution RREF a des zéros sur sa diagonale principale. Essayez E. g.

M <-Matrix (C (1,0,1,0,0,0,2), BYROW = True, NROW = 2) rref (m)

et notez que la sortie n'est pas dans RREF.

Je pense que je le travaille, mais vous pouvez vérifier les sorties pour vous-même: < Pré> xxx


5 commentaires

Cela ne fournit pas de réponse à la question. Pour critiquer ou demander des éclaircissements d'un auteur, laissez un commentaire sous leur poste - vous pouvez toujours commenter vos propres messages, et une fois que vous avez suffisamment Réputation Vous pourrez Commentaire sur n'importe quel message .


Désolé, je suis nouveau ici et j'ai peut-être manqué quelque chose, mais: la "réponse acceptée" fournie par soldat.Moth ci-dessus est buggy (comme j'ai découvert la dure quand j'ai essayé de l'utiliser moi-même!) Alors je pensais que c'était important signaler cela. Je n'ai pas assez de représentant pour commenter directement la réponse du soldat.Moth directement, alors j'ai créé une nouvelle réponse - que devrais-je avoir fait ici?


Gagner suffisamment de réputation pour commenter d'abord?


haussement d'épaules Je n'ai vraiment pas pensé que personne ne serait dérangé par moi en soulignant un virus non évident qui avait disparu quatre ans sans correction, et étant donné que la "solution" buggy postée ci-dessus était acceptée comme réponse. Je suis perplexe sur la raison pour laquelle une version fixe du même code est considérée comme moins.


@Geoffreybrent, bienvenue à Stackoverflow. Où les règles remplacent le bon sens.



7
votes

Il existe également un colis récent développé pour enseignement em> algèbre linéaire ( MATLIB ) qui calcule la forme d'échelon d'une matrice et montre les étapes utilisées en cours de route.

Exemple de la Documents de référence : P>

library('matlib')
A <- matrix(c(2, 1, -1,-3, -1, 2,-2, 1, 2), 3, 3, byrow=TRUE)
b <- c(8, -11, -3)
echelon(A, b, verbose=TRUE, fractions=TRUE)

Initial matrix:
     [,1] [,2] [,3] [,4]
[1,]   2    1   -1    8 
[2,]  -3   -1    2  -11 
[3,]  -2    1    2   -3 

row: 1 

 exchange rows 1 and 2 
     [,1] [,2] [,3] [,4]
[1,]  -3   -1    2  -11 
[2,]   2    1   -1    8 
[3,]  -2    1    2   -3 

 multiply row 1 by -1/3 
     [,1] [,2] [,3] [,4]
[1,]    1  1/3 -2/3 11/3
[2,]    2    1   -1    8
[3,]   -2    1    2   -3

 multiply row 1 by 2 and subtract from row 2 
     [,1] [,2] [,3] [,4]
[1,]    1  1/3 -2/3 11/3
[2,]    0  1/3  1/3  2/3
[3,]   -2    1    2   -3

 multiply row 1 by 2 and add to row 3 
     [,1] [,2] [,3] [,4]
[1,]    1  1/3 -2/3 11/3
[2,]    0  1/3  1/3  2/3
[3,]    0  5/3  2/3 13/3

row: 2 

 exchange rows 2 and 3 
     [,1] [,2] [,3] [,4]
[1,]    1  1/3 -2/3 11/3
[2,]    0  5/3  2/3 13/3
[3,]    0  1/3  1/3  2/3

 multiply row 2 by 3/5 
     [,1] [,2] [,3] [,4]
[1,]    1  1/3 -2/3 11/3
[2,]    0    1  2/5 13/5
[3,]    0  1/3  1/3  2/3

 multiply row 2 by 1/3 and subtract from row 1 
     [,1] [,2] [,3] [,4]
[1,]    1    0 -4/5 14/5
[2,]    0    1  2/5 13/5
[3,]    0  1/3  1/3  2/3

 multiply row 2 by 1/3 and subtract from row 3 
     [,1] [,2] [,3] [,4]
[1,]    1    0 -4/5 14/5
[2,]    0    1  2/5 13/5
[3,]    0    0  1/5 -1/5

row: 3 

 multiply row 3 by 5 
     [,1] [,2] [,3] [,4]
[1,]    1    0 -4/5 14/5
[2,]    0    1  2/5 13/5
[3,]    0    0    1   -1

 multiply row 3 by 4/5 and add to row 1 
     [,1] [,2] [,3] [,4]
[1,]    1    0    0    2
[2,]    0    1  2/5 13/5
[3,]    0    0    1   -1

 multiply row 3 by 2/5 and subtract from row 2 
     [,1] [,2] [,3] [,4]
[1,]  1    0    0    2  
[2,]  0    1    0    3  
[3,]  0    0    1   -1  


0 commentaires