2013-04-24 82 views
1

我有一个矩阵说REAL*8 MATRIX(100,100),我想创建一个指标,只是主对角线或上三角形。怎么做?如何分配指向矩阵对角线的指针?

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

+0

请注意,接受的答案的第二部分使用了Fortran 2003功能。 (即使是第一部分,但这些都可以避免)。 – 2016-05-19 19:35:35

+0

嗨弗拉基米尔,感谢您的评论。我只是编辑以前的问题,让自己畅通无阻。无法发布问题了。所以我只是在以前的问题上改进英文。 – Jagte 2016-05-19 19:38:33

回答

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) 

矩阵的上三角不是“规则”(即要在因人而异指向元件之间的间隔),因此它不能在被指出。