Fortran - 构造函数

下表描述了构造函数:

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

它在 mask 的控制下将向量分散到数组中。 逻辑数组掩码的形状必须与数组的形状一致。 数组向量的秩必须为 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