Construction
优质
小牛编辑
150浏览
2023-12-01
下表描述了构造函数:
功能 | 描述 |
---|---|
merge(tsource, fsource, mask) | 此函数连接两个数组。 如果mask中的条件是.true,它给出tsource中的元素。 如果掩码中的条件为.false,则为fsource。 tsource和fsource这两个字段必须具有相同的类型和相同的形状。 结果也是这种类型和形状。 面具也必须具有相同的形状。 |
pack(array, mask, vector) | 它通过掩码控制将数组打包到矢量。 逻辑数组掩码的形状必须与数组一致,否则掩码必须是标量。 如果包含向量,则它必须是秩为1的数组(即向量),其元素至少与掩码中为真的元素一样多,并且具有与数组相同的类型。 如果mask是一个值为.true的标量。 然后矢量必须具有与数组相同数量的元素。 |
spread(source, dim, ncopies) | 它返回一个与参数源相同类型的数组,其等级增加1。 参数dim和ncopies是整数。 如果ncopies为负数,则使用零值。 如果source是标量,则spread会变成带有ncopies元素的向量,这些元素都与source具有相同的值。 参数dim指示要扩展的索引。 它必须在1和1+的范围内(源的等级),如果源是标量,则dim必须是1。 参数ncopies是新维度中的元素数。 |
unpack(vector, mask, array) | 它将矢量分散到掩码控制下的数组中。 逻辑阵列掩码的形状必须与数组一致。 数组向量必须具有等级1(即它是向量),其具有至少与掩码中为真的元素一样多的元素,并且还必须具有与数组相同的类型。 如果数组作为标量给出,那么它被认为是一个与掩码具有相同形状的数组,并且到处都是相同的标量元素。 结果将是一个与mask相同形状的数组,与vector类型相同。 值将是来自可接受的向量的值,而在数组中的其余位置中保留旧值。 |
Example
以下示例演示了以下概念:
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