Fortran - Funciones de manipulación

Las funciones de manipulación son funciones de turno. Las funciones de desplazamiento devuelven la forma de una matriz sin cambios, pero mueven los elementos.

No Señor Función descriptiva
1

cshift(array, shift, dim)

Realiza un desplazamiento circular por posiciones de desplazamiento hacia la izquierda, si el desplazamiento es positivo y hacia la derecha si es negativo. Si la matriz es un vector, el cambio se realiza de forma natural, si es una matriz de un rango superior, entonces el cambio se produce en todas las secciones a lo largo de la dimensión atenuada. Si falta dim, se considera que es 1, en otros casos tiene que ser un número entero escalar entre 1 y n (donde n es igual al rango de la matriz). El argumento shift es un entero escalar o una matriz de enteros de rango n-1 y la misma forma que la matriz, excepto a lo largo de la dimensión dim (que se elimina debido al rango más bajo). Por lo tanto, se pueden cambiar diferentes secciones en varias direcciones y con varios números de posiciones.

2

eoshift(array, shift, boundary, dim)

Es el turno de finalización. Realiza un desplazamiento hacia la izquierda si el desplazamiento es positivo y hacia la derecha si es negativo. En lugar de los elementos desplazados, se toman nuevos elementos de la frontera. Si la matriz es un vector, el cambio se realiza de forma natural, si es una matriz de un rango superior, el cambio en todas las secciones es a lo largo de la dimensión atenuada. si falta dim, se considera que es 1, en otros casos debe tener un valor entero escalar entre 1 y n (donde n es igual al rango de la matriz). El argumento shift es un entero escalar si la matriz tiene rango 1, en el otro caso puede ser un entero escalar o una matriz entera de rango n-1 y con la misma forma que la matriz de matriz excepto a lo largo de la dimensión dim (que se elimina debido al rango más bajo).

3

transpose (matrix)

Transpone una matriz, que es una matriz de rango 2. Reemplaza las filas y columnas de la matriz.

Ejemplo

El siguiente ejemplo demuestra el concepto:

program arrayShift
implicit none

   real, dimension(1:6) :: a = (/ 21.0, 22.0, 23.0, 24.0, 25.0, 26.0 /)
   real, dimension(1:6) :: x, y
   write(*,10) a
   
   x = cshift ( a, shift = 2)
   write(*,10) x
   
   y = cshift (a, shift = -2)
   write(*,10) y
   
   x = eoshift ( a, shift = 2)
   write(*,10) x
   
   y = eoshift ( a, shift = -2)
   write(*,10) y
   
   10 format(1x,6f6.1)

end program arrayShift

Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:

21.0  22.0  23.0  24.0  25.0  26.0
23.0  24.0  25.0  26.0  21.0  22.0
25.0  26.0  21.0  22.0  23.0  24.0
23.0  24.0  25.0  26.0   0.0   0.0
0.0    0.0  21.0  22.0  23.0  24.0

Ejemplo

El siguiente ejemplo demuestra la transposición de una matriz:

program matrixTranspose
implicit none

   interface
      subroutine write_matrix(a)
         integer, dimension(:,:) :: a
      end subroutine write_matrix
   end interface

   integer, dimension(3,3) :: a, b
   integer :: i, j
    
   do i = 1, 3
      do j = 1, 3
         a(i, j) = i
      end do
   end do
   
   print *, 'Matrix Transpose: A Matrix'
   
   call write_matrix(a)
   b = transpose(a)
   print *, 'Transposed Matrix:'
   
   call write_matrix(b)
end program matrixTranspose


subroutine write_matrix(a)

   integer, 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 el código anterior se compila y ejecuta, produce el siguiente resultado:

Matrix Transpose: A Matrix

1  1  1
2  2  2
3  3  3
Transposed Matrix:

1  2  3
1  2  3
1  2  3