stringtranslate.com

Zancada de una matriz

En programación informática , el paso de una matriz (también denominado incremento , paso o tamaño de paso ) es el número de ubicaciones en la memoria entre los comienzos de los elementos sucesivos de la matriz , medido en bytes o en unidades del tamaño de los elementos de la matriz. El paso 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 exactamente del mismo tamaño que el tamaño de cada uno de sus elementos es contigua en la memoria. A veces se dice que estas matrices tienen un paso unitario . Las matrices con paso unitario a veces son más eficientes que las matrices sin paso unitario, pero las matrices sin paso unitario 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 a la localidad espacial .

Razones para la zancada no unitaria

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

Matrices paralelas superpuestas

Algunos lenguajes permiten que las matrices de estructuras se traten como matrices paralelas superpuestas con un paso no unitario:

#incluir <stdio.h> struct MyRecord { int valor ; char * texto ; };      /** Imprime el contenido de una matriz de ints con el paso dado.  Ten en cuenta que size_t es el tipo correcto, ya que int puede desbordarse. */ void print_some_ints ( const int * arr , int length , size_t stride ) { int i ; printf ( "Dirección \t\t Valor \n " ); for ( i = 0 ; i < length ; ++ i ) { printf ( "%p \t %d \n " , arr , arr [ 0 ]); arr = ( int * )(( unsigned char * ) arr + stride ); } }                             int main ( void ) { int ints [ 100 ] = { 0 }; struct MyRecord registros [ 100 ] = { 0 };           imprimir_algunos_ints ( & ints [ 0 ], 100 , tamaño de ints [ 0 ]); imprimir_algunos_ints ( & registros [ 0 ]. valor , 100 , tamaño de registros [ 0 ]); devolver 0 ; }         

Este modismo es una forma de juego de palabras .

Sección transversal de la matriz

Algunos lenguajes como PL/I o Fortran permiten lo que se conoce como una sección transversal de 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 referenciarse como

alguna_matriz ( * , 2 )

Ejemplo de matriz multidimensional con paso no unitario

El paso sin unidad es particularmente útil para imágenes. Permite crear subimágenes sin copiar los datos de píxeles. Ejemplo de Java:

public class GrayscaleImage { private final int width , height , widthStride ; /** Datos de píxeles. Los píxeles en una sola fila siempre se consideran contiguos en este ejemplo. */ private final byte [] pixels ; /** Desplazamiento del primer píxel dentro de los píxeles */ private final int offset ;                    /** Constructor para datos contiguos */ public Image ( int width , int height , byte [] pixels ) { this . width = width ; this . height = height ; this . pixels = pixels ; this . offset = 0 ; this . widthStride = width ; }                         /** Constructor de subsección */ public Image ( int ancho , int alto , byte [] píxeles , int desplazamiento , int anchoStride ) { este . ancho = ancho ; este . alto = alto ; este . píxeles = píxeles ; este . desplazamiento = desplazamiento ; este . anchoStride = anchoStride ; }                             /** 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. */ public Image crop ( int x1 , int y1 , int x2 , int y2 ) { return new Image ( x2 - x1 , y2 - y1 , pixels , offset + y1 * widthStride + x1 , widthStride ); }                              /** Devuelve el valor del píxel en la coordenada especificada */ public byte getPixelAt ( int x , int y ) { return pixels [ offset + y * widthStride + x ] ; } }                

Referencias

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