2013-04-24 84 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) 

矩陣的上三角不是「規則」(即要在因人而異指向元件之間的間隔),因此它不能在被指出。