2010-06-27 26 views

Trả lời

8

Gói pracma cũng chứa thực hiện. Xem pracma :: rref.

4

Không giống như có tích hợp sẵn nhưng tôi đã tìm thấy chức năng rref này trên this trang.

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

Tôi không có đủ đại diện để nhận xét, nhưng hàm được đưa ra ở trên trong câu trả lời được chấp nhận là lỗi - nó không xử lý ma trận trong đó giải pháp RREF có số 0 trên đường chéo chính. Hãy thử ví dụ:

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

và lưu ý rằng đầu ra không có trong RREF .

Tôi nghĩ rằng tôi có nó làm việc, nhưng bạn có thể muốn kiểm tra kết quả đầu ra cho chính mình:

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

này không cung cấp một câu trả lời cho câu hỏi. Để phê bình hoặc yêu cầu làm rõ từ tác giả, để lại nhận xét bên dưới bài đăng của họ - bạn luôn có thể nhận xét về bài đăng của riêng bạn và sau khi bạn có đủ [danh tiếng] (http://stackoverflow.com/help/whats-reputation), bạn sẽ có thể [nhận xét về bài đăng bất kỳ] (http://stackoverflow.com/help/privileges/comment). – lpapp

+1

Xin lỗi, tôi mới ở đây và có thể đã bỏ lỡ điều gì đó, nhưng: "câu trả lời được chấp nhận" được cung cấp bởi soldier.moth ở trên là lỗi (vì tôi đã phát hiện ra một cách khó khăn khi tôi cố gắng sử dụng nó!) Vì vậy tôi nghĩ rằng đó là quan trọng để gắn cờ đó. Tôi không có đủ đại diện để bình luận trực tiếp câu trả lời của soldier.moth, vì vậy tôi đã tạo ra một câu trả lời mới - tôi nên làm gì ở đây? –

+0

Có đủ danh tiếng để nhận xét trước không? – lpapp

5

Ngoài ra còn có một gói phần mềm gần đây phát triển cho giảng dạy Linear Algebra (matlib) mà cả hai tính hình thức bậc thang của một ma trận và hiển thị các bước được sử dụng trên đường đi.

Ví dụ từ 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 
Các vấn đề liên quan