2010-02-04 4 views
28

si pienso en el plano de coordenadas x, y x, y es la notación común para un par ordenado, pero si uso una matriz de dos dígitos tengo myArray [row] [col] y row es y y col es el x. ¿Eso está al revés o solo lo estoy pensando mal? Estaba pensando que se vería como myArray [x] [y], pero eso es incorrecto si quiero filas y columnas reales (como en un tablero de juego). ¿No sería myArray [y] [x] imitar de verdad una columna de columnas? ?¿Están los atributos x, y y fila, col hacia atrás de una matriz bidimensional?

+0

Me encontré haciendo la misma pregunta a mis padres. Es bueno saber que no hay un estándar. –

Respuesta

24

Lo tiene todo, y se siente un poco al revés. el número de fila es una coordenada y, y el número de columna es una coordenada x, y sin embargo usualmente escribimos fila, col pero también usualmente escribimos x, y.

Si desea escribir su matriz como [y] [x] depende o [x] [y] depende principalmente de cuánto le importa realmente el diseño en la memoria (y si lo hace, qué idioma usa) . y si desea escribir funciones/métodos que puedan operar en filas o columnas de forma aislada.

Si está escribiendo código C/C++, las matrices se almacenan en Row Major Order, lo que significa que una sola fila de datos se puede tratar como una matriz de 1 dimensión. Pero una sola columna de datos no puede. Si no recuerdo mal, VB utiliza el orden principal de la columna, por lo que los idiomas varían. Me sorprendería que C# no sea también el orden principal de la fila, pero no lo sé.

0

En realidad, depende de usted. No hay derecho a pensar en tu pregunta. Por ejemplo, normalmente pienso en una matriz de una dimensión como una fila de celda. Entonces, en mi opinión, es array [col] [row]. Pero realmente depende de usted ...

+1

Si estás pensando en las consecuencias de caché, * hay * una forma correcta de verlo ... –

+0

@mmeyers: En realidad, el efecto es que guardas el tablero de juego de lado. Es común almacenar imágenes de esta manera. – Joel

+1

Creo que la pregunta es sin ningún contexto dado ... Por supuesto en diferentes contextos, hay diferentes lógicas. – anthares

0

Apuesto a que hay muchas opiniones diferentes sobre esta. En pocas palabras, en realidad no importa mientras seas consecuente. Si tiene otras bibliotecas o similares que van a utilizar los mismos datos, podría tener sentido hacer lo que sea necesario para una integración más fácil.

Si esto es estrictamente en su propio código, haga lo que le parezca cómodo. Mi preferencia personal sería usar myArray [y] [x]. Si son grandes, puede haber beneficios de rendimiento de mantener los artículos a los que va a acceder mucho al mismo tiempo. Pero no me preocuparía hasta más tarde en una etapa muy avanzada.

0

Bueno, realmente no, si piensas en una fila como elementos en el eje x y luego una matriz 2d es un grupo de elementos de fila en el eje y, entonces es normal usar y para operar en una fila, como ya sabes la x (para esa fila particular x es siempre la misma, es y que está cambiando con sus índices) y luego usa x para operar en los elementos de múltiples filas (las filas están apiladas verticalmente, cada una en un valor y particular)

1

No importa cómo almacene sus datos en la matriz ([x] [y] o [y] [x]). Lo que sí importa es que siempre recorras el conjunto de forma contigua. Una matriz bidimensional de Java es esencialmente una matriz unidimensional que almacena la segunda matriz (por ejemplo, en el caso de [y] [x] tiene una matriz larga de [y] en la que cada y contiene las matrices [x] correspondientes para esa línea de y).

Para ejecutar de manera eficiente toda la matriz, es importante acceder a los datos de manera que no tenga que realizar búsquedas continuamente en esa matriz, saltando de una matriz-y-de-xarrays a otra y- array-of-xarrays. Lo que quiere hacer es acceder a un elemento y acceder a todas las x allí antes de pasar al siguiente elemento y.

Por lo tanto, en una situación de matriz [y] [x]. siempre tienen la primera variable en el bucle exterior y el segundo en el bucle interno:

for (int ys = 0; ys < Array[y].length; ys++) 
    for (int xs = 0; xs < Array[y][x].length; xs++) 
    { 
     do your stuff here 
    } 

Y, por supuesto preasignar ambos Array.lengths fuera del circuito para evitar tener que obtener los valores de cada ciclo.

Cuestiones relacionadas