Как написать массив Matlab в двоичном виде, а затем прочитать его на Фортране? - PullRequest
2 голосов
/ 01 апреля 2019

Я чрезвычайно новичок в работе с Linux и Fortran, поэтому извиняюсь, если это основной вопрос.

Я пытаюсь сначала использовать fwrite для сохранения массива 60x150, который я создал в MATLABкак двоичный файл, который я затем пытаюсь загрузить и прочитать в Fortran как массив 60x150 снова.

В Matlab я использовал следующий код для сохранения массива.В этом случае имя массива в рабочей области - VP, и я сохраняю его в файл, который также называется «VP»:

>> fileID = fopen('VP','w');
>> fwrite(fileID,VP,'real*8');
>> fclose(fileID)

Затем я копирую файл из Windows вLinux-сервер SSH (я не уверен, что это актуально, но подумал, что стоит включить все, что может помочь).

Теперь, в моем коде на Фортране, у меня есть:

REAL(KIND=kind(1.0D0)), DIMENSION(60,150) :: VP
...
open(unit, file="LOCATION/VP", access = "stream", form = "unformatted", iostat = stat)
  if(stat /= 0) labort("Failed to open input file")
print *, wl
DO inx2=1,60
 DO inx=1,150
  print *,inx
  READ(unit,*) VP(inx2,inx)
 ENDDO
ENDDO
   print *,VP(1:10,1)

Теперь, когда я компилирую это, ошибок нет.Тем не менее, когда я запускаю его, он доходит точно до первого «READ (unit, *) VP (inx2, inx)» до сбоя (вы можете узнать по печати непосредственно перед ним).

Я получаюошибка:

forrtl: severe (257): formatted I/O to unit open for unformatted transfers, unit 111, file LOCATION/VP

Очевидно, я бы хотел, чтобы моим фактическим результатом была функция, выполняющаяся и заканчивающаяся теми же значениями в массиве.

Теперь я уже видел вопрос, особенноза это сообщение об ошибке, но на него ответили включением access="stream", который у меня уже есть.По сути, я не уверен, в какой момент я получаю что-то не так в этом процессе, любая помощь будет признательна.

Обратите внимание, что я попытался изменить точность в fwrite и поменять местами значения inx2 и inx(но это не сработало на первом, поэтому я не верю, что это ошибка).

Опять же, это может быть просто фундаментальной проблемой с моим пониманием Фортрана, потому что я был немного погружен в глубокий конецс проектом, над которым я работаю (большая часть кода, который я выполняю, была написана кем-то другим, я просто пытаюсь отредактировать небольшую его часть).


Редактировать:

Хорошо, спасибо большое, Франческа!Он обнаружил, что решение состоит в том, чтобы отредактировать строку в READ (unit) VP (inx2, inx), чтобы запустить ее.Однако значения, которые я получаю, запустив следующую строку кода:

print *,VP(1:10,1)

Только первое значение соответствует первому значению в моем исходном массиве matlab.При отображении VP (1: 5,1: 5) массива matlab других подходящих значений нет.Я мог бы понять это самостоятельно, но поскольку я уже здесь, я мог бы также спросить, поскольку я не полностью закончил оригинальный вопрос (хотя преодолел большое препятствие!).


Правка 2:

Хорошо, следующий бит, который мне удалось выяснить для себя.Если кто-то ищет, хотя это был просто случай обмена циклами DO.т.е.

DO inx=1,150
 DO inx2=1,60
  print *,inx
  READ(unit,*) VP(inx2,inx)
 ENDDO
ENDDO

Спасибо за помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...