索引Fortran数组的多个非相邻元素

时间:2016-09-07 21:16:17

标签: fortran

Fortran中有没有办法在不使用循环的情况下访问数组的许多元素?

例如给定100个元素的数组

real(100) :: a

我可以做这样的事情来访问不遵循常规步骤的元素1,4,7,54,81吗?

a(1,4,7,54,81)= 3.21423

3 个答案:

答案 0 :(得分:7)

你可以使用矢量下标:a( (/1,4,7,54,81/) )= 3.21423

答案 1 :(得分:2)

如前所述,数组可以用作数组的索引。这就是所谓的向量下标。

A([1,4,7,54,81]) = 3.21423

设置赋予该值的元素。 (这与先前的答案相同,但使用的是Fortran 2003 + /现代数组构造函数表示法。)

该数组可以是任何等级1的数组,例如变量或表达式:

integer :: idx(5)=[1,4,7,54,81]
A(idx) = 3.21423
A(idx-1+1) = 3.21423

当然,矢量下标还可以用于其他设置,例如引用:

print *, A(idx)
call sub(A(idx))
A(idx) = A(idx+1) + 5

但是,带有向量下标的数组节受到各种限制,例如:

  1. 并非总是它们是过程的参数;
  2. 指针可能无法指向它们;
  3. 并非所有此类部分都可以分配给

在第三种情况下,如果同一索引在下标中多次出现,则无法定义它。所以

print *, A([1,5,1])
允许

,但是

A([1,5,1]) = 3.

不是。

答案 2 :(得分:-2)

RESHAPE和WHERE值得关注。 如果你要确定哪些元素要拔出'然后可能会分配一个新变量并将A的元素填充到B中。 也许是这样的:

REAL,    DIMENSION(100)            :: A
LOGICAL, DIMENSION(100)            :: A_Mask
INTEGER                            :: SizeB
REAL,    DIMENSION(:), ALLOCATABLE :: B
!...
A_Mask = .FALSE.
WHERE(A > 1.0)
  A_Mask = .TRUE.
ENDWHERE
SizeB = SUM(A_Mask)
!... then allocate B and fill it.