Der empfohlene Weg, um den Rang einer Matrix in R zu berechnen scheint qr
zu sein:Schnellster Weg zur Berechnung des Rangs der 2 * 2 Matrix?
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
Ich konnte die Effizienz verbessern, indem diese Funktion für meinen speziellen Fall ändern:
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
R Verwenden Kann der Rang einer 2 * 2-Matrix noch schneller berechnet werden?
'Vermögen (98)' - gut, mal 4 nehme ich an. – BenBarnes
@BenBarnes: Ich habe die Zeit verwendet, die ich gespeichert habe, um Lolcats auf den Interwebs zu betrachten. –
Ich optimiere die Leistung einer Funktion, die ich in einer Simulation einige Millionen Mal ausführen muss. 'qr' wird innerhalb einer While-Schleife in dieser Funktion verwendet. Also, am Ende diese Mikrosekunden einige bis zu Stunden. – Roland