我正在尝试编写一些Fortran代码,需要重新排序n维数组。我认为reshape内置函数结合
考虑以下最简示例。
我期望这将导致
但是我发现:
我已经尝试过使用
order
参数应该可以实现这一点,但是我遇到了困难。考虑以下最简示例。
program test
implicit none
real, dimension(:,:,:,:,:), allocatable :: matA, matB
integer, parameter :: n1=3, n2=5, n3=7, n4=11, n5=13
integer :: i1, i2, i3, i4, i5
allocate(matA(n1,n2,n3,n4,n5)) !Source array
allocate(matB(n3,n2,n4,n1,n5)) !Reshaped array
!Populate matA
do i5=1, n5
do i4=1, n4
do i3=1, n3
do i2=1, n2
do i1=1, n1
matA(i1,i2,i3,i4,i5) = i1+i2*10+i3*100+i4*10000+i5*1000000
enddo
enddo
enddo
enddo
enddo
print*,"Ad1 : ",matA(:,1,1,1,1),shape(matA)
matB = reshape(matA, shape(matB), order = [3,2,4,1,5])
print*,"Bd4 : ",matB(1,1,1,:,1),shape(matB) !Leading dimension of A is the fourth dimension of B
end program test
我期望这将导致
Ad1 : 1010111.00 1010112.00 1010113.00 3 5 7 11 13
Bd4 : 1010111.00 1010112.00 1010113.00 7 5 11 3 13
但是我发现:
Ad1 : 1010111.00 1010112.00 1010113.00 3 5 7 11 13
Bd4 : 1010111.00 1010442.00 1020123.00 7 5 11 3 13
我已经尝试过使用
gfortran
(4.8.3 和 4.9) 以及 ifort
(11.0),并得到了相同的结果,因此很可能是我对于 reshape 的工作原理存在误解。请问有谁能够帮忙指出我的错误并告诉我如何实现我的目标吗?
matA
的“扁平”视图确实有助于进一步澄清order
的使用。 - d_1999