En informática , un grupo de matrices paralelas (también conocido como estructura de matrices o SoA) es una forma de estructura de datos implícita que utiliza varias matrices para representar una matriz singular de registros . Mantiene una matriz de datos separada y homogénea para cada campo del registro, cada uno con el mismo número de elementos. Entonces, los objetos ubicados en el mismo índice en cada matriz son implícitamente los campos de un solo registro. Los punteros de un objeto a otro se reemplazan por índices de matriz. Esto contrasta con el enfoque normal de almacenar todos los campos de cada registro juntos en la memoria (también conocido como matriz de estructuras o AoS). Por ejemplo, uno podría declarar una matriz de 100 nombres, cada uno una cadena, y 100 edades, cada una un entero, asociando cada nombre con la edad que tiene el mismo índice.
Un ejemplo en C usando matrices paralelas:
int edades [] = { 0 , 17 , 2 , 52 , 25 }; char * nombres [] = { "Ninguno" , "Mike" , "Billy" , "Tom" , "Stan" }; int padre [] = { 0 /*Ninguno*/ , 3 /*Tom*/ , 1 /*Mike*/ , 0 /*Ninguno*/ , 3 /*Tom*/ }; para ( i = 1 ; i <= 4 ; i ++ ) { printf ( "Nombre: %s, Edad: %d, Padre: %s \n " , nombres [ i ], edades [ i ], nombres [ padre [ i ]]); }
en Perl (usando un hash de matrices para contener referencias a cada matriz):
mis %datos = ( nombre => [ 'Joe' , 'Bob' , 'Frank' , 'Hans' ], apellido => [ 'Smith' , 'Seger' , 'Sinatra' , 'Schultze' ], altura_en_cm => [ 169 , 158 , 201 , 199 ]); para $i ( 0 .. $# { $data { nombre_primero }}) { printf "Nombre: %s %s\n" , $data { nombre_primero }[ $i ], $data { apellido }[ $i ]; printf "Altura en CM: %i\n" , $data { altura_en_cm }[ $i ]; }
O, en Python :
nombres = [ "Joe" , "Bob" , "Frank" , "Hans" ] apellidos = [ "Smith" , "Seger" , "Sinatra" , "Schultze" ] alturas_en_cm = [ 169 , 158 , 201 , 199 ]para i en rango ( len ( first_names )): print ( "Nombre: %s %s " % ( first_names [ i ], last_names [ i ])) print ( "Altura en cm: %s " % alturas_en_cm [ i ]) # Usando código postal: para nombre , apellido , altura en cm en código postal ( nombres , apellidos , alturas en cm ): print ( f "Nombre: { nombre } { apellido } " ) print ( f "Altura en cm: { altura en cm } " )
Las matrices paralelas tienen una serie de ventajas prácticas sobre el enfoque normal:
Muchas de estas ventajas dependen en gran medida del lenguaje de programación particular y de la implementación utilizada.
Sin embargo, las matrices paralelas también tienen varias desventajas importantes, lo que sirve para explicar por qué generalmente no se prefieren:
La mala localización de las referencias se puede aliviar en algunos casos: si una estructura se puede dividir en grupos de campos a los que generalmente se accede juntos, se puede construir una matriz para cada grupo, y sus elementos son registros que contienen solo estos subconjuntos de los campos de la estructura más grande (consulte el diseño orientado a datos ). Esta es una forma valiosa de acelerar el acceso a estructuras muy grandes con muchos miembros, al tiempo que se mantienen unidas las partes de la estructura. Una alternativa a unirlas mediante índices de matriz es utilizar referencias para unir las partes, pero esto puede ser menos eficiente en tiempo y espacio.
Otra alternativa es utilizar una única matriz, donde cada entrada es una estructura de registro. Muchos lenguajes proporcionan una forma de declarar registros reales y matrices de ellos. En otros lenguajes puede ser posible simular esto declarando una matriz de tamaño n*m, donde m es el tamaño de todos los campos juntos, empaquetando los campos en lo que es efectivamente un registro, aunque el lenguaje en particular carece de soporte directo para registros. Algunas optimizaciones del compilador , particularmente para procesadores vectoriales , pueden realizar esta transformación automáticamente cuando se crean matrices de estructuras en el programa. [ cita requerida ]