假设我有一个1D数组,例如A(1:10),我想对这个数组中除了第3个元素(比方说)以外的所有元素进行操作。如何在进行操作时跳过这个元素?A(1:10)=2*A(1:10)会将这个数组中的所有元素乘以2,但假设我不想将第3个元素乘以2,在Fortran中如何操作?
正如其他回复所指出的,有几种方法可以实现,但我最喜欢的选项还没有列出来,即用 FORALL
语句。
forall (i=1:10,i/=3) A(i)=2*A(i)
但我相信这是获取所需信息的最清晰、最简洁、最可向量化的方式。
另一种简洁的方法是,如果你有一个纯数组索引函数存储在其他地方,比如。
pure function arrayI(n) result(indices)
integer, intent(in) :: n
integer :: indices(n),i
forall(i=1:n) indices(i)=i
end function arrayI
然后用一行代码来解决你的问题,如
where (arrayI(10)/=3) a=2*a
在Fortran中并没有基本的操作,说要根据排除标准来选择数组中的某一组元素。 然而,有几种方法可以使用,但要付出更复杂的努力。
如果可以构造一个包含所需索引的数组,那么可以使用向量下标的方法
integer a(10)
integer, allocatable :: idx(:)
idx = [...] ! An array constructor of the desired elements to select
a(idx) = 2*a(idx)
这样的数组构造函数在问题中可能是 idx=[1,(i,i=3,10)]
. 我们可以用很多语句来建立这个数组,甚至不用变量来做向量下标。
我们可以使用WHERE结构选择数组中的元素来执行。
integer a(10), i
a = 1
where ([(i,i=1,10)]/=2) ! Or other selecting expression
a = 2*a
end where
(对于标签化的Fortran 90来说,使用数组构造函数 (/(...)/)
代替)。)
还有围绕数组部分的方法(如Tine198的回答),或者干脆在循环中使用排除法。
do i=1, 10
if (i==2) cycle ! Or other element exclusion criterion
a(i) = 2*a(i)
end do
如果只有一个元素,你可以先把它保存到另一个变量中,然后在操作后重写它的值。
backup=A(i)
A=2*A
A(i)=backup
另一个选择是明确地排除它。
A(:i-1)=2*A(:i-1)
A(i+1:)=2*A(i+1:)