2010-06-27 5 views

Répondre

8

Le package pracma contient également une implémentation. Voir pracma :: rref.

4

Il ne semble pas y en avoir un intégré mais j'ai trouvé cette fonction rref sur la page this.

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

Je n'ai pas suffisamment de rep pour commenter, mais la fonction donnée ci-dessus dans la réponse acceptée est boguée - elle ne gère pas les matrices où la solution RREF a des zéros sur sa diagonale principale. Essayez par exemple

m < matrix (c (1,0,1,0,0,2), byrow = TRUE, nrow = 2) Rref (m)

et notez que la sortie se trouve pas dans RREF .

Je pense que je l'ai travailler, mais vous pouvez vérifier les résultats pour vous-même:

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 
    # Modified by Geoffrey Brent 2014-12-17 to fix a bug 
    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) 
    x.position<-1 
    y.position<-1 
    # change loop: 
    while((x.position<=m) & (y.position<=n)){ 
    col <- A[,x.position] 
    col[1:n < y.position] <- 0 
    # find maximum pivot in current column at or below current row 
    which <- which.max(abs(col)) 
    pivot <- col[which] 
    if (abs(pivot) <= tol) x.position<-x.position+1  # check for 0 pivot 
    else{ 
     if (which > y.position) { A[c(y.position,which),]<-A[c(which,y.position),] } # exchange rows 
     A[y.position,]<-A[y.position,]/pivot # pivot 
     row <-A[y.position,] 
     A <- A - outer(A[,x.position],row) # sweep 
     A[y.position,]<-row # restore current row 
     if (verbose) 
     if (fractions) print(fractions(A)) 
     else print(round(A,round(abs(log(tol,10))))) 
     x.position<-x.position+1 
     y.position<-y.position+1 
    } 
    } 
    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

Cela ne permet pas de répondre à la question. Pour critiquer ou demander des éclaircissements à un auteur, laissez un commentaire en dessous de son message - vous pouvez toujours commenter vos propres messages, et une fois que vous aurez suffisamment de [réputation] (http://stackoverflow.com/help/whats-reputation) vous pourrez être capable de [commenter sur n'importe quel post] (http://stackoverflow.com/help/privileges/comment). – lpapp

+1

Désolé, je suis nouveau ici et peut avoir manqué quelque chose, mais: la "réponse acceptée" fournie par soldier.moth ci-dessus est buggy (comme je l'ai découvert à la dure quand j'ai essayé de l'utiliser moi-même!) Alors je pensais important de signaler cela. Je n'ai pas assez de rep pour commenter la réponse de soldier.moth directement, alors j'ai créé une nouvelle réponse - qu'aurais-je dû faire ici? –

+0

Gagner assez de réputation pour commenter en premier? – lpapp

5

Il y a aussi un récent programme développé pour enseignement algèbre linéaire (matlib) tous deux calcule la forme échelonnée d'une matrice, et montre les étapes utilisées en cours de route.

Exemple du reference docs:

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 
Questions connexes