我有一個21x21矩陣,其中大部分是持有的。某些元素需要用離散數字進行初始化。現有的解決方案是兩步初始化:首先將所有元素設置爲1,然後將選定元素重新分配給離散數字。矩陣初始化 - 如何避免重疊?
這是在一個傳統的FORTRAN77代碼中實現的,見下文,它可以很好地與gfortran-4.9(甚至沒有警告)編譯。
但是,我需要在運行gfortran-4.4的舊服務器上編譯它。由於「重疊初始化」,這與編譯器等替代工具(如f2c或g95)一起失敗。
現在,我怎樣才能重新編碼的問題,它避免了在特殊的BLOCK DATA程序單元中的這種重疊?我也認爲不建議使用英特爾Fortran編譯器,因爲初始化順序無法保證。
SUBROUTINE TEST
REAL*8 MAT(21,21)
COMMON /PARAMETERS/ MAT
END
BLOCK DATA
REAL*8 MAT(21,21)
COMMON /PARAMETERS/ MAT
DATA MAT/441*1/
DATA (MAT(1,J),J=2,19)/
& 0.971440D0, 0.940444D0, 1, 0.994435D0, 0.708218D0,
& 0.931484D0, 1.170520D0, 0.990124D0, 1, 1.019530D0,
& 0.989844D0, 1.002350D0, 0.999248D0, 1.107274D0, 0.880880D0,
& 0.880973D0, 0.881047D0, 0.881141D0/
DATA (MAT(2,J),J=3,14)/
& 1.022740D0, 0.970120D0, 0.945939D0, 0.744954D0, 0.902271D0,
& 1.084320D0, 1.005710D0, 1.021000D0, 0.944914D0, 0.973384D0,
& 0.959340D0, 0.945520D0/
DATA (MAT(3,J),J=4,19)/
& 0.925053D0, 0.940237D0, 0.849408D0, 0.955052D0, 1.281790D0,
& 1.5D0, 1, 0.904849D0, 0.897342D0, 0.724255D0,
& 0.859744D0, 0.855134D0, 0.831229D0, 0.808310D0, 0.784323D0,
& 0.745171D0/
DATA (MAT(4,J),J=5,14)/1.022540D0, 0.493148D0, 0.944871D0,
& 1.144440D0, 3*1, 1.013040D0, 1, 1.00532D0/
DATA (MAT(5,J),J=8,12)/1.034787D0, 3*1, 1.0049D0/
DATA (MAT(7,J),J=15,19)/1.008492D0, 1.010124D0, 1.011501D0,
& 1.012821D0, 1.014089D0/
DATA (MAT(8,J),J=9,12)/1.1D0, 1, 1.3D0, 1.3D0/
END
是的,您需要初始化每個「mat」元素(最多)一次。但在我看來,在隨後的'data'語句中給出的其他元素應該與'1'混合的元素的明顯答案可能並不是你所追求的。真的嗎? – francescalus
只需在塊數據中執行'DATA MAT/441 * 1 /',然後將其他所有內容移動到具有可執行指定的初始化子例程。 – agentp
如果我這樣做,儘管@agentp,我不會在第一個地方打擾塊數據。 [仍然是一個解決方案,說。] – francescalus