https://github.com/cran/pracma
Tip revision: 26e049d70b4a1c237987e260cba68f6a9413736c authored by Hans W. Borchers on 09 April 2019, 04:10:07 UTC
version 2.2.5
version 2.2.5
Tip revision: 26e049d
rref.R
##
## r r e f . R Reduced Row Echelon Form
##
rref <- function(A) {
stopifnot(is.numeric(A))
if (!is.matrix(A))
stop("Input parameter 'A' must be a matrix.")
nr <- nrow(A); nc <- ncol(A)
tol <- eps() * max(nr, nc) * max(abs(A))
r <- 1
for (i in 1:nc) {
pivot <- which.max(abs(A[r:nr, i]))
pivot <- r + pivot - 1
m <- abs(A[pivot, i])
if (m <= tol) {
A[r:nr, i] <- 0 # zeros(nr-r+1, 1)
} else {
A[c(pivot, r), i:nc] <- A[c(r, pivot), i:nc]
A[r, i:nc] <- A[r, i:nc] / A[r, i]
if (r == 1) {
ridx <- c((r+1):nr)
} else if (r == nr) {
ridx <- c(1:(r-1))
} else {
ridx <- c(1:(r-1), (r+1):nr)
}
A[ridx, i:nc] <- A[ridx, i:nc] -
A[ridx, i, drop=FALSE] %*% A[r, i:nc, drop=FALSE]
if (r == nr) break
r <- r+1
}
}
A[abs(A) < tol] <- 0
return(A)
}