ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 03.05.2019

Просмотров: 691

Скачиваний: 5

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

 

Лекция 6 Связь Matlab c программами на языке Fortran 

Довольно часто встречается ситуация, когда имеются модули, напи-

санные на 

С или Fortran, и требуется использовать их в приложении Matlab. 

Пакет Matlab предоставляет возможность вызова внешних программ благо-

даря Application Program Interface (API), то есть программному интерфейсу 

приложения. Функции Matlab API делятся на две категории: функции, обес-

печивающие создание и доступ к массивам Matlab, и функции, позволяю-

щие оперировать в рабочей среде Matlab. Создание МЕХ-файлов из проце-

дур Fortran заключается в написании интерфейсной процедуры с использо-

ванием функций Matlab API и последующей генерации МЕХ-файла при по-

мощи команды mex. Генерация МЕХ-файлов из процедур Fortran требует 

установки  одного  из  компиляторов  Фортрана.  Встроенный  компилятор 
Fortran 

не входит в пакет Matlab, в отличие от компилятора Lcc для прило-

жений на С. Производители довольно жестко увязывают тип и версию ком-

пилятора с версией самой программы Matlab. Для выполнения генерации 

МЕХ-файлов необходим также компоновщик (редактор связей), который в 

состав компилятора не входит. Вот рекомендации фирмы MathWorks по вы-

бору компилятора и среды, в которой происходит компоновка выходного 

файла 

 

Версия 

MATLAB 

Версия компилятора 

Fortran 

Среда компоновки 

R2008a 

Intel Visual Fortran 9.1 

Intel Visual Fortran 10.1 

Microsoft Visual Studio 2005 
Professional 

Microsoft Visual Studio 2008 
Professional 

R2010b 

Intel Visual Fortran 10.1 

Intel Visual Fortran 11.1 

Microsoft Visual Studio 2005 
SP1 Professional 

Microsoft Visual Studio 2008 
SP1 Professional 

Microsoft Visual Studio 2010 
Professional 

R2012b 

Intel Visual Fortran 
Composer XE 2011 

Microsoft Visual Studio 2008 
SP1 Professional 

Microsoft Visual Studio 2010 
Professional 

R2015b 

Intel Visual Fortran 
Composer XE 2011 

Microsoft Visual Studio 2008 
SP1 Professional 


background image

 

Версия 

MATLAB 

Версия компилятора 

Fortran 

Среда компоновки 

Intel Visual Fortran 
Composer XE 2013 

 

Microsoft Visual Studio 2010 
SP1 Professional 

Microsoft Visual Studio 2012 
Professional 

R2016a 

 

Intel Visual Fortran 
Composer XE 2013 

Intel Parallel Studio XE 
2015 for Fortran 

Intel Parallel Studio XE 
2016 for Fortran 

Microsoft Visual C++ 2010 
Professional SP1 

Microsoft Visual C++ 2012 
Professional 

Microsoft Visual C++ 2013 
Professional 

Microsoft Visual C++ 2015 
Professional 

Конфигурирование MATLAB Compiler 

Перед  компиляцией  программ  необходимо  произвести  некоторые 

установки, связанные с выбором компилятора. Если компилятор не выбран, 

то по умолчанию используется встроенный Lcc для приложений на С. При-

ступим  к  конфигурированию  MATLAB  Compiler.  Наберем  в  командной 

строке 

 

Запускается программа с интерфейсом из командной строки и предла-

гается автоматический поиск всех компиляторов, имеющихся на компью-

тере. 

 

Введите у (подтверждение) на запрос об автоматическом поиске. По-

является список доступных компиляторов С и Fortran (который может отли-

чаться от приведенного ниже): 

 
 
 
 


background image

 

Поскольку далее мы разберем использование внешних процедур на 

Fortran, то следует ввести номер соответствующего компилятора (в данном 

случае первый) и нажать <Enter>. Далее предлагается подтвердить сделан-

ный выбор: 

 

Вводим у и нажимаем <Enter>. Конфигурирование MATLAB Compiler 

завершено.  

Простой пример сложения двух чисел 

Начнем изучение создания МЕХ-файлов с самого простого примера. 

Предположим, что из среды Matlab требуется вызвать процедуру sum, напи-

санную на Fortran. Процедура sum складывает два вещественных числа 

а и 

b 

и записывает результат в 

с (листинг 6.1). Будем считать, что процедура 

sum 

содержится в файле mysum.f

 

Листинг 6.1. Исходная процедура sum на Fortran (файл mysum.f) 
    

      subroutine sum(a, b, c) 

Процедура sum складывает два вещественных числа a и b 

и возвращает результат в с 

      real*8 a, b, c 

      c = a + b 

      end 


background image

 

 

Непосредственно  вызвать  процедуру  sum  из  среды  Matlab,  разуме-

ется, не удастся. Необходимо написать интерфейсную процедуру на Fortran 

с использованием функций Matlab API, которая будет точкой входа МЕХ-

файла mysum.mexw32 (если используются 64-битные версии программ, то 

расширение файла будет .mexw64) при вызове функции mysum из среды 

Matlab. Интерфейсная процедура должна называться mexFunction и иметь 

четыре аргумента типа integer*4

nrhs – 

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

ращение к МЕХ-функции mysum из среды Matlab; 

prhs – 

массив указателей на входные аргументы mysum

nlhs – 

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

ращение к МЕХ-функции mysum из среды Matlab; 

plhs — 

массив указателей на выходные аргументы mysum

Обмен данными между процедурой sum и средой Matlab посредством 

интерфейсной процедуры mexFunction осуществляется только при помощи 

перечисленных аргументов. Для выделения данных из prhs и занесения ре-

зультата  в plhs предназначены специальные функции Matlab  API. Интер-

фейсная для sum процедура mexFunction приведена в листинге 6.2, назовем 

файл с ней mysumg.f. Итак, интерфейсная процедура имеет четыре пара-

метра типа.integer*4, два массива plhsprhs и два скаляра nlhsnrhs

 

Листинг 6.2. Интерфейсная процедура mexFunction (файл mysumg.f) 

 
      subroutine mexFunction(nlhs, plhs, nrhs, prhs) 

Интерфейсная процедура для sum  

Описание типов аргументов 

      integer nlhs, nrhs, plhs (*), prhs (*)  

Описание типов используемых функций из Matlab API 

      integer mxCreateFull, mxGetPr 

Описание типов, указателей на используемые перемен-

ные       
      integer a_pr, b_pr, 

с_рr 

Описание типов используемых переменных 

      

real*8 а, Ь, с 

Получение указателей на первый и второй входные  

аргументы, с которыми вызывается МЕХ-функция, 

указатели хранятся в массиве prhs, 

используется функция Matlab API 

      a_pr = mxGetPr(prhs(1)) 
      b_pr = mxGetPr(prhs(2)) 

Запись значений первого и второго входных аргумен-

тов C с указателями а_рг и b_pr в переменные а и b 

при  


background image

 

помощи процедуры Matlab API 

      call mxCopyPtrToReal8(a_pr,. a, 1) 
      call mxCopyPtrToReal8 (b_pr, b; 1) 

Вызов процедуры sum, которая заносит в переменную с  

сумму а и Ь 

      call sum(a, b, 

с) 

Создание выходного аргумента — вещественного мас-

сива  

размера один на один при помощи функции Matlab API,  

выходной аргумент есть указатель на массив 

      plhs(l) = mxCreateFull(1, 1, 0) 
      c_pr = mxGetPr(plhs(l)) 

Копирование значения с в массив с указателем с_рr 

      call mxCopyReal8ToPtr(

с, с_рr, 1) 

      end 

 

В  mexFunction  будут  использоваться  две  функции  Matlab  API: 

mxCreateFull 

и mxGetPr, возвращающие значения типа integer*4. Функция 

mxCreateFull 

выделяет память под массив и возвращает указатель на мас-

сив. В рассматриваемом примере этот массив служит для возврата резуль-

тата (суммы двух чисел) в рабочую среду Matlab и поэтому имеет размеры 

один на один. Функция mxGetPr служит для получения указателя на первый 

вещественный элемент в массиве. Целочисленные переменные 

а_ргb_рг и 

с_рг понадобятся для хранения указателей на массивы, содержащие вход-

ные  аргументы  и  выходной  аргумент.  Для  записи  значений  аргументов 

определены вещественные переменные 

аb и с

Следует  отметить,  что  при  наборе  процедур  вне  редактора  среды 

Fortran 

следует учитывать, что первые шесть позиций в начале строки от-

водятся под метки, а операторы начинаются с седьмой позиции. Если пре-

небречь этим правилом, то при компиляции возникнут ошибки. Сообщения 

об ошибках выводятся в командное окно Matlab. 

Процедура mexFunction начинается с получения указателей на пер-

вые (а данном случае и единственные) вещественные элементы массивов, 

на которые указывают первый и второй элементы prhs. Важно понимать, 

что массив prhs содержит указатели на массивы специального типа mxAr-
ray

Данный тип определен в Matlab API и является единственно возмож-

ным  способом  обмена  данными  между  средой  Matlab  и  процедурой  на 
Fortran

. Все данные Matlab передаются при помощи mxArray, в зависимо-

сти  от  типа  передаваемых  данных  следует  применять  соответствующие 

функции для извлечения указателей. Для извлечения указателей на веще-

ственные массивы содержащие значения входных аргументов МЕХ-функ-

ции, например a_pr f bpr, используется функция mxGetPr Matlab API. 

Следующий шаг состоит в записи значений входных аргументов в ве-

щественные переменные 

а и b. Процедура Matlab API, которая называется