Как преобразовать один столбец в много столбцов на матрице, используя Fortran 90

У меня есть один столбец (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 ответ

Решение

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

  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 будут равны нулю.

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

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

Другие вопросы по тегам