在fortran中生成一个序列数组

Ste*_*ini 7 fortran fortran90

Fortran中是否存在一个内在函数,它生成一个包含从a到b的数字序列的数组,类似于python range()

>>> range(1,5)
[1, 2, 3, 4]
>>> range(6,10)
[6, 7, 8, 9]
Run Code Online (Sandbox Code Playgroud)

jan*_*neb 21

不,没有.

但是,您可以使用执行相同操作的构造函数初始化数组,


program arraycons
  implicit none
  integer :: i
  real :: a(10) = (/(i, i=2,20, 2)/)
  print *, a
end program arraycons

  • 它类似于 Python 列表理解。 (2认同)

Evg*_*nii 6

如果您需要支持浮点数,这里有一个类似于linspaceNumPy 和 MATLAB 中的 Fortran 子例程。


! Generates evenly spaced numbers from `from` to `to` (inclusive).
!
! Inputs:
! -------
!
! from, to : the lower and upper boundaries of the numbers to generate
!
! Outputs:
! -------
!
! array : Array of evenly spaced numbers
!
subroutine linspace(from, to, array)
    real(dp), intent(in) :: from, to
    real(dp), intent(out) :: array(:)
    real(dp) :: range
    integer :: n, i
    n = size(array)
    range = to - from

    if (n == 0) return

    if (n == 1) then
        array(1) = from
        return
    end if


    do i=1, n
        array(i) = from + range * (i - 1) / (n - 1)
    end do
end subroutine
Run Code Online (Sandbox Code Playgroud)

用法:

real(dp) :: array(5)
call linspace(from=0._dp, to=1._dp, array=array)
Run Code Online (Sandbox Code Playgroud)

输出数组

[0., 0.25, 0.5, 0.75, 1.]
Run Code Online (Sandbox Code Playgroud)

dp

integer, parameter :: dp = selected_real_kind(p = 15, r = 307) ! Double precision
Run Code Online (Sandbox Code Playgroud)