Fortran中有没有办法在不使用循环的情况下访问数组的许多元素?
例如给定100个元素的数组
real(100) :: a
我可以做这样的事情来访问不遵循常规步骤的元素1,4,7,54,81吗?
a(1,4,7,54,81)= 3.21423
答案 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
但是,带有向量下标的数组节受到各种限制,例如:
在第三种情况下,如果同一索引在下标中多次出现,则无法定义它。所以
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.