Pointers 如何将指针指定给矩阵的对角线?

Pointers 如何将指针指定给矩阵的对角线?,pointers,matrix,fortran,fortran95,Pointers,Matrix,Fortran,Fortran95,我有一个矩阵,比如说REAL*8matrix(100100),我想从主对角线或上三角形中创建一个指针。怎么做 其目的是以干净的“命名”方式轻松访问这些元素。对于主对角线,您可以小心地执行以下操作: PROGRAM diagonal IMPLICIT NONE REAL, TARGET :: array(4,4) REAL, POINTER :: ptr(:) INTEGER :: i array = RESHAPE([(i,i=1,SIZE(array))], SHAPE(a

我有一个矩阵,比如说
REAL*8matrix(100100)
,我想从主对角线或上三角形中创建一个指针。怎么做


其目的是以干净的“命名”方式轻松访问这些元素。

对于主对角线,您可以小心地执行以下操作:

PROGRAM diagonal
  IMPLICIT NONE
  REAL, TARGET :: array(4,4)
  REAL, POINTER :: ptr(:)
  INTEGER :: i
  array = RESHAPE([(i,i=1,SIZE(array))], SHAPE(array))
  CALL get_diagonal_pointer(array, SIZE(array, 1), ptr)
  PRINT "(*(G0,:,','))", ptr
CONTAINS
  SUBROUTINE get_diagonal_pointer(arr, n, ptr)
    REAL, INTENT(IN), TARGET :: arr(*)
    INTEGER, INTENT(IN) :: n
    REAL, INTENT(OUT), POINTER :: ptr(:)
    !****
    ptr => arr(1:n*n:n+1)
  END SUBROUTINE get_diagonal_pointer
END PROGRAM diagonal
但是请注意,主程序中的
array
只是连续的,并且具有TARGET属性。如果
array
不是简单地连续的,那么事情就会变得。。。复杂

您可以使用中间秩1指针和指针边界重新映射来完成相同的操作。适用与假设规模方法相同的要求

REAL, POINTER :: tmp(:)
tmp(1:SIZE(array)) => array
ptr => tmp(::SIZE(array,1)+1)

矩阵的上三角形不是“规则的”(要指向的元素之间的间距不同),因此不能指向它。

对于主对角线,请小心,可以执行以下操作:

PROGRAM diagonal
  IMPLICIT NONE
  REAL, TARGET :: array(4,4)
  REAL, POINTER :: ptr(:)
  INTEGER :: i
  array = RESHAPE([(i,i=1,SIZE(array))], SHAPE(array))
  CALL get_diagonal_pointer(array, SIZE(array, 1), ptr)
  PRINT "(*(G0,:,','))", ptr
CONTAINS
  SUBROUTINE get_diagonal_pointer(arr, n, ptr)
    REAL, INTENT(IN), TARGET :: arr(*)
    INTEGER, INTENT(IN) :: n
    REAL, INTENT(OUT), POINTER :: ptr(:)
    !****
    ptr => arr(1:n*n:n+1)
  END SUBROUTINE get_diagonal_pointer
END PROGRAM diagonal
但是请注意,主程序中的
array
只是连续的,并且具有TARGET属性。如果
array
不是简单地连续的,那么事情就会变得。。。复杂

您可以使用中间秩1指针和指针边界重新映射来完成相同的操作。适用与假设规模方法相同的要求

REAL, POINTER :: tmp(:)
tmp(1:SIZE(array)) => array
ptr => tmp(::SIZE(array,1)+1)

矩阵的上三角形不是“规则的”(要指向的元素之间的间距不同),因此不能指向它。

请注意,公认答案的第二部分使用Fortran 2003功能。(即使是第一部分,但可以避免)。嗨,弗拉基米尔,谢谢你的评论。我只是在编辑前面的问题,以使自己不受阻碍。不能再发布问题了。因此,我只是在提高前面问题的英语水平。请注意,公认答案的第二部分使用了Fortran 2003的功能。(即使是第一部分,但可以避免)。嗨,弗拉基米尔,谢谢你的评论。我只是在编辑前面的问题,以使自己不受阻碍。不能再发布问题了。所以我只是在提高前面问题的英语水平。