杰克·吉伦哈尔的博客 生活 学习

reshape of Fortran

2019-03-01


reshape of Fortran

示例

考虑如下代码:

integer,dimension(3,3,2) :: &
mat = reshape( &
     (/1,2,3,  &
       4,5,6   &
       7,8,9,  &
       
       -1,-2,-3, &
       -4,-5,-6, &
       -7,-8,-9/),(/3,3,2/))
       
write(*,*) mat(1,:,1)
write(*,*) mat(2,:,1)
write(*,*) mat(3,:,1)

write(*,*) mat(1,:,2)
write(*,*) mat(2,:,2)
write(*,*) mat(3,:,2)

输出结果为:

 1  4  7
 2  5  8
 3  6  9

-1 -4 -7
-2 -5 -8
-3 -6 -9

若加上参数ORDER

integer,dimension(3,3,2) :: &
mat = reshape( &
     (/1,2,3,  &
       4,5,6   &
       7,8,9,  &
       
       -1,-2,-3, &
       -4,-5,-6, &
       -7,-8,-9/),(/3,3,2/),ORDER=(/3,2,1/))
       
write(*,*) mat(1,:,1)
write(*,*) mat(2,:,1)
write(*,*) mat(3,:,1)

write(*,*) mat(1,:,2)
write(*,*) mat(2,:,2)
write(*,*) mat(3,:,2)

输出结果为:

 1  3  5
 7  9 -2
-4 -6 -8

 2  4  6
 8 -1 -3
-5 -7 -9

建议直观写法为:

integer,dimension(2,3,3) :: &
mat = reshape( &
     (/1,2,3,  &
       4,5,6   &
       7,8,9,  &
       
       -1,-2,-3, &
       -4,-5,-6, &
       -7,-8,-9/),(/2,3,3/),ORDER=(/3,2,1/))
       
write(*,*) mat(1,1,:)
write(*,*) mat(1,2,:)
write(*,*) mat(1,3,:)

write(*,*) mat(2,1,:)
write(*,*) mat(2,2,:)
write(*,*) mat(2,3,:)

此时,输出结果为:

  1  2  3
  4  5  6
  7  8  9
 
 -1 -2 -3
 -4 -5 -6
 -7 -8 -9

##ORDER 的含义

没有ORDER时,数据按照column-major的方式填充。ORDER=(/1,2,3,…,n/)或者其排列组合(permutation),n为数组被reshape的维数。

matB = reshape(matA, [n1,n2,n3])

等价于

k = 0
do i3 = 1,n3
do i2 = 1,n2
do i1 = 1,n1
  k = k + 1
  matB(i1,i2,i3) = matA_seq(k) !matA_seq is a sequential view of matA
end do
end do
end do

加上order这个参数之后:

matB = reshape(matA, [n1,n2,n3], order=[2,3,1])

等价于

k = 0
do i1 = 1,n1
do i3 = 1,n3
do i2 = 1,n2
  k = k + 1
  matB(i1,i2,i3) = matA_seq(k)
end do
end do
end do

Similar Posts

下一篇 词汇

Comments