stringtranslate.com

Paso de una matriz

En programación de computadoras , el paso de una matriz (también conocido como incremento , paso o tamaño de paso ) es el número de ubicaciones en la memoria entre los inicios de elementos sucesivos de la matriz , medido en bytes o en unidades del tamaño de los elementos de la matriz. La zancada no puede ser menor que el tamaño del elemento, pero puede ser mayor, lo que indica espacio adicional entre elementos.

Una matriz con un paso de exactamente el mismo tamaño que el tamaño de cada uno de sus elementos es contigua en la memoria. A veces se dice que estos conjuntos tienen un paso unitario . Las matrices de zancada unitaria a veces son más eficientes que las matrices de zancada sin unidad, pero las matrices de zancada sin unidad pueden ser más eficientes para matrices 2D o multidimensionales , dependiendo de los efectos del almacenamiento en caché y los patrones de acceso utilizados [ cita requerida ] . Esto se puede atribuir al principio de localidad , específicamente de localidad espacial .

Razones para el paso no unitario

Las matrices pueden tener un paso mayor que el ancho de sus elementos en bytes en al menos tres casos:

Relleno

Muchos lenguajes (incluidos C y C++ ) permiten que las estructuras se rellenen para aprovechar mejor la longitud de la palabra y/o el tamaño de la línea de caché de la máquina. Por ejemplo:

estructura A { int a ; carácter b ; };      estructura A myArray [ 100 ];  

En el fragmento de código anterior, myArraybien podría tener un paso de ocho bytes, en lugar de cinco (4 bytes para int más uno para char), si el código C se compilara para una arquitectura de 32 bits y el compilador se había optimizado (como suele ser el caso) para un tiempo de procesamiento mínimo en lugar de un uso mínimo de memoria.

Matrices paralelas superpuestas

Algunos lenguajes permiten que los conjuntos de estructuras se traten como conjuntos paralelos superpuestos con zancadas no unitarias:

#incluir <stdio.h> estructura MiRegistro { int valor ; carácter * texto ; };      /** Imprime el contenido de una matriz de entradas con el paso dado.  Tenga en cuenta que size_t es el tipo correcto, ya que int puede desbordarse. */ void print_some_ints ( const int * arreglo , int longitud , tamaño_t zancada ) { int i ; printf ( "Dirección \t\t Valor \n " ); for ( i = 0 ; i < longitud ; ++ i ) { printf ( "%p \t %d \n " , arreglo , arreglo [ 0 ]); arr = ( int * )(( char sin firmar * ) arr + zancada ); } }                             int principal ( vacío ) { int enteros [ 100 ] = {0} ; _ estructurar registros MyRecord [ 100 ] = {0} ; _           print_some_ints ( & enteros [ 0 ], 100 , tamaño de enteros [ 0 ]); print_some_ints ( & registros [ 0 ]. valor , 100 , tamaño de registros [ 0 ]); devolver 0 ; }         

Este modismo es una forma de juego de palabras tipográfico .

Sección transversal de la matriz

Algunos lenguajes como PL/I o Fortran permiten lo que se conoce como sección transversal de una matriz , que selecciona ciertas columnas o filas de una matriz más grande. [1] : p.262  Por ejemplo, si una matriz bidimensional se declara como

declarar  some_array  ( 12 , 2 ) fijo ;

una matriz de una dimensión que consta únicamente de la segunda columna puede denominarse como

alguna_matriz ( * , 2 )

Ejemplo de matriz multidimensional con zancada no unitaria

La zancada no unitaria es particularmente útil para las imágenes. Permite crear subimágenes sin copiar los datos de los píxeles. Ejemplo de Java:

clase pública Imagen en escala de grises { privado final int ancho , alto , anchoStride ; /** Datos de píxeles. En este ejemplo, los píxeles de una sola fila siempre se consideran contiguos. */ byte final privado [] píxeles ; /** Desplazamiento del primer píxel dentro de píxeles */ private final int offset ;                    /** Constructor para datos contiguos */ Imagen pública ( int ancho , int alto , byte [] píxeles ) { this . ancho = ancho ; este . altura = altura ; este . píxeles = píxeles ; este . desplazamiento = 0 ; este . anchoCamino = ancho ; }                         /** Constructor de subsección */ imagen pública ( int ancho , int alto , byte [] píxeles , int desplazamiento , int anchoStride ) { this . ancho = ancho ; este . altura = altura ; este . píxeles = píxeles ; este . desplazamiento = desplazamiento ; este . anchoCamino = anchoCamino ; }                             /** Devuelve una subregión de esta Imagen como una nueva Imagen. Esta y la nueva imagen comparten  los píxeles, por lo que los cambios en la imagen devuelta se reflejarán en esta imagen. */ recorte de imagen pública ( int x1 , int y1 , int x2 , int y2 ) { devolver nueva imagen ( x2 - x1 , y2 - y1 , píxeles , desplazamiento + y1 * anchoStride + x1 , anchoStride ); }                              /** Devuelve el valor de píxel en la coordenada especificada */ byte público getPixelAt ( int x , int y ) { return píxeles [ offset + y * widthStride + x ] ; } }                

Referencias

  1. ^ Hughes, Joan K (1979). Programación estructurada PL/I (segunda ed.) . Nueva York: John Wiley and Sons. ISBN 0-471-01908-9.