添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
  • Python Fortran Rosetta Stone
  • Putting Fortran’s object-related features to practical use
    • Object-based programming techniques
    • Object-oriented programming techniques
    • Performance and ease of use
    • 多维数组 #

      多维数组以列优先顺序存储。这意味着最左边(最里面)的索引连续寻址元素。从实际角度来看,这意味着数组切片 V(:, 1) 是连续的,而切片 V(1,:) 中元素之间的步幅是列的维度。这在将数组切片传递给期望处理连续数据的过程时很重要。

      根据应用程序的不同,考虑内存的位置是很重要的, 通常在多维度上执行操作时,顺序访问总是应该以统一长度增加。

      在以下示例中,将评估两组点之间的反距离。请注意,这些点连续存储在数组 xyz1 / xyz2 中,而最内层循环正在推进矩阵 a 的最左侧索引。

      subroutine coulomb_matrix(xyz1, xyz2, a)
        real(dp), intent(in) :: xyz1(:, :)
        real(dp), intent(in) :: xyz2(:, :)
        real(dp), intent(out) :: a(:, :)
        integer :: i, j
        do i = 1, size(a, 2)
          do j = 1, size(a, 1)
            a(j, i) = 1.0_dp/norm2(xyz1(:, j) - xyz2(:, i))
          end do
        end do
      end subroutine coulomb_matrix
      

      另一个例子是三维数组的第三维缩并:

      do i = 1, size(amat, 3)
        do j = 1, size(amat, 2)
          do k = 1, size(amat, 1)
            cmat(k, j) = cmat(k, j) + amat(k, j, i) * bvec(i)
          end do
        end do
      end do
      

      可以在数组绑定中重映射,以使用连续数组切片。 允许将高维数组用作低维数组,而不需要重新格式化数组, 这样避免了有可能创建临时数组。

      例如,可以使用矩阵向量操作来缩并三维数组的第三维:

      subroutine matmul312(amat, bvec, cmat)
        real(dp), contiguous, intent(in), target :: amat(:, :, :)
        real(dp), intent(in) :: bvec(:)
        real(dp), contiguous, intent(out), target :: cmat(:, :)
        real(dp), pointer :: aptr(:, :)
        real(dp), pointer :: cptr(:)
        aptr(1:size(amat, 1)*size(amat, 2), 1:size(amat, 3)) => amat
        cptr(1:size(cmat)) => cmat
        cptr = matmul(aptr, bvec)
      end subroutine matmul312
      
  •