2009-08-13 10 views
11

Dopo aver appreso lo options for working with sparse matrices in R, voglio utilizzare il pacchetto Matrix per creare una matrice sparsa dal seguente frame di dati e avere tutti gli altri elementi da NA.Creazione (e accesso) di una matrice sparsa con voci predefinite NA

 s r d 
1 1089 3772 1 
2 1109 190 1 
3 1109 2460 1 
4 1109 3071 2 
5 1109 3618 1 
6 1109 38 7 

so di poter creare una matrice sparsa con la seguente, l'accesso a elementi come al solito:

> library(Matrix) 
> Y <- sparseMatrix(s,r,x=d) 
> Y[1089,3772] 
[1] 1 
> Y[1,1] 
[1] 0 

ma se voglio avere il valore di default di essere NA, ho provato la seguente:

M <- Matrix(NA,max(s),max(r),sparse=TRUE) 
    for (i in 1:nrow(X)) 
    M[s[i],r[i]] <- d[i] 

e ottenuto questo errore

Error in checkSlotAssignment(object, name, value) : 
    assignment of an object of class "numeric" is not valid for slot "x" in an object of class "lgCMatrix"; is(value, "logical") is not TRUE 

Non solo, trovo che ci vuole molto più tempo per accedere agli elementi.

> system.time(Y[3,3]) 
    user system elapsed 
    0.000 0.000 0.003 
> system.time(M[3,3]) 
    user system elapsed 
    0.660 0.032 0.995 

Come dovrei creare questa matrice? Perché una matrice è tanto più lenta con cui lavorare?

Ecco il frammento di codice per i dati di cui sopra:

X <- structure(list(s = c(1089, 1109, 1109, 1109, 1109, 1109), r = c(3772, 
190, 2460, 3071, 3618, 38), d = c(1, 1, 1, 2, 1, 7)), .Names = c("s", 
"r", "d"), row.names = c(NA, 6L), class = "data.frame") 

risposta

12

Sì, la risposta di Thierry è sicuramente vero che posso dire come co-autore del pacchetto di 'Matrix' ...

Per l'altra domanda: Perché l'accesso a "M" più lento di "Y"? La risposta principale è che "M" è molto più rada di "Y" quindi molto più piccolo e - a seconda delle dimensioni coinvolte e della RAM della piattaforma - il tempo di accesso è più veloce per oggetti molto più piccoli, in particolare per l'indicizzazione in loro.

+0

Grazie! Non vedo l'ora di vedere più delle tue risposte su StackOverflow. Cercherò di recuperare alcune delle domande che ho avuto durante l'utilizzo di Matrix ... –

+10

È spiacevole che tutte le celle diverse da zero vengano sempre memorizzate. Sarebbe bello poter specificare un valore predefinito diverso da zero per una sparseMatrix. – Quantum7

+1

Sto pensando c'è un valore predefinito per sparseMatrix? – hs3180

15

Perché vuoi predefiniti valori NA? Per quanto ne so, le matrici sono rare solo se hanno celle zero. Dato che NA è un valore diverso da zero, perdi tutti i benefici dalla matrice sparsa. Una matrice classica è ancora più efficiente se la matrice ha pochissimi zeri. Una matrice classica è come un vettore che verrà tagliato in base alle dimensioni. Quindi deve solo memorizzare il vettore di dati e le dimensioni. La matrice sparsa memorizza solo i valori diversi da zero, ma memorizza anche la posizione. Questo è un vantaggio se e solo se hai abbastanza valori zero.

+0

Sì, suppongo sia vero. –

+1

Ma se il mio valore "predefinito" è 1 allora sicuramente hai solo 1 bit in più di informazioni da memorizzare, ovvero che il valore predefinito è 1 invece di assumere 0. I valori "diverso da predefinito" sono ancora memorizzati come fai nello 0 esempio ma la premessa è molto più generale. – adunaic

+1

"Questo è un vantaggio se e solo se hai abbastanza valori zero.": Semplicemente non vero. Sostituisci ogni occorrenza di "zero" nel tuo commento con "uno" o qualsiasi altro numero e vedrai che la tua frase è ancora valida. Il fatto che lo zero sia usato è solo per convenzione e ci sono molte applicazioni dove ha senso avere valori predefiniti diversi da zero. In termini di risparmio di memoria, ha senso impostare il valore predefinito sul numero che si verifica più spesso nel set di dati. – derwiwie

Problemi correlati