2010-06-27 17 views

उत्तर

8

प्रक्षे पैकेज में एक कार्यान्वयन भी शामिल है। Pracma :: rref देखें।

4

ऐसा नहीं लगता है कि एक निर्मित है लेकिन मुझे 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

मेरे पास टिप्पणी करने के लिए पर्याप्त प्रतिनिधि नहीं है, लेकिन स्वीकृत उत्तर में ऊपर दिया गया कार्य छोटी है - यह मैट्रिस को संभाल नहीं करता है जहां आरआरईएफ समाधान के मुख्य विकर्ण पर शून्य है। उदाहरण का प्रयास करें

मीटर < मैट्रिक्स (ग (1,0,1,0,0,2), byrow = सही, Nrow = 2) rref (एम)

और ध्यान दें कि उत्पादन RREF में नहीं है ।

मुझे लगता है कि मैं यह काम कर रहा है, लेकिन आप अपने आप के लिए आउटपुट जाँच करना चाहते हो सकता है:

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

इस प्रश्न का उत्तर प्रदान नहीं करता है। किसी लेखक से स्पष्टीकरण की आलोचना करने या अनुरोध करने के लिए, अपनी पोस्ट के नीचे एक टिप्पणी छोड़ दें - आप हमेशा अपनी पोस्ट पर टिप्पणी कर सकते हैं, और एक बार आपके पास पर्याप्त [प्रतिष्ठा] (http://stackoverflow.com/help/whats-reputation) हो [किसी भी पोस्ट पर टिप्पणी करने में सक्षम] [http://stackoverflow.com/help/privileges/comment)। – lpapp

+1

क्षमा करें, मैं यहां नया हूं और कुछ याद कर सकता हूं, लेकिन: उपरोक्त सैनिक द्वारा प्रदान किया गया "स्वीकृत उत्तर" बग्गी है (जैसा कि मैंने इसे स्वयं उपयोग करने का प्रयास करने के दौरान कठिन तरीका खोजा!) तो मैंने सोचा कि यह था इसे ध्वजांकित करने के लिए महत्वपूर्ण है। मेरे पास सैनिक। मॉथ के जवाब पर सीधे टिप्पणी करने के लिए पर्याप्त प्रतिनिधि नहीं है, इसलिए मैंने एक नया उत्तर बनाया - मुझे यहां क्या करना चाहिए? –

+0

पहले टिप्पणी करने के लिए पर्याप्त प्रतिष्ठा हासिल करें? – lpapp

5

वहाँ भी हाल ही में एक शिक्षण रेखीय बीजगणित (matlib) के लिए विकसित पैकेज जो दोनों सोपानक प्रपत्र की गणना करता है एक मैट्रिक्स का, और रास्ते में इस्तेमाल किए गए कदम दिखाता है। 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