2012-07-24 28 views
5

Estoy tratando de abarcar las matrices tridimensionales. Entiendo que son matrices de arreglos bidimensionales, pero el libro que estoy leyendo decía algo que me confunde.Descripción de matrices tridimensionales

En un ejercicio para el libro que estoy leyendo, me pide que haga una matriz tridimensional para una imagen a todo color. Se da un pequeño ejemplo de decir esto:

Si decidimos optar por una matriz tridimensional, así es como la matriz podría ser declarada:

int[][][] colorImage = new int[numRows][numColumns][3]; 

Sin embargo, ¿no sería más eficaz como este?

int[][][] colorImage = new int[3][numRows][numColumns]; 

Donde 3 son los valores de rgb, 0 es rojo, 1 es verde y 2 es azul. Con este último, cada matriz bidimensional estaría almacenando el valor de color de la fila y la columna, ¿verdad? Solo quiero asegurarme de que entiendo cómo usar efectivamente una matriz tridimensional.

Cualquier ayuda será muy apreciada, gracias.

+0

Es lo mismo. Puede usar las dimensiones como lo desee, siempre que sea consistente. No hay rendimiento o diferencia de memoria. – Bohemian

+0

¿Por qué crees que la orden hace la diferencia? – Luxspes

+0

@Luxspes No lo creo. Lo sé. – Bohemian

Respuesta

1

orden no es importante, y de hecho la primera forma es más fácil de leer:

final const int RED = 0; 
final const int GREEN = 1; 
final const int BLUE = 2; 

int[][][] colorImage = new int[numRows][numColumns][3]; 
//... 

int x = getSomeX(); 
int y = getSomeY(); 

int redComponent = colorImage[x][y][RED]; 
int greenComponent = colorImage[x][y][GREEN]; 
int blueComponent = colorImage[x][y][BLUE]; 
+1

Error en el código de arriba. Quieres índices 0,1,2. No 1,2,3. – Gazzonyx

+0

@Gazzonyx correcto. Fijo. – Strelok

1

El orden no debería importar, por lo que uno no es más eficaz que el otro. Lo único que importa es que cualquier acceso a colorImage sabe qué dimensión se usa para qué. Un poco más de contexto en matrices multidimensionales here.

0

No estoy seguro de si es una buena idea poner todo en una matriz de 3dimensional int.

Su primer error es el dataytpe: RGB es un int. Pero R es un byte, G es un byte, B es un byte también .. (Color.getXXX() entrega un int, no sé por qué, porque es un byte 0-255)

Necesitas un int porque quiere abordar más de 256 cols & filas. (Esta bien). Pero creo que es mucho mejor encapsular la información de color en un objeto adicional. Tal vez una estructura de datos privados, como

class MyColor { 

     public byte r, g, b; //public for efficient access; 
     public int color;  //public for efficient access; 

     public MyColor(final int rgb) { 
      this(new Color(rgb)); 
     } 

     public MyColor(final Color c) { 
      this((byte) c.getRed(), (byte) c.getGreen(), (byte) c.getBlue(), c.getRGB()); 
     } 

     public MyColor(final byte red, final byte green, final byte blue, final int c) { 
      this.r = red; 
      this.g = green; 
      this.b = blue; 
      this.color = c; 
     } 
    } 

y poner esto en una matriz 2dim de MyColor[numRows][numColumns]

Pero si usted hace la clase pública MyColor a toda su aplicación - que cambiaría el diseño de la clase para ser más seguro .