当下标顺序不同时,如何完成数组赋值?我试过了
scansDC(1:nRadii, iScanF, 1:nSpeciesDC) = b(1:nSpeciesDC, 1:nRadii)
但是,尽管编译并运行时没有错误,但它会产生错误的结果。
目的是将b(iSpeciesDC, iRadius)
复制到scansDC(iRadius, iScanF, iSpeciesDC)
1 <= iSpeciesDC <= nSpeciesDC
和1 <= iRadius<= nRadii
。
编译器是Intel Fortran XE 2015。
答案 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:nRadii
和1: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))