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

时间:2013-04-24 22:10:07

标签: pointers matrix fortran fortran95

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

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

1 个答案:

答案 0 :(得分:4)

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

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不是简单的连续,那么事情会变得复杂。

您可以使用中间一级指针和指针边界重新映射来完成相同的操作。适用与假定大小方法相同的要求。

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

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