2012-07-24 9 views
5

Sto cercando di comprendere gli array tridimensionali. Capisco che sono array di array bidimensionali, ma il libro che sto leggendo ha detto qualcosa che mi confonde.Informazioni sulle matrici tridimensionali

In un esercizio per il libro che sto leggendo, mi chiede di creare un array tridimensionale per un'immagine a colori. Dà un piccolo esempio dicendo questo:

Se decidiamo di scegliere una matrice tridimensionale, ecco come la matrice potrebbe essere dichiarato:

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

Tuttavia, non sarebbe più efficace come questo?

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

Dove 3 è i valori RGB, 0 essendo rosso, 1 essendo verde, e 2 essendo blu. Con quest'ultimo, ogni array bidimensionale memorizza il valore del colore della riga e della colonna, giusto? Voglio solo assicurarmi di capire come utilizzare in modo efficace un array tridimensionale.

Qualsiasi aiuto sarà molto apprezzato, grazie.

+0

È lo stesso. Puoi utilizzare le dimensioni a tuo piacimento, a condizione che siano coerenti. Non ci sono prestazioni o differenze di memoria. – Bohemian

+0

Perché credi che l'ordine faccia la differenza? – Luxspes

+0

@Luxspes Non ci credo. Lo so. – Bohemian

risposta

1

ordine non importa, e infatti la prima forma è più leggibile:

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

Bug nel codice sopra. Vuoi indici 0,1,2. Non 1,2,3. – Gazzonyx

+0

@Gazzonyx corretto. Fisso. – Strelok

1

L'ordine non dovrebbe avere importanza, quindi uno non è più efficace dell'altro. L'unica cosa che conta è che qualunque accesso a colorImage sappia quale dimensione è usata per cosa. Bit più contesto su array multidimensionali here.

0

non sono sicuro se è una buona idea di mettere tutto in un array di 3dimensional int.

Il tuo primo errore è il dataytpe: RGB è un int. Ma R è un byte, G è un byte, B è un byte troppo .. (Color.getXXX() trasporta un int, non so perché, perché la sua un byte 0-255)

devi un int perché si vuole affrontare più di 256 colonne & righe. (Va bene). Ma penso che sia molto meglio incapsulare le informazioni sul colore in un oggetto extra. Forse un datastructure privata come

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; 
     } 
    } 

e mettere questo in un array 2dim di MyColor[numRows][numColumns]

Ma se si effettua la classe pubblica MyColor per tutta la vostra applicazione - vorrei cambiare il design della classe per essere più sicuro .

Problemi correlati