ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 03.05.2019
Просмотров: 691
Скачиваний: 5
1
Лекция 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
2
Версия
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 (который может отли-
чаться от приведенного ниже):
3
Поскольку далее мы разберем использование внешних процедур на
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
4
Непосредственно вызвать процедуру 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, два массива plhs, prhs и два скаляра nlhs, nrhs.
Листинг 6.2. Интерфейсная процедура mexFunction (файл mysumg.f)
subroutine mexFunction(nlhs, plhs, nrhs, prhs)
C
Интерфейсная процедура для sum
C
Описание типов аргументов
integer nlhs, nrhs, plhs (*), prhs (*)
C
Описание типов используемых функций из Matlab API
integer mxCreateFull, mxGetPr
C
Описание типов, указателей на используемые перемен-
ные
integer a_pr, b_pr,
с_рr
C
Описание типов используемых переменных
real*8 а, Ь, с
C
Получение указателей на первый и второй входные
C
аргументы, с которыми вызывается МЕХ-функция,
C
указатели хранятся в массиве prhs,
C
используется функция Matlab API
a_pr = mxGetPr(prhs(1))
b_pr = mxGetPr(prhs(2))
C
Запись значений первого и второго входных аргумен-
тов C с указателями а_рг и b_pr в переменные а и b
при
5
C
помощи процедуры Matlab API
call mxCopyPtrToReal8(a_pr,. a, 1)
call mxCopyPtrToReal8 (b_pr, b; 1)
C
Вызов процедуры sum, которая заносит в переменную с
C
сумму а и Ь
call sum(a, b,
с)
C
Создание выходного аргумента — вещественного мас-
сива
C
размера один на один при помощи функции Matlab API,
C
выходной аргумент есть указатель на массив
plhs(l) = mxCreateFull(1, 1, 0)
c_pr = mxGetPr(plhs(l))
C
Копирование значения с в массив с указателем с_р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, которая называется