Fortran - 操作函数

  • 简述

    操作函数是移位函数。shift 函数返回数组的形状不变,但移动元素。
    序号 功能说明
    1
    cshift(array, shift, dim)
    如果 shift 为正,则通过向左移动位置来执行循环移动,如果为负,则向右移动。如果数组是一个向量,则移位是以自然的方式完成的,如果它是一个更高等级的数组,那么移位是在维度 dim 的所有部分中。如果 dim 丢失,它被认为是 1,在其他情况下,它必须是 1 和 n 之间的标量整数(其中 n 等于 array 的秩)。参数 shift 是一个标量整数或秩为 n-1 的整数数组,并且与数组的形状相同,除了沿维度 dim (由于较低的秩而被删除)。因此,不同的部分可以在不同的方向和不同数量的位置上移动。
    2
    eoshift(array, shift, boundary, dim)
    这是结束班次。如果 shift 为正则执行左移,如果为负则执行右移。而不是移出的元素,新元素取自边界。如果 array 是一个向量,则移位是以自然的方式进行的,如果它是一个更高等级的数组,则所有部分的移位都是沿着维度 dim。如果 dim 缺失,则将其视为 1,在其他情况下,它必须具有介于 1 和 n 之间的标量整数值(其中 n 等于数组的秩)。如果数组的秩为 1,则参数 shift 是一个标量整数,在另一种情况下,它可以是一个标量整数或秩为 n-1 的整数数组,并且具有与数组数组相同的形状,除了沿维度 dim(已删除因为等级低)。
    3
    transpose (matrix)
    它转置了一个矩阵,该矩阵是一个秩为 2 的数组。它替换了矩阵中的行和列。
  • 例子

    以下示例演示了该概念 -
    
    program arrayShift
    implicit none
       real, dimension(1:6) :: a = (/ 21.0, 22.0, 23.0, 24.0, 25.0, 26.0 /)
       real, dimension(1:6) :: x, y
       write(*,10) a
       
       x = cshift ( a, shift = 2)
       write(*,10) x
       
       y = cshift (a, shift = -2)
       write(*,10) y
       
       x = eoshift ( a, shift = 2)
       write(*,10) x
       
       y = eoshift ( a, shift = -2)
       write(*,10) y
       
       10 format(1x,6f6.1)
    end program arrayShift
    
    编译并执行上述代码时,会产生以下结果 -
    
    21.0  22.0  23.0  24.0  25.0  26.0
    23.0  24.0  25.0  26.0  21.0  22.0
    25.0  26.0  21.0  22.0  23.0  24.0
    23.0  24.0  25.0  26.0   0.0   0.0
    0.0    0.0  21.0  22.0  23.0  24.0
    
  • 例子

    以下示例演示了矩阵的转置 -
    
    program matrixTranspose
    implicit none
       interface
          subroutine write_matrix(a)
             integer, dimension(:,:) :: a
          end subroutine write_matrix
       end interface
       integer, dimension(3,3) :: a, b
       integer :: i, j
        
       do i = 1, 3
          do j = 1, 3
             a(i, j) = i
          end do
       end do
       
       print *, 'Matrix Transpose: A Matrix'
       
       call write_matrix(a)
       b = transpose(a)
       print *, 'Transposed Matrix:'
       
       call write_matrix(b)
    end program matrixTranspose
    subroutine write_matrix(a)
       integer, 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
    
    编译并执行上述代码时,会产生以下结果 -
    
    Matrix Transpose: A Matrix
    1  1  1
    2  2  2
    3  3  3
    Transposed Matrix:
    1  2  3
    1  2  3
    1  2  3