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