Pregunta

Después de aprender acerca de la para trabajar con matrices dispersas en I , quiero usar el paquete Matrix para crear una matriz dispersa partir de la siguiente trama de datos y han ser NA todos los demás elementos.

     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

Sé que puedo crear una matriz dispersa con lo siguiente, el acceso a los elementos como de costumbre:

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

pero si quiero tener el valor por defecto para ser NA, He intentado lo siguiente:

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

y consiguió este error

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

No sólo eso, me parece que uno tarda mucho más en el acceso a los elementos.

> 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 

¿Cómo debería ser la creación de esta matriz? ¿Por qué es una matriz de modo mucho más lento para trabajar con?

Este es el fragmento de código para los datos anteriores:

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")
¿Fue útil?

Solución

Sí, la respuesta de Thierry es definitivamente cierto que puedo decir como co-autor del paquete de 'Matrix' ...

Para su otra pregunta: ¿Por qué está accediendo a "M" más lento que en "Y"? La respuesta principal es que "M" es mucho, mucho más escasa que la "Y" por lo tanto, mucho más pequeño y - dependiendo de los tamaños envolved y la memoria RAM de su plataforma - el tiempo de acceso es más rápido para los objetos mucho más pequeños, en particular para la indexación en ellas .

Otros consejos

¿Por qué quiere los valores por defecto de NA? Por lo que yo sé matrices sólo son escasas si tienen cero células. Como NA es un valor que no sea cero, se pierde todos los beneficios de la matriz dispersa. Una matriz clásica es aún más eficiente si la matriz tiene casi ningún cero. Una matriz clásico es como un vector que se corta según las dimensiones. Por lo que sólo tiene que almacenar el vector de datos y de las dimensiones. sólo Las tiendas de matriz dispersa los valores distintos de cero, pero también almacena allí ubicación. Esta es una ventaja si y sólo si tiene suficientes valores cero.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top