gpt4 book ai didi

multidimensional-array - 分配具有相互依赖维度的动态数组

转载 作者:行者123 更新时间:2023-12-04 17:26:20 24 4
gpt4 key购买 nike

这有点复杂;我欢迎就如何提高问题的清晰度提出任何意见。

好的,假设我有一个数组:

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)我们有一个值 cell尺寸 lev ^2。注意这些 cell每个 data(i) 都是唯一的和每个 lev ,以及那个特定的大小 cell取决于对应的 lev值,可能还有相应的 data(i)也。

我是否必须在派生类型中使用派生类型?

最佳答案

是的,您可以使用派生类型来完成此操作:

TYPE array
REAL,DIMENSION(:,:,:),ALLOCATABLE :: A
ENDTYPE array

INTEGER :: i
INTEGER,PARAMETER :: n=10

TYPE(array),DIMENSION(:),ALLOCATABLE :: B

ALLOCATE(B(n))

DO i=1,n
ALLOCATE(B(i)%A(3,i,i*i))
WRITE(*,*)SHAPE(B(i)%A)
ENDDO

END

这种方法允许数组 B 的每个元素都是不同形状的多维数组。

程序的输出符合预期:
        3            1            1
3 2 4
3 3 9
3 4 16
3 5 25
3 6 36
3 7 49
3 8 64
3 9 81
3 10 100

编辑:进一步回答 OP 编辑​​的问题。是的,您似乎需要做这样的事情,使用嵌套派生类型(与您的代码示例进行比较以找出您做错了什么):
integer,parameter :: m=3,n=5

type cellarray
integer,dimension(:),allocatable :: c
endtype cellarray

type myarray
integer,allocatable :: lev(:)
type(cellarray),dimension(:),allocatable :: cell
endtype myarray

type(myarray),dimension(:),allocatable :: B

allocate(B(m))

! Allocate and assign lev and cell:
do i=1,m
allocate(B(i)%lev(n))
allocate(B(i)%cell(n))
do j=1,n
B(i)%lev(j)=j
enddo
enddo

! Based on value of lev, allocate B%cell%c:
do i=1,m
do j=1,n
allocate(B(i)%cell(j)%c(B(i)%lev(j)**2))
enddo
enddo

! Print out to check that it works:
do j=1,n
write(*,*)j,B(1)%lev(j),SIZE(B(1)%cell(j)%c)
enddo

end

用 gfortran 4.6.2 试过这个。它产生预期的输出:
       1           1           1
2 2 4
3 3 9
4 4 16
5 5 25

关于multidimensional-array - 分配具有相互依赖维度的动态数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8557106/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com