循环通过许多不同维度的不同阵列

时间:2013-05-11 18:22:55

标签: fortran

我有一堆不同长度的数组,类似于a1 = [1.0]a2 = [1.0,2.0]等。我需要遍历函数中的所有数组并使用它们的元素执行操作,但它们都不是索引的函数。我想知道Fortran 95中最好的方法是什么?我认为你可以创建一个维度(max_length, max_length)的数组,并把它们全部放在那里;这将允许你通过索引引用每个元素,但它会浪费空间,你必须在每次调用它时传递整个数组的函数,而不仅仅是单个数组(我实际上不知道是否事情,但似乎它会。)

2 个答案:

答案 0 :(得分:1)

拥有一个(maxlen,maxlen)数组只会在你谈论(数千,数千)时引起麻烦,否则它只是一种效率低下的方法。

假设您的数组具有相同类型和相同数量的维度,那么您可以创建一个派生类型,它将保存您的数组,然后创建您刚刚创建的类型的数组。因此,你将拥有一个变量lenth数组的数组。

type arrays
    integer(kind=8):: length !optional but very helpfull
    integer(kind=8), dimension(:), allocatable:: a
end type arrays

现在您可以声明类型数组的数组:

type(arrays), dimension(:), allocatable:: arrayList
type(arrays):: arrayList ( 1000 )  !if you know beforehand how many arrays you need 

这种方法有两点需要注意:

  • 根据我的经验,循环遍历派生类型的数组比通过本机类型数组慢。
  • 现在您访问a1,a2为arrayList(i) % a(j),乍一看可能会吓人

来源:http://courses.physics.illinois.edu/phys466/comp_info/derived.html

有关附加信息,您可以访问Fortran Wiki这是一个非常好的来源。

答案 1 :(得分:0)

答案实际上取决于你的实际情况。如果各种阵列的长度不同,但至少在相同的数量级,那么对于所有阵列,单个阵列可能会更好。然而,您需要一个额外的数组,它给出每个数组的元素数量。你的功能可能看起来像:

module test
  implicit none

  integer, parameter :: dp = kind(1.0d0)

contains

  subroutine process(array, nelems)
    real(dp), intent(in) :: array(:,:)
    integer, intent(in) :: nelems(:)

    integer :: ii, jj

    do ii = 1, size(arrays(dim=2))
      do jj = 1, nelems(ii)
        ! Do something with element jj of array ii.
      end do
    end do

  end subroutine process

end module test

子阵列array(1:nelems(ii),ii)存储第i个1D数组的元素。

以下几点可能值得注意:

  • 您应该在列二维阵列中排列1D子阵列,以便子阵列在内存中是连续的。

  • 您必须只将两个数组而不是一堆数组传递给子例程。这应该提供更清晰的代码。

  • 当然你浪费了一些记忆,因为集体数组的形状必须是(max_nr_of_elements_in_an_array, number_of_arrays)。如果数组长度非常不同并且您确实有很多数组,那么浪费的内存变得非常重要,您可以考虑数组数组接近as suggested by Eudoardo。但是,由于单个数组散布在内存中(直接存在问题),因此直接方法通常较慢。