2012-06-24 18 views
6

Tuve una discusión independiente del idioma con alguien en el chat de C++ y he said que las matrices de matrices y matrices multidimensionales son dos cosas.¿Cuál es la diferencia entre matrices de matrices y matrices multidimensionales?

Pero por lo que he aprendido, una matriz multidimensional no es más que una matriz de otras matrices que todas tienen el mismo tamaño. En particular, él está diciendo

Bueno, tipo de están en C, donde se simula múltiples dimensiones con matrices anidadas pero eso es sólo porque C en realidad no admite múltiples matrices de dimensión

Puede alguien por favor, explique cuál es la definición canónica de "ciencia de la computación" de "matrices de múltiples dimensiones" y por qué C (o la definición abstracta "matriz de matrices") no se ajusta a esa definición.

+2

Esto suena un poco abstracto para SO (porque no creo que la respuesta afecte ningún problema práctico de programación que enfrenta); probablemente sería más sobre el tema, por ejemplo, cs.stackexchange. –

+2

@OliCharlesworth supongo que hay muchos más programadores que son diseñadores de lenguaje o pensadores abstractos aquí que en CS. Esta pregunta en realidad no me parece más ciencia que suena como problemas relacionados con la programación. Parece ser un poco de ambos. Por lo tanto, me gustaría mantenerlo aquí (especialmente porque personalmente no estoy registrado todavía y ya tenemos un par de respuestas interesantes aquí). –

+0

Creo que esto podría estar en el tema aquí porque la respuesta a esta pregunta puede ayudar a que dos desarrolladores de C se comuniquen mejor. Si uso una terminología incorrecta en mis comunicaciones con mis colegas, eso podría tener un efecto en el rendimiento de nuestro equipo. +1 para una pregunta interesante. – jmort253

Respuesta

6

arrays Take .NET que ilustran esta muy bien:

C# tiene una distinción entre jagged arrays que se definen de una manera anidada:

int[][] jagged = new int[3][]; 

Cada matriz anidada puede tener una longitud diferente:

jagged[0] = new int[3]; 
jagged[1] = new int[4]; 

(Y tenga en cuenta que una de las matrices anidadas no se inicializa en absoluto, es decir, null.)

Por el contrario, un multidimensional array se define como sigue:

int[,] multidim = new int[3, 4]; 

En este caso, no tiene sentido hablar de matrices anidadas, y de hecho intentando acceder multidim[0] sería un error en tiempo de compilación - te necesita acceder a ella proporcionando todas las dimensiones, es decir, multidim[0, 1].

Sus tipos son diferentes también, como revelan las declaraciones anteriores.

Además, su manejo es totalmente diferente. Por ejemplo, se puede iterar sobre la matriz escalonada anterior con un objeto de tipo int[]:

foreach (int[] x in jagged) … 

pero interactuando sobre una matriz multidimensional se hace con los elementos de tipo int:

foreach (int x in multidim) … 

Conceptualmente, una matriz dentada es una matriz de matrices (... de matrices de matrices ... hasta el infinito) de T mientras que una matriz multidimensional es una matriz de T con un patrón de acceso establecido (es decir el índice es una tupla).

+0

interesante, nunca pensé en esa perspectiva. –

+1

esto tiene sentido para mí ahora, ¡gracias! Pero, sin embargo, no parece corresponderse con el significado real. Porque en realidad, si solo especifica una coordenada de una dimensión, obtendrá una matriz de coordenadas para la otra dimensión. Tipo de funciones de aplicación parcial (currying). Supongo que la relación de C con las múltiples dimensiones de la matriz es como la de Haskell con las funciones de múltiples parámetros. –

+0

@Johannes piensa en términos de indirecciones (pero eso es realmente un detalle de implementación, por lo tanto, no se menciona en la respuesta): una matriz dentada es una matriz de referencias/punteros a otras matrices. Una matriz multidimensional es * un * bloque de almacenamiento contiguo. Estoy de acuerdo (hasta cierto punto) con el aspecto de la aplicación parcial. Los arrays de .NET son bastante estúpidos, por lo que no admiten vistas, subintervalos o algo por el estilo. Por lo tanto, tampoco hay una aplicación parcial. –

0

Espero que las matrices multidimensionales ofrezcan operaciones como "Dame el número de dimensiones" o "Dame una cierta columna" o "Dame una cierta subvista". Las matrices en C no ofrecen estas operaciones.

0

De Wikipedia:

Multi-dimensional arrays

El número de índices necesarios para especificar un elemento se llama la dimensión, dimensionalidad, o el rango del tipo de matriz. (Esta nomenclatura entra en conflicto con el concepto de dimensión en álgebra lineal, [5] donde es el número de elementos. Por lo tanto, se dice que una matriz de números con 5 filas y 4 columnas, y 20 elementos, tiene dimensión 2 en contextos informáticos , sino que representa una matriz con dimensión de 4 por 5 o 20 en matemáticas. Además, el significado de la informática de "rango" es similar a su significado en el álgebra tensor pero no al concepto de álgebra lineal de rango de una matriz.)

Muchos idiomas solo admiten matrices unidimensionales. En esos idiomas, una matriz multidimensional se representa típicamente por un vector Iliffe, una matriz unidimensional de referencias a matrices de una dimensión menos. Una matriz bidimensional, en particular, se implementaría como un vector de punteros a sus filas. Por lo tanto, se accedería a un elemento en la fila iy la columna j de una matriz A mediante doble indexación (A [i] [j] en notación típica). Esta forma de emular matrices multidimensionales permite la creación de matrices fragmentadas o irregulares, donde cada fila puede tener un tamaño diferente o, en general, donde el rango válido de cada índice depende de los valores de todos los índices anteriores.

Esta representación para las matrices multidimensionales es muy frecuente en el software de C y C++. Sin embargo, C y C++ utilizarán una fórmula de indexación lineal para matrices multidimensionales que se declaran como tales, p. por int A [10] [20] o int A [m] [n], en lugar de la tradicional int ** A [6]:. p.81

Para un ejemplo de un lenguaje de apoyo matrices multidimensionales , ver here.

+0

Esta cita parece contradecir la afirmación en el chat. Dice "Sin embargo, C y C++ usarán una fórmula de indexación lineal para matrices multidimensionales que se declaran como tales". –

+0

bueno, estoy de acuerdo en que parece ser un caso especial en el que C parece ofrecer una matriz multidimensional real ... de hecho, creo que 'int A [10] [20]' también cuenta como un tipo en sí mismo. aún así es un caso específico, ya que las dimensiones deben conocerse en tiempo de compilación ... – sergio

0

C no tiene matrices multidimensionales, pero C tienen órdenes de órdenes.

En la Norma, la redacción matriz multidimensional se utiliza, pero C matrices multidimensionales son en realidad conjuntos de matrices. De Kernighan & Ritchie:

"En C, una matriz de dos dimensiones es realmente una matriz unidimensional, cada uno de cuyos elementos es una matriz."

Algunos idiomas admiten matrices multidimensionales como tipos de primera clase. El libro "Expert C Programming" muestra el ejemplo de Ada que admite tanto matrices de matrices como matrices multidimensionales.

0

llego a su punto. En realidad, los diferencia del punto de vista de implementación, pero en realidad son válidos para decir matrices multidimensionales.

El "conjunto de la matriz" tipo utiliza la indexación lineal, ya que en realidad está implementado como una matriz unidimensional, pese a nivel de lenguaje que está referenciado a través del índice múltiple.Ex, en C:

int a[5][5]; 

realidad tendría la misma estructura que:

int a[25]; 

El compilador se traduciría un acceso tales como:

a[i][j] 

a:

a[i * jDimensionWidth + j] 

donde jDimensionWidth = 5 en adelante e xample. Y es aún posible acceder a ella como:

int* b = (int*) a; 
printf("%d\n",b[12] == a[2][2]); // should output 1 

El tipo "matriz multidimensional" se implementa a través Iliffe vector como dijo, en el que la indexación no se puede linealizar porque la dirección no es lineal, así ya que el vector típicamente se implementa como un objeto de montón. Este tipo de matriz multidimensional no encaja en la ecuación (para matriz de 2 dimensiones):

addr(a[i + 1]) = addr(a[i]) + (a[i].width * sizeof(a[i][j].datatype)) 

que se cumple por el "conjunto de matriz" tipo.

Cuestiones relacionadas