Fortran - 构造函数


下表描述了构造函数:

功能 描述
合并(t源,f源,掩码) 该函数连接两个数组。如果 mask 中的条件为 .true,则它给出 tsource 中的元素。如果 mask 中的条件为 .false,则返回 fsource。tsource 和 fsource 两个字段必须具有相同的类型和相同的形状。结果也是这种类型和形状。面罩也必须具有相同的形状。
包(数组、掩码、向量) 它通过 mask 的控制将数组打包为向量。逻辑数组掩码的形状必须与数组的形状一致,否则掩码必须是标量。如果包含向量,则它必须是一个秩为 1 的数组(即向量),其元素数量至少与 mask 中为 true 的元素数量相同,并且与数组具有相同的类型。如果 mask 是值为 .true 的标量。那么向量必须具有与数组相同数量的元素。
传播(源、暗淡、ncopies) 它返回一个与参数源类型相同的数组,且级别增加 1。参数dim 和ncopies 是整数。如果 ncopies 为负数,则使用零值。如果 source 是标量,则 spread 会变成一个向量,其中包含 ncopies 元素,这些元素都具有与 source 相同的值。参数dim表示要扩展哪个索引。它必须在 1 和 1+(源的等级)范围内,如果源是标量,则暗淡必须为 1。参数 ncopies 是新维度中的元素数量。
解包(向量、掩码、数组)

它将向量在掩码的控制下分散到数组中。逻辑数组掩码的形状必须与数组的形状一致。数组向量必须具有排名 1(即它是一个向量),且元素数量至少与 mask 中为 true 的元素一样多,并且还必须具有与数组相同的类型。如果数组作为标量给出,那么它被认为是一个与 mask 具有相同形状且各处具有相同标量元素的数组。

结果将是一个与 mask 形状相同、与向量类型相同的数组。这些值将是来自接受的向量的值,而在数组的其余位置中保留旧值。

例子

下面的例子演示了这个概念:

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

当上面的代码被编译并执行时,会产生以下结果:

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    
fortran_arrays.htm