Как преобразовать один столбец в много столбцов на матрице, используя Fortran 90 - PullRequest
0 голосов
/ 27 июня 2018

У меня есть один столбец (im = 160648) и строка (jm = 1). Я хочу преобразовать это в матрицу с размерами (im = 344) и (jm = 467)

код моей программы

  program matrix
  parameter (im=160648, jm=1)
  dimension h(im,jm)
  integer::h
  open (1,file="Hasil.txt", status='old')
  open (2,file="HasilNN.txt", status='unknown')
  do i=1,jm
         read(1,*)(h(i,j)),j=1,jm)
  end do

  do i=1,im
         write(2,33)(h(i,j),j=1,jm)
  end do
33 format(1x, 344f10.6)
  end program matrix

код ошибки, который появляется, когда read(1,*)(h(i,j)),j=1,jm)

тип данных - плавающие данные.

1 Ответ

0 голосов
/ 27 июня 2018

Ваш цикл чтения:

  do i=1,jm
     read(1,*)(h(i,j)),j=1,jm)
  end do

Не должно ли do i=1,jm быть do i=1,im? Это означает, что в отформатированном текстовом файле Hasil.txt есть записи (строки) «im», которые предлагает ваш вопрос.

read(1,*)(h(i,j)),j=1,jm) подразумевает, что каждая запись (строка текста) имеет значения "jm", что составляет 1 значение на строку. Это то, как файл выглядит? (Неизвестное количество пустых строк будет пропущено с этим оператором read (lu,*) ....)

Вы, похоже, хотите записать эту информацию в другой файл; HasilNN.txt использует 33 format (1x, 344f10.6), что предполагает 3441 символ на строку, хотя ваш оператор записи будет записывать только 1 значение на строку (как jm = 1). Это будет очень длинная строка для текстового файла и, вероятно, будет трудно управлять вне программы. Если вы хотите сделать это, вы можете достичь этого с помощью подразумеваемого цикла do, например:

write(2,33) ((h(i,j),j=1,jm),I=1,im)

Несколько комментариев:

использование jm = 1 подразумевает, что каждая строка имеет только одно значение, которое может быть эквивалентно представлено как 1d-вектор "размерности h (im)", что отрицает необходимость в j

Файловые единицы с номерами 1 и 2 обычно являются зарезервированными номерами единиц для экрана / клавиатуры. Вам лучше использовать блоки 11 и 12.

При разработке этого кода вам необходимо обратиться к структуре записи в 2 файлах, так как можно использовать простой вектор. Вы можете контролировать длину строки в формате. Формат (1x, 8f10.6) создаст запись из 81 символа, которой будет намного легче управлять.

Дескриптор формата f10.6 также ограничивает диапазон значений, которыми вы можете управлять в файлах. Значения> = 1000 или <= -100 переполняют этот формат, а значения меньше 1.e-6 будут равны нулю. </p>

Как заметил @francescalus, вы объявили "h" как целое число, но используете дескриптор реального формата. Это приведет к «Ошибка: несоответствие форматных данных» и должно быть изменено на ожидаемое в файле.

Вы должны подумать, чего вы хотите достичь, и скорректировать код.

...