当下标不是相同的顺序时Fortran数组赋值

时间:2014-12-31 22:53:41

标签: arrays fortran variable-assignment

当下标顺序不同时,如何完成数组赋值?我试过了

scansDC(1:nRadii, iScanF, 1:nSpeciesDC) = b(1:nSpeciesDC, 1:nRadii)

但是,尽管编译并运行时没有错误,但它会产生错误的结果。

目的是将b(iSpeciesDC, iRadius)复制到scansDC(iRadius, iScanF, iSpeciesDC) 1 <= iSpeciesDC <= nSpeciesDC1 <= iRadius<= nRadii

编译器是Intel Fortran XE 2015。

3 个答案:

答案 0 :(得分:1)

INTEGER :: i, j
FORALL (i=1:nRadii, j=1:nSpeciesDC) scansDC(i,iScanF,j) = b(j,i)

答案 1 :(得分:0)

原始尝试的原因

scansDC(1:nRadii, iScanF, 1:nSpeciesDC) = b(1:nSpeciesDC, 1:nRadii)

给出了一个不同于你想要的答案,因为你的编译器没有理由推断你想要转换b只是因为1:nRadii1:nSpeciesDC 范围切换。数组范围是兼容的,因此数据只是按线性顺序复制,为您提供所需的转置。

如果您需要以不同的顺序复制数据,则需要通过公平明确地执行复制来指定,例如在IanH的正确答案中,或者通过明确要求转置:

program test

    integer, parameter :: nradii=10, nspeciesDC=2
    integer, dimension(nradii, 5, nspeciesDC) :: scansDC
    integer, dimension(nspeciesDC, nradii) :: b
    integer :: i,j,k
    integer, parameter :: iscanf = 2

    scansDC = 0
    k = 0
    do i=1,nradii
        do j=1,nspeciesDC
            b(j,i) = k
            k = k + 1
        enddo
    enddo
    print *, b

    scansDC(1:nRadii, iScanF, 1:nSpeciesDC) = transpose(b(1:nspeciesDC, 1:nRadii))   

    print *,scansDC(:,iScanF,:)
end program test

答案 2 :(得分:0)

使用转置内在函数的最简单方法。

scansDC(1:nRadii, iScanF, 1:nSpeciesDC) = TRANSPOSE(b(1:nSpeciesDC, 1:nRadii))
相关问题