2011-12-15 12 views
5

Estoy tratando de dividir un archivo binario (solo los elementos son 0 y 1) matriz 3D asignada dinámicamente en matrices 3D separadas y más pequeñas. En la siguiente figura hace que sea un poco más claro de entender:División recursiva de matriz binaria 3D para crear un flujo de bits para cada entrada que equivale a 1

http://img521.imageshack.us/img521/4296/splittingsteps.png

Es una matriz 3D escasa de 10.000 elementos. Para cada 1 que es un elemento de mi matriz, quiero crear un flujo de bits único. Los subdominios obtenidos me devuelven un número de 1s que están en el bloque correspondiente. Ese número se convierte luego en binario y se agrega al flujo de bits.

Dado que esta operación de división es la misma cada vez, primera división en la dirección i, a continuación, en la dirección j y luego en los k de dirección (3 niveles) Quiero hacer esto de forma recursiva. Además, dado que estoy trabajando en ANSI C, el trabajo no recursivo resultaría en una gran cantidad de código duplicado.

La división debe terminar en los subdominios que están vacíos, por lo que solo contiene 0 (número_x = 0) o cuando el tamaño es [0..1] x [0..1] x [0]. Estos subdominios son manejados por un código de Huffman.

Más específicamente, es una matriz 3D con dimensiones van desde:

I = [0 .. 511] x [0 .. 511] x [0 .. 31] 

Mi código actual para los primeros tres niveles se puede encontrar en http://codepad.org/zGbAhKrC

de Split nivel # 1 resultados en dos matrices 3D de dimensiones :

I_w = [0 .. 255] x [0 .. 511] x [0 .. 31] 
I_e = [256 .. 511] x [0 .. 511] x [0 .. 31] 

number_w = 6505 y number_e = 3495 representan el número de 1 en ambas partes.

de dos niveles # 2 resultados en cuatro matrices en 3D de dimensiones:

I_sw = [0 .. 255] x [0 .. 255] x [0 .. 31] 
I_nw = [0 .. 255] x [256 .. 511] x [0 .. 31] 
I_se = [256 .. 511] x [0 .. 255] x [0 .. 31] 
I_ne = [256 .. 511] x [256 .. 511] x [0 .. 31] 

number_sw = 2141 y number_nw = 4364 representan el número de 1 de en el bloque correspondiente. number_se = 1745 y number_ne = 1750 representan el número de 1 en el bloque correspondiente.

de dos niveles # 3 resultados en ocho arrays 3D de dimensiones:

I_swm = [0 .. 255] x [0 .. 255] x [0 .. 15] 
I_nwm = [0 .. 255] x [256 .. 511] x [0 .. 15] 
I_swp = [0 .. 255] x [0 .. 255] x [16 .. 31] 
I_nwp = [0 .. 255] x [256 .. 511] x [16 .. 31] 
I_sem = [256 .. 511] x [0 .. 255] x [0 .. 15] 
I_nem = [256 .. 511] x [256 .. 511] x [0 .. 15] 
I_sep = [256 .. 511] x [0 .. 255] x [16 .. 31] 
I_nep = [256 .. 511] x [256 .. 511] x [16 .. 31] 

number_swm = 2141 y number_swp = 0 representan el número de 1 s en el bloque correspondiente. number_nwm = 4364 y number_nwp = 0 representan el número de 1 s en el bloque correspondiente. number_sem = 1745 y number_sep = 0 representan el número de 1 s en el bloque correspondiente. number_nem = 1750 y number_nep = 0 representan el número de 1 s en el bloque correspondiente.

¿Alguien que pueda ayudarme con algún pseudo código basado en mi código actual?

¡Gracias de antemano!

+0

+1 simplemente por el inmenso esfuerzo en presentar esto de manera precisa (incluidos los gráficos) y las más de 950 líneas de código incluso antes de pasar a SO. Me dejó alucinado al intentarlo brevemente, así que solo deseo desafortunadamente. – gnometorule

Respuesta

1

Eche un vistazo a kd-tree examples in wikipedia.

+0

Zhenya, lo he comprobado y podría ser una solución para mi problema, pero actualmente estoy tratando de implementar un método que ha sido ampliamente utilizado y ha demostrado su rendimiento en varios artículos científicos. Quiero implementar ese método primero, antes de buscar otras soluciones. De ahí mi pregunta detallada sobre el enfoque recursivo de mi código ... Manejar mi problema como kd-tree sería una posible extensión del algoritmo actual cuando voy a trabajar en la parte de optimización, así que gracias por la respuesta ! – user1098973

Cuestiones relacionadas