Как преобразовать один столбец в много столбцов на матрице, используя 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" как целое число, но используете дескриптор реального формата. Это приведет к "Ошибка: несоответствие форматных данных" и должно быть изменено на то, что ожидается в файле.
Вы должны учитывать то, что вы хотите достичь и скорректировать код.