Чтение двумерного массива Matlab в файл intel-fortran и запись из intel-fortran в файл Matlab

Я использую Intel Fortran с Visual Studio 2008 SP1.

Мой главный вопрос: я хотел бы прочитать 2D-массив из файла Matlab .mat в фортран. Кроме того, сохраните вывод 2D-матриц Fortran в предпочтительном файле .mat, так как в настоящее время я могу сохранить его в текстовый файл, используя:

write(unit = #, <linelength>F22.8>),matrixname

Эта строка работает, но я не уверен, что потеряю свою двойную точность. Если я не потеряю точность, я смогу ее придерживаться, иначе мне понадобится помощь. И мне понадобится только способ чтения из файла Matlab в intel-fortran с сохранением точности. В этих массивах нет символов, они имеют числовые значения.

Мне нужно сохранить точность, так как я работаю со сферическими функциями, а они могут сильно расходиться.


person user9255443    schedule 23.01.2018    source источник
comment
Mathworks публикует обширную и в целом очень хорошую документацию по своим продуктам. Я уверен, что при поиске вы найдете ссылки, показывающие, как читать и писать матовые файлы с помощью программ на Фортране. Я также уверен, что документация будет настолько подробной и конкретной, насколько вы захотите.   -  person High Performance Mark    schedule 23.01.2018
comment
Если вы используете allocatable, это Fortran 90 или новее. Добро пожаловать. Пройдите тур и прочитайте Как Спросите. Сайт хорош для ответов на конкретные вопросы. Но ваш вопрос не очень конкретный, он просит написать для вас целый туториал. Он также содержит несколько отдельных пунктов. Я думаю, что это слишком широко для этого сайта. Постарайтесь сделать его короче и конкретнее. Я уже сделал его несколько короче для вас.   -  person Vladimir F    schedule 23.01.2018
comment
отвечая на одну часть вопроса, да, вы теряете точность, если используете текстовый файл для передачи данных.   -  person agentp    schedule 23.01.2018


Ответы (1)


внутренний «.mat» Matlab сжат «возможно» или «возможно, не» в зависимости от версии. Я думаю, вы не хотите использовать это для переносимой передачи файлов. (Попытавшись найти хорошую документацию по этому вопросу, я задаюсь вопросом, был ли @HPM саркастичным в своем комментарии..)

Простой подход для одного массива заключается в простом обмене как необработанном двоичном файле.

Пример записи в матлабе:

a=[1. 2. ; 3. 4. ]
fileID = fopen('test.bin','w');
fwrite(fileID,a,'double');
fclose(fileID);

затем в фортране

implicit none
double precision a(2,2)
open(unit=100,'test.bin',access='stream',form='unformatted')
read(100)a

обратите внимание, что здесь данные на самом деле «плоские», программа чтения должна знать размерность массива. Вы, конечно, можете написать размеры в файл, если вам нужно.

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

person agentp    schedule 23.01.2018
comment
Интересно, был ли @HPM саркастичен в своем комментарии Вовсе нет. - person High Performance Mark; 23.01.2018