La forma recomendada para calcular el rango de una matriz en I parece ser qr
:¿La forma más rápida para calcular el rango de la matriz 2 * 2?
X <- matrix(c(1, 2, 3, 4), ncol = 2, byrow=T)
Y <- matrix(c(1.0, 1, 1, 1), ncol = 2, byrow=T)
qr(X)$rank
[1] 2
qr(Y)$rank
[1] 1
pude mejorar la eficiencia mediante la modificación de esta función para mi caso concreto:
qr2 <- function (x, tol = 1e-07) {
if (!is.double(x))
storage.mode(x) <- "double"
p <- as.integer(2)
n <- as.integer(2)
res <- .Fortran("dqrdc2", qr = x, n, n, p, as.double(tol),
rank = integer(1L), qraux = double(p), pivot = as.integer(1L:p),
double(2 * p), PACKAGE = "base")[c(1, 6, 7, 8)]
class(res) <- "qr"
res}
qr2(X)$rank
[1] 2
qr2(Y)$rank
[1] 1
library(microbenchmark)
microbenchmark(qr(X)$rank,qr2(X)$rank,times=1000)
Unit: microseconds
expr min lq median uq max
1 qr(X)$rank 41.577 44.041 45.580 46.812 1302.091
2 qr2(X)$rank 19.403 21.251 23.099 24.331 80.997
con R , ¿es posible calcular el rango de una matriz 2 * 2 aún más rápido?
'fortuna (98)' - bueno, multiplicado por 4, supongo. – BenBarnes
@BenBarnes: utilicé el tiempo que guardé para ver los lolcats en las interwebs. –
Estoy optimizando el rendimiento de una función que necesito ejecutar unos pocos millones de veces en una simulación. 'qr' se usa dentro de un ciclo while en esta función. Entonces, al final esos microsegundos algunos hasta horas. – Roland