vectores una traza studio notacion matriz matrices eliminar data concatenar comandos cientifica r vector matrix

studio - traza de una matriz en r



Matrices grandes en R: vectores largos aún no soportados (2)

Estoy ejecutando 64 bit R 3.1 en un entorno Ubuntu de 64 bits con 400 GB de RAM, y me encuentro con una extraña limitación al tratar con grandes matrices.

Tengo una matriz numérica llamada A, que es de 4000 filas por 950,000 columnas. Cuando intento acceder a cualquier elemento en él, recibo el siguiente error:

Error: long vectors not supported yet: subset.c:733

Aunque mi matriz se leyó en el scan , puede replicar con el siguiente código

test <- matrix(1,4000,900000) #no error test[1,1] #error

Mi búsqueda en Google revela que este era un mensaje de error común antes de R 3.0, donde un vector de tamaño 2 ^ 31-1 era el límite. Sin embargo, este no es el caso, dado mi entorno.

¿No debería utilizar el tipo de matriz nativa para este tipo de matriz?


Una matriz es solo un vector atómico con un atributo de dimensión que permite a R acceder a ella como una matriz. Su matriz es un vector de longitud 4000*9000000 que tiene 3.6e+10 elementos (el valor entero más grande es aproximadamente 2.147e+9 ). Se admite el subconjunto de un vector largo para los vectores atómicos (es decir, para acceder a elementos más allá del límite 2.147e+9 ). Solo trata tu matriz como un vector largo.

Si recordamos que, de forma predeterminada, R rellena las matrices por columnas, si queremos recuperarlo, digamos el valor en la test[ 2701 , 850000 ] a través de:

i <- ( 2701 - 1 ) * 850000 + 2701 test[i] #[1] 1

Tenga en cuenta que esto realmente es un subconjunto de vectores largos porque:

2701L * 850000L #[1] NA #Warning message: #In 2701L * 850000L : NAs produced by integer overflow


Una solución alternativa y rápida sería primero obtener la fila y luego la columna (ahora el elemento i''th del vector resultante) de la matriz. Por ejemplo ...

test <- matrix(1,4000,900000) #no error test[1,1] #error test[1, ][1] # no error

Por supuesto, esto produce cierta sobrecarga, ya que toda la fila se copia / accede primero, pero es más fácil de leer. También funciona para primero extraer la columna y luego la fila.