我有一堆不同长度的数组,类似于a1 = [1.0]
,a2 = [1.0,2.0]
等。我需要遍历函数中的所有数组并使用它们的元素执行操作,但它们都不是索引的函数。我想知道Fortran 95中最好的方法是什么?我认为你可以创建一个维度(max_length, max_length)
的数组,并把它们全部放在那里;这将允许你通过索引引用每个元素,但它会浪费空间,你必须在每次调用它时传递整个数组的函数,而不仅仅是单个数组(我实际上不知道是否事情,但似乎它会。)
答案 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
这种方法有两点需要注意:
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。但是,由于单个数组散布在内存中(直接存在问题),因此直接方法通常较慢。