2014-07-25 10 views
6

Come si determina se una matrice ha un inverso in R?Come verificare se una matrice ha un inverso nel linguaggio R

Quindi c'è di R una funzione che con un ingresso matrice, restituirà qualcosa come:

"TRUE" (questa matrice ha inversa)/"FALSE" (non ha ...).

+2

Hai provato a guardare il determinante (con la funzione 'det')? Potresti creare una funzione che restituisca un valore booleano con questo (ad esempio, 'ifelse (det (M) == 0, FALSE, TRUE)'). – tkmckenzie

+0

@josilber Buona chiamata. Inoltre, sembra che il pacchetto 'Matrix' possa avere metodi più efficienti se si hanno ulteriori informazioni sulla matrice in questione. – tkmckenzie

+0

Grazie mille, ho davvero dimenticato questa proprietà di matrix e del suo iverse :) – Hamsternik

risposta

3

@MAB ha un buon punto. Questo utilizza solve(...) per decidere se la matrice è invertibile.

f <- function(m) class(try(solve(m),silent=T))=="matrix" 
x <- matrix(rep(1,25),nc=5)   # singular 
y <- matrix(1+1e-10*rnorm(25),nc=5) # very nearly singular matrix 
z <- 0.001*diag(1,5)     # non-singular, but very smalll determinant 
f(x) 
# [1] FALSE 
f(y) 
# [1] TRUE 
f(z) 
# [1] TRUE 
8

Utilizzando abs(det(M)) > threshold come un modo per determinare se una matrice è invertibile è una pessima idea. Ecco un esempio: considera la classe delle matrici cI, dove I è la matrice di identità ec è una costante. Se c = 0,01 e I è 10 x 10, allora det (cI) = 10^-20, ma (cI)^- 1 esiste sicuramente ed è semplicemente 100I. Se c è abbastanza piccolo, det() sarà underflow e restituirà 0 anche se la matrice è invertibile. Se si desidera utilizzare i determinanti per verificare l'invertibilità, verificare invece se il modulo del determinante del registro è finito utilizzando determinant().

+0

+1.Questo sembra il migliore approccio attualmente pubblicato - con 'M <- 1e-5 * diag (100)' (chiaramente invertibile), 'det (M)' restituisce 0 (implicando che non è invertibile) ma 'determinante (M) $ modulus' restituisce -1151.293, il che implica che è invertibile. – josliber

+0

Buon punto. Ho cambiato la mia risposta. – jlhoward

1

Oltre alla soluzione proposta dal @josilber nei commenti (cioè abs(det(M)) > 1e-10) si possono utilizzare anche solve(M) %*% M per una matrice quadrata o ginv nel pacchetto MASSA darà l'inversa generalizzata di una matrice.

Per ottenere TRUE o FALSE si può semplicemente combinare uno qualsiasi di questi metodi con tryCatch e any come questo:

out <- tryCatch(solve(X) %*% X, error = function(e) e)

any(class(out) == "error")

6

Si può provare a utilizzare is.singular.matrix funzione dal matrixcalc pacchetto.

Per installare pacchetto:

install.packages("matrixcalc") 

per caricarlo:

library(matrixcalc) 

Per creare una matrice:

mymatrix<-matrix(rnorm(4),2,2) 

per controllo:

is.singular.matrix(mymatrix) 

Se la matrice è invertibile restituisce FALSE e se la matrice è singlar/non invertibile restituisce TRUE.