2014-02-14 2 views
2

Я только начинаю в Фортране, и я пытаюсь создать очень простую матрицу Гильберта 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

В дополнение к ответам: не используйте переменные 'real' для' DO '. – 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 

Инициализация i и j не требуется, потому что цикл делает это автоматически.

Ваша инициализация a(i,4) = 0 должна быть a(i,j) = 0, но это необязательно. Следуя совету M.S.B., вы можете сделать эту инициализацию в начале с a = 0, но в этом случае это не обязательно.

Очень важно: код вашего формата не показывает дробную часть цифр.

И: В соответствии с более новыми стандартами переменные цикла (i и j в этом случае) должны быть целыми числами, поскольку поведение действительных чисел является неоднозначным.

+0

Большое спасибо за ваше время, моя линия формата меня поддерживала. Сейчас она работает, и я наконец смогу вычислить ее детерминанту. – user3311029

Смежные вопросы