Fortran - Funciones de construcción
La siguiente tabla describe las funciones de construcción:
Función | Descripción |
---|---|
fusionar (tsource, fsource, mask) | Esta función une dos matrices. Da los elementos en tsource si la condición en la máscara es .true. y fsource si la condición en la máscara es .false. Los dos campos tsource y fsource deben ser del mismo tipo y de la misma forma. El resultado también es de este tipo y forma. Además, la máscara debe tener la misma forma. |
paquete (matriz, máscara, vector) | Empaqueta una matriz en un vector con el control de máscara. La forma de la máscara de la matriz lógica debe coincidir con la de la matriz o, de lo contrario, la máscara debe ser un escalar. Si se incluye vector, tiene que ser una matriz de rango 1 (es decir, un vector) con al menos tantos elementos como los que son verdaderos en la máscara y tener el mismo tipo que la matriz. Si la máscara es un escalar con el valor .true. entonces el vector en su lugar debe tener el mismo número de elementos que la matriz. |
spread (fuente, tenue, ncopies) | Devuelve una matriz del mismo tipo que la fuente del argumento con el rango aumentado en uno. Los parámetros dim y ncopies son enteros. si ncopies es negativo, se utiliza el valor cero en su lugar. Si la fuente es un escalar, spread se convierte en un vector con ncopies elementos que tienen el mismo valor que la fuente. El parámetro dim indica qué índice se va a ampliar. tiene que estar dentro del rango 1 y 1+ (rango de fuente), si la fuente es un escalar, entonces tenue debe ser uno. El parámetro ncopies es el número de elementos en las nuevas dimensiones. |
desempaquetar (vector, máscara, matriz) | Dispersa un vector a una matriz bajo el control de la máscara. La forma de la máscara de matriz lógica debe coincidir con la de la matriz. El vector de matriz debe tener el rango 1 (es decir, es un vector) con al menos tantos elementos como los que son verdaderos en la máscara, y también debe tener el mismo tipo que la matriz. Si la matriz se da como un escalar, se considera que es una matriz con la misma forma que la máscara y los mismos elementos escalares en todas partes. El resultado será una matriz con la misma forma que la máscara y el mismo tipo que el vector. Los valores serán los del vector que se acepten, mientras que en las posiciones restantes de la matriz se mantienen los valores antiguos. |
Example
El siguiente ejemplo demuestra el concepto:
program arrayConstruction
implicit none
interface
subroutine write_array (a)
real :: a(:,:)
end subroutine write_array
subroutine write_l_array (a)
logical :: a(:,:)
end subroutine write_l_array
end interface
real, dimension(2,3) :: tsource, fsource, result
logical, dimension(2,3) :: mask
tsource = reshape( (/ 35, 23, 18, 28, 26, 39 /), &
(/ 2, 3 /) )
fsource = reshape( (/ -35, -23, -18, -28, -26, -39 /), &
(/ 2,3 /) )
mask = reshape( (/ .true., .false., .false., .true., &
.false., .false. /), (/ 2,3 /) )
result = merge(tsource, fsource, mask)
call write_array(tsource)
call write_array(fsource)
call write_l_array(mask)
call write_array(result)
end program arrayConstruction
subroutine write_array (a)
real :: a(:,:)
do i = lbound(a,1), ubound(a,1)
write(*,*) (a(i, j), j = lbound(a,2), ubound(a,2) )
end do
return
end subroutine write_array
subroutine write_l_array (a)
logical :: a(:,:)
do i = lbound(a,1), ubound(a,1)
write(*,*) (a(i, j), j= lbound(a,2), ubound(a,2))
end do
return
end subroutine write_l_array
Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:
35.0000000 18.0000000 26.0000000
23.0000000 28.0000000 39.0000000
-35.0000000 -18.0000000 -26.0000000
-23.0000000 -28.0000000 -39.0000000
T F F
F T F
35.0000000 -18.0000000 -26.0000000
-23.0000000 28.0000000 -39.0000000