从Fortran数组中选择除一个元素以外的所有元素。

问题描述 投票:0回答:1

假设我有一个1D数组,例如A(1:10),我想对这个数组中除了第3个元素(比方说)以外的所有元素进行操作。如何在进行操作时跳过这个元素?A(1:10)=2*A(1:10)会将这个数组中的所有元素乘以2,但假设我不想将第3个元素乘以2,在Fortran中如何操作?

fortran fortran90
1个回答
0
投票

正如其他回复所指出的,有几种方法可以实现,但我最喜欢的选项还没有列出来,即用 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

1
投票

在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

0
投票

如果只有一个元素,你可以先把它保存到另一个变量中,然后在操作后重写它的值。

backup=A(i)
A=2*A
A(i)=backup

另一个选择是明确地排除它。

A(:i-1)=2*A(:i-1)
A(i+1:)=2*A(i+1:)
© www.soinside.com 2019 - 2024. All rights reserved.