1

REAL*8 MATRIX(100,100)主対角線または上三角形だけからポインターを作成したいという行列があります。どうやってするか?

目的は、クリーンな「名前付き」の方法でこれらの要素に簡単にアクセスすることです。

4

1 に答える 1

5

主な対角線については、注意して、次のようなことができます。

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)

行列の上三角は「規則的」ではないため (ポイントしたい要素間の間隔はさまざまです)、ポイントすることはできません。

于 2013-04-25T00:37:56.737 に答える