【发布时间】:2012-01-23 08:00:48
【问题描述】:
这有点复杂;我欢迎任何关于如何提高问题清晰度的 cmets。
好的,假设我有一个数组:
real, allocatable :: A(:,:,:)
我想在使用它之前分配它。第三维度的大小是否可能取决于第二维度的大小?
例如
do i=1,n
allocate(A(3,i,i**2))
end do
显然以上方法行不通。我想最终得到一个具有形状的数组(或一组数组)
(3,1,1), (3,2,4), (3,3,9), ... (3, n, n^2)
其中第三维的大小是第二维大小的平方。
我对依赖维度大小的规则有点复杂,但如果可以平方,我可以做剩下的事情。
这可能吗?如果是这样,我该如何在 Fortran 中实现它?
shape(A) 会返回什么?那会很有趣。
我的另一种选择是分配到所需的最大大小,并注意仅在计算中使用某些元素,即
allocate(A(3,n,n**2))
尽管目前我的记忆力并不强,但我希望有良好的编程习惯。无论如何,这是一个有趣的问题。
谢谢。
编辑:
如果一个维度的大小取决于另一个维度中元素的值呢?
在下面的答案中,两个维度的数组大小取决于 B 的索引。我想要一些类似于
的东西type myarray
real :: coord(3)
integer,allocatable :: lev(:)
integer, allocatable :: cell(:)
endtype myarray
type(myarray), allocatable :: data
allocate(data(m))
allocate(data%lev(n))
forall (j=1:n) !simple now, for argument's sake
lev(j)=j
endforall
! I was thinking of using a FORALL loop here, but the errors returned
! suggested that the compiler (gfortran) didn't expect IF blocks and ALLOCATE
! statements in a FORALL block
do i=1,m
do j=1,n
allocate(data(i)%cell(lev(j)**2))
enddo
enddo
你明白我的意思吗?但是程序在尝试分配已经分配的变量时失败了,例如当i=1 分配data(1)%cell(1),然后尝试分配data(1)%cell(2)...呃哦。我想要的是这样的:
每个data(i) 都有一个lev(j) 值数组,j 从 1 到 n 运行,对于每个 lev(j) 值,我们有一个大小为 lev^2 的 cell。请注意,这些cell 对于每个data(i) 和每个lev 都是唯一的,并且该特定cell 的大小取决于相应的lev 值,也可能取决于相应的data(i)。
我必须在派生类型中使用派生类型吗?
【问题讨论】:
-
您知道,您要查找的数组类型称为“锯齿状”数组,而不是“矩形”数组。下面的IRO-bot有正确答案;在 Fortran 中,数组本身总是矩形的,但您可以使用定义的类型来制作自己的结构。
-
"Jagged"...嘿,这很有道理,从图片上看。 “...您可以使用已定义的类型来创建自己的结构。”真的吗?因此,如果我想要一个数组,它的形状增加到一半然后减小,或者遵循斐波那契数列,或者是完全随机的——这一切都可能不需要太多努力......酷!
-
@SamuelTan 我用更新的代码进一步编辑了我的答案,以解决您的新问题。比较这两个代码,看看你做错了什么。
标签: multidimensional-array fortran dynamic-memory-allocation