2010-08-25 10 views
5

que tiene una gran variedad de flotar datos de la imagen punto:inexplicable Mathematica7 DumpSave [] problema

In[25]:= Dimensions[daylightImgd] 
Out[25]= {18, 2002, 2989} 

In[26]:= daylightImgd[[1, 1]][[1 ;; 10]] 

Out[26]= {0.0122293, 0.0104803, 0.0103955, 0.0115533, 0.0118063, \ 
0.0120648, 0.0122957, 0.011398, 0.0117426, 0.0119997} 

puedo guardar todo este conjunto de imágenes de disco utilizando con éxito DumpSave a la:

DumpSave["thisWorks.mx", daylightImgd] 

El vertido de este gigante (archivo de 861 megas) lleva menos de 10 segundos. Si reduzco la resolución de estas imágenes, a la:

downsample[image_, f_] := Module[{w, h}, h = Dimensions[image][[1]]; 
    w = Dimensions[image][[2]]; 
    Table[image[[i, j]], {i, 1, h, f}, {j, 1, w, f}]] 

In[26]:= daylightImgdDown = downsample[#, 4] & /@ daylightImgd; 
In[27]:= Dimensions[daylightImgdDown] 
Out[27]= {18, 500, 748} 

In[28]:= daylightImgdDown[[1, 1]][[1 ;; 10]] 

Out[28]= {0.0122293, 0.0118063, 0.0117426, 0.0119349, 0.0109443, \ 
0.0121632, 0.0121304, 0.00681408, 0.0101728, 0.00603242} 

De repente, ya no puedo guardar más; cuelga la cosa, y hace girar para siempre - o por lo menos durante varios minutos, hasta que lo mato, y maxes CPU:

In[31]:= DumpSave["broken.mx", daylightImgdDown]; (* Hangs forever *) 

Por lo que yo puedo determinar, todo es como debe ser: las imágenes tienen el downsampled dimensiones correctas; puedes trazarlos a través de ArrayPlot y todo se ve genial; el listado manual de la primera fila se ve bien. Todo, en resumen, parece lo mismo que con las imágenes no muestreadas, pero en el conjunto de datos mucho más pequeño DumpSave se cuelga.

¿Ayuda?

ACTUALIZACIÓN: Comentarios sobre la respuesta de Michael

Wow. Gracias por la respuesta extremadamente completa, que no solo respondió mi pregunta sino que también me enseñó un montón de material periférico.

Para su referencia, el problema del empaquetado fue un poco más complicado que simplemente reemplazar mi muestra descendente [] con una de las suyas. Dado que la matriz que estaba tratando de volcar es una matriz de 18 imágenes, una matriz en 3D, en otras palabras, y dado que estoy aplicando la disminución de muestreo a través del operador de Mapa, el empaquetado de la matriz 3D es falso (según PackedArrayQ) utilizando cualquiera de sus reescrituras de resolución baja.

Sin embargo, si tomo la salida de estas aplicaciones, y luego empacar la matriz 3D resultante, entonces toda la matriz 3d está lleno, y sólo entonces puedo DumpSave ella. Extrañamente, sin embargo, este proceso final de empaque, aunque es necesario para un DumpSave exitoso, apenas parece alterar el tamaño, según lo informado por ByteCount. Tal vez esto es más fácil en el código:

In[42]:= downsample3[image_, f_] := 
Module[{w, h}, h = Dimensions[image][[1]]; 
    w = Dimensions[image][[2]]; 
    Developer`[email protected][image[[i, j]], {i, 1, h, f}, {j, 1, w, f}]] 

In[43]:= daylightImgdDown = downsample3[#, downsampleSize] & /@ daylightImgd; 
In[44]:= ByteCount[daylightImgdDown] 
Out[44]= 53966192 

In[45]:= Developer`PackedArrayQ[daylightImgdDown] 
Out[45]= False 

In[46]:= dd = Developer`ToPackedArray[daylightImgdDown]; 
In[47]:= Developer`PackedArrayQ[dd] 
Out[47]= True 

In[48]:= ByteCount[dd] 
Out[48]= 53963844 

In[49]:= DumpSave["daylightImgdDown.mx", dd]; (* works now! *) 

Nuevamente, muchas gracias.

Respuesta

6

Sin los datos reales, una suposición educada es que la razón por la que la gran matriz DumpSave es rápida es porque se trata de una llamada "matriz empaquetada", es decir, una matriz de números de punto flotante que tiene una representación muy eficiente en Mathematica. Su función downsample (debido al uso de Table) no devuelve una matriz empaquetada, que es mucho más grande en la memoria, potencialmente más grande que incluso la matriz original después de ser muestreado 4X. ByteCount podría ser ilustrativo allí.

Puede verificar la matriz empaquetada con PackedArrayQ e intentar empaquetar una matriz desempaquetada con ToPackedArray, ambas encontradas en el contexto Developer.

Hay dos soluciones, si mi conjetura es correcta.Uno es utilizar ToPackedArray como se muestra:

downsample[image_, f_] := Module[{w, h}, h = Dimensions[image][[1]]; 
    w = Dimensions[image][[2]]; 
    Developer`[email protected][image[[i, j]], {i, 1, h, f}, {j, 1, w, f}]] 

Aún mejor es simplemente para reemplazar el uso de Table con Take, que debe devolver un conjunto empaquetado en este caso, y como una ventaja añadida ser mucho más rápido que el uso de Table .

downsample[image_, f_] := Take[image, {1,-1,f}, {1,-1,f}] 

Usted también puede estar interesado en todos los nuevos image processing functionality en Mathematica 7.

Espero que ayude!

+0

¡Guau, buena respuesta! Interesado en saber si esto resuelve el problema del que pregunta. – dreeves

Cuestiones relacionadas