Fortran - Funciones de remodelación
La siguiente tabla describe la función de remodelación:
Función | Descripción |
---|---|
remodelar (fuente, forma, almohadilla, orden) | Construye una matriz con una forma específica a partir de los elementos de una fuente de matriz determinada. Si la almohadilla no está incluida, el tamaño de la fuente debe ser al menos del producto (forma). Si se incluye pad, debe tener el mismo tipo que la fuente. Si se incluye el orden, debe ser una matriz entera con la misma forma que la forma y los valores deben ser una permutación de (1,2,3, ..., n), donde n es el número de elementos en la forma, tiene que ser menor o igual a 7. |
Example
El siguiente ejemplo demuestra el concepto:
program arrayReshape
implicit none
interface
subroutine write_matrix(a)
real, dimension(:,:) :: a
end subroutine write_matrix
end interface
real, dimension (1:9) :: b = (/ 21, 22, 23, 24, 25, 26, 27, 28, 29 /)
real, dimension (1:3, 1:3) :: c, d, e
real, dimension (1:4, 1:4) :: f, g, h
integer, dimension (1:2) :: order1 = (/ 1, 2 /)
integer, dimension (1:2) :: order2 = (/ 2, 1 /)
real, dimension (1:16) :: pad1 = (/ -1, -2, -3, -4, -5, -6, -7, -8, &
& -9, -10, -11, -12, -13, -14, -15, -16 /)
c = reshape( b, (/ 3, 3 /) )
call write_matrix(c)
d = reshape( b, (/ 3, 3 /), order = order1)
call write_matrix(d)
e = reshape( b, (/ 3, 3 /), order = order2)
call write_matrix(e)
f = reshape( b, (/ 4, 4 /), pad = pad1)
call write_matrix(f)
g = reshape( b, (/ 4, 4 /), pad = pad1, order = order1)
call write_matrix(g)
h = reshape( b, (/ 4, 4 /), pad = pad1, order = order2)
call write_matrix(h)
end program arrayReshape
subroutine write_matrix(a)
real, dimension(:,:) :: a
write(*,*)
do i = lbound(a,1), ubound(a,1)
write(*,*) (a(i,j), j = lbound(a,2), ubound(a,2))
end do
end subroutine write_matrix
Cuando se compila y ejecuta el código anterior, produce el siguiente resultado:
21.0000000 24.0000000 27.0000000
22.0000000 25.0000000 28.0000000
23.0000000 26.0000000 29.0000000
21.0000000 24.0000000 27.0000000
22.0000000 25.0000000 28.0000000
23.0000000 26.0000000 29.0000000
21.0000000 22.0000000 23.0000000
24.0000000 25.0000000 26.0000000
27.0000000 28.0000000 29.0000000
21.0000000 25.0000000 29.0000000 -4.00000000
22.0000000 26.0000000 -1.00000000 -5.00000000
23.0000000 27.0000000 -2.00000000 -6.00000000
24.0000000 28.0000000 -3.00000000 -7.00000000
21.0000000 25.0000000 29.0000000 -4.00000000
22.0000000 26.0000000 -1.00000000 -5.00000000
23.0000000 27.0000000 -2.00000000 -6.00000000
24.0000000 28.0000000 -3.00000000 -7.00000000
21.0000000 22.0000000 23.0000000 24.0000000
25.0000000 26.0000000 27.0000000 28.0000000
29.0000000 -1.00000000 -2.00000000 -3.00000000
-4.00000000 -5.00000000 -6.00000000 -7.00000000