Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从fortran数组中选择除一个之外的所有元素_Fortran - Fatal编程技术网

从fortran数组中选择除一个之外的所有元素

从fortran数组中选择除一个之外的所有元素,fortran,Fortran,假设我有一个1D数组,例如,a(1:10),我想对这个数组的所有元素执行一个操作,除了第三个元素(比方说)。如何在执行操作时跳过此元素?A(1:10)=2*A(1:10)将此数组的所有元素与2相乘,但假设我不想将第三个元素与2相乘。如何在Fortran中实现这一点?如果只是一个元素,则可以先将其保存到另一个变量,然后在操作后重写其值: backup=A(i) A=2*A A(i)=backup 另一种选择是明确排除它 A(:i-1)=2*A(:i-1) A(i+1:)=2*A(i+1:) 如

假设我有一个1D数组,例如,a(1:10),我想对这个数组的所有元素执行一个操作,除了第三个元素(比方说)。如何在执行操作时跳过此元素?A(1:10)=2*A(1:10)将此数组的所有元素与2相乘,但假设我不想将第三个元素与2相乘。如何在Fortran中实现这一点?

如果只是一个元素,则可以先将其保存到另一个变量,然后在操作后重写其值:

backup=A(i)
A=2*A
A(i)=backup
另一种选择是明确排除它

A(:i-1)=2*A(:i-1)
A(i+1:)=2*A(i+1:)

如果只是一个元素,可以先将其保存到另一个变量,然后在操作后重写其值:

backup=A(i)
A=2*A
A(i)=backup
另一种选择是明确排除它

A(:i-1)=2*A(:i-1)
A(i+1:)=2*A(i+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

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

正如其他回复所指出的,有几种方法可以实现这一点,但我最喜欢的选项尚未列出,即使用
FORALL
语句:

forall (i=1:10,i/=3) A(i)=2*A(i)
出于某种原因,这在Fortran 2018中逐渐过时,但我相信这是获得所需内容的最清晰、简洁和可矢量化的方法

另一种简洁的方法是,如果您在其他地方存储了纯数组索引函数,如:

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

正如其他回复所指出的,有几种方法可以实现这一点,但我最喜欢的选项尚未列出,即使用
FORALL
语句:

forall (i=1:10,i/=3) A(i)=2*A(i)
出于某种原因,这在Fortran 2018中逐渐过时,但我相信这是获得所需内容的最清晰、简洁和可矢量化的方法

另一种简洁的方法是,如果您在其他地方存储了纯数组索引函数,如:

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

非常感谢你的建议。我很清楚你建议的上述方法。实际上,我选择的例子非常简单,实际的过程需要对一个数组的几个不同元素进行大量计算,基本上是一个6D数组。我只是想知道Fortran中是否有这样的功能,允许我们根据需要分割数组。非常感谢您的建议。我很清楚你建议的上述方法。实际上,我选择的例子非常简单,实际的过程需要对一个数组的几个不同元素进行大量计算,基本上是一个6D数组。我只是想知道Fortran中是否有这样的功能,允许我们根据需要分割数组;A(3)=A(3)/2在这种特殊情况下,我只需要做:
A=2*A;A(3)=A(3)/2
有关删除所有的部分原因,请参阅及其指向的部分参考。现在很多人更喜欢并发的,因为它没有所有都有的问题。感谢@HighPerformanceMark的链接-是的,看起来决策是基于编译器性能的,但对我来说,使代码尽可能短是非常重要的,尤其是在处理大型项目时。Fortran 90/95在这方面做得非常好,它的所有“Matlab风格”语法,你可以在一行中得到很多,我仍然认为在这方面没有更好的语言。从可读性的角度来看,现代Fortran的可读性要差得多,它所有的
%
非常长的%variable%名称
…出于某些原因,所有的
都要删除
,请参阅和它指向您的一些引用。现在很多人更喜欢并发的
,因为它没有所有
都有的问题。感谢@HighPerformanceMark的链接-是的,看起来决策是基于编译器性能的,但对我来说,使代码尽可能短是非常重要的,尤其是在处理大型项目时。Fortran 90/95在这方面做得非常好,它的所有“Matlab风格”语法,你可以在一行中得到很多,我仍然认为在这方面没有更好的语言。从可读性的角度来看,现代Fortran要差得多,它的
%
非常长的%variable%名称
。。。。