gpt4 book ai didi

fortran - 将 4 维数组减少为 2 Fortran

转载 作者:行者123 更新时间:2023-12-02 08:05:07 26 4
gpt4 key购买 nike

我正在尝试将 Fortran 中的 4 维数组 reshape 为 2 维数组:

do k=1,nA
do m=1,nA
do l=1,nB
do n=1,nB

p = k * nA + m
q = l * nB + n

Lpq(p,q) = Aij(k,m,l,n)

end do
end do
end do
end do

定义索引 pq 的正确方法是什么?

最佳答案

以下答案做出以下假设:

  • AijLpq 都有默认的开始和结束索引(即开始索引为 ONE,结束索引为对应的维度。即

    TYPE, DIMENSION(nA,nA,nB,nB) :: Aij
    TYPE, DIMENSION(nA*nA,nB*nB) :: Lpq

有很多方法可以将 Aij 映射到 Lpq 上,但是您定义的方法是 Aij 中的第二个和第四个索引(引用为 mn) 是 Lpq 中运行最快的索引。这意味着:

Aij(1,1  ,1,1) => Lpq(1,1)
...
Aij(1,nA ,1,1) => Lpq(nA,1)
Aij(2,1 ,1,1) => Lpq(nA+1,1)
...
Aij(2,nA ,1,1) => Lpq(2*nA,1)
...
Aij(nA,nA,1,1) => Lpq(nA*nA,1)

其他维度存在类似的映射。

您实现的当前映射(即 p = k * nA + m)在 k=m=1 时设置 p=nA+1 > 并为 k=m=nA 返回 p=(nA+1)*nA。因此,您错过了下限并超出了上限。

您必须将映射定义为:

p = (k-1) * nA + m
q = (l-1) * nB + n

但是请注意,正如评论中所提到的,Fortran 有一个内在过程 reshape 可以为您完成这些类型的映射。可悲的是,在您的特定情况下,由于选择了最快的索引,它并不那么方便。

  • 如果您选择最快的索引是 kl,那么您可以使用单个 reshape 作为系统已经在列主要顺序中:

    Lpq = reshape(Aij,[nA*nA,nB*nB])
  • 如果您选择最快的索引是 mn,那么您需要两次调用 reshape。第一个交换两个索引并将系统置于列主顺序中,第二个进行真正的 reshape 。

    Bij = reshape(Aij,[nA,nA,nB,nB],order=[2,1,4,3])
    Lpq = reshape(Bij,[nA*nA,nB*nB])

关于fortran - 将 4 维数组减少为 2 Fortran,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52485841/

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