Fortran - 重塑函数

  • 简述

    下表描述了重塑功能:
    功能 描述
    reshape(source, shape, pad, order) 它从给定数组源中的元素构造一个具有指定形状形状的数组。如果不包括焊盘,则源的大小必须至少是产品(形状)。如果包含 pad,它必须与 source 具有相同的类型。如果包含 order,它必须是一个与 shape 具有相同形状的整数数组,并且值必须是 (1,2,3,...,n) 的排列,其中 n 是 shape 中的元素数,它必须小于或等于 7。
    Example
    以下示例演示了该概念:
    
    program arrayReshape
    implicit none
    interface
       subroutine write_matrix(a)
       real, dimension(:,:) :: a
       end subroutine write_matrix
       end interface
       real, dimension (1:9) :: b = (/ 21, 22, 23, 24, 25, 26, 27, 28, 29 /)
       real, dimension (1:3, 1:3) :: c, d, e
       real, dimension (1:4, 1:4) :: f, g, h
       integer, dimension (1:2) :: order1 = (/ 1, 2 /)
       integer, dimension (1:2) :: order2 = (/ 2, 1 /)
       real, dimension (1:16) :: pad1 = (/ -1, -2, -3, -4, -5, -6, -7, -8, &
                                     & -9, -10, -11, -12, -13, -14, -15, -16 /)
       c = reshape( b, (/ 3, 3 /) )
       call write_matrix(c)
       d = reshape( b, (/ 3, 3 /), order = order1)
       call write_matrix(d)
       e = reshape( b, (/ 3, 3 /), order = order2)
       call write_matrix(e)
       f = reshape( b, (/ 4, 4 /), pad = pad1)
       call write_matrix(f)
       g = reshape( b, (/ 4, 4 /), pad = pad1, order = order1)
       call write_matrix(g)
       h = reshape( b, (/ 4, 4 /), pad = pad1, order = order2)
       call write_matrix(h)
    end program arrayReshape
    subroutine write_matrix(a)
       real, dimension(:,:) :: a
       write(*,*)
       
       do i = lbound(a,1), ubound(a,1)
          write(*,*) (a(i,j), j = lbound(a,2), ubound(a,2))
       end do
    end subroutine write_matrix
    
    当上面的代码被编译并执行时,它会产生以下结果:
    
    21.0000000  24.0000000  27.0000000    
    22.0000000  25.0000000  28.0000000    
    23.0000000  26.0000000  29.0000000    
    21.0000000  24.0000000  27.0000000    
    22.0000000  25.0000000  28.0000000    
    23.0000000  26.0000000  29.0000000    
    21.0000000  22.0000000  23.0000000    
    24.0000000  25.0000000  26.0000000    
    27.0000000  28.0000000  29.0000000    
    21.0000000  25.0000000  29.0000000   -4.00000000    
    22.0000000  26.0000000  -1.00000000  -5.00000000    
    23.0000000  27.0000000  -2.00000000  -6.00000000    
    24.0000000  28.0000000  -3.00000000  -7.00000000    
    21.0000000  25.0000000  29.0000000   -4.00000000    
    22.0000000  26.0000000  -1.00000000  -5.00000000    
    23.0000000  27.0000000  -2.00000000  -6.00000000    
    24.0000000  28.0000000  -3.00000000  -7.00000000    
    21.0000000  22.0000000  23.0000000   24.0000000    
    25.0000000  26.0000000  27.0000000   28.0000000    
    29.0000000  -1.00000000 -2.00000000  -3.00000000    
    -4.00000000 -5.00000000 -6.00000000  -7.00000000