2014-02-14 51 views
2

我剛剛開始在Fortran中,我試圖生成一個非常簡單的4x4希爾伯特矩陣,但我的輸出是一堆零,除了1開頭。任何幫助將非常感激。生成希爾伯特矩陣Fortran

下面的代碼:

PROGRAM HILBERT 
IMPLICIT NONE 
REAL :: a(4,4) 
REAL :: i, j 

!Initialise matrix a with non zeroes 
i = 1.0 
j = 1.0 

DO i = 1,4,1 
a(i,4) = 0.0 
DO j = 1,4,1 

a=1.0/(i+j-1.0)  !Attempt to generate Hilbert matrix 

    WRITE(6,'(f3.0)',advance='no') a(i,j) !formatted output 

END DO 
    write(6,*) !formatted output 
END DO 

END PROGRAM HILBERT 
+3

除了答案:不要使用'真正'的變量的'DO's。 – francescalus

回答

1

array=scaler套陣列到定標器的所有元素。嘗試a(i,j)=...

0

除了更正@ M.S.B。和@Stefan指出,還可以更有效地(在代碼和錯誤傾向而言)創建具有forall聲明這樣一個矩陣:

program hilbert 
    implicit none 
    real a(4,4) 

    integer i,j 

    forall(i=1:4, j=1:4) a(i,j) = 1/(i+j-1.0) 

! As @Stefan says, the format is an important part of the answer 
    print '(4F8.5)', a 

end program hilbert 
+0

感謝您向我介紹Forall聲明,看起來像是一個正確的節省時間! – user3311029

2

從給定的代碼開始:

PROGRAM HILBERT 
IMPLICIT NONE 
REAL :: a(4,4) 
REAL :: i, j 


DO i = 1,4 ! The third argument is not necessary if equal to 1 
DO j = 1,4 
    a(i,j) = 1.0/(i+j-1.0) ! generate Hilbert matrix 

    WRITE(6,'(f8.5)',advance='no') a(i,j) !formatted output 
END DO 
write(6,*) !formatted output 
END DO 

END PROGRAM HILBERT 

ij的初始化不是必需的,因爲循環會自動執行此操作。

a(i,4) = 0的初始化應爲a(i,j) = 0,但這不是必需的。按照M.S.B的建議,你可以在開始時用a = 0進行初始化,但在這種情況下這不是必需的。

一個非常重要的事情:您的格式代碼不顯示數字的小數部分。

並且:根據較新的標準,循環變量(在這種情況下爲ij)必須是整數,因爲實數的行爲是不明確的。

+0

非常感謝您的時間,我的格式線讓我回來了。她現在開始運轉,我終於可以開始計算她的決定因素了。 – user3311029