- •Конфигурирование MATLAB Compiler
- •Простой пример сложения двух чисел
- •Создание МЕХ-файла, использующего программу на Фортране
- •Объявление функций и локальных переменных
- •Чтение входного массива
- •Выполнение вычислений
- •Копирование полученного результата в выходную величину
- •Работа с комплексными переменными
Скомпилируем МЕХ-функцию при помощи команды mex
>> mex QS12R_wrapper.F QS12R.FOR UTQS10.FOR
Теперь запуская на выполнение файл Test.m, можем получить искомый результат
Работа с комплексными переменными
Использование процедуры на Fortran, оперирующей с комплексными переменными, требует соответствующей организации обмена данными в интерфейсной процедуре. Кроме функции mxGetPr, придется использовать mxGetPi, которая возвращает указатель на комплексную часть первого элемента массива. Получение и запись значения переменной по указателю производится при помощи процедур mxCopyPtrToComplex16 и mxCopyComplex16ToPtr, причем входнымаргументом,кромеуказателяна вещественную, является еще и указатель на комплексную часть. При созданиимассивафункцией mxCreateFull следуетзадатьединицувкачестветретьего аргумента, поскольку предполагается хранение комплексных чисел. Текст исходной процедуры на Fortran приведен в листинге 6.3, а отвечающая ей интерфейсная процедура – в листинге 6.4.
Листинг 6.3. Процедура сложения комплексных чисел (файл myсsum.f)
subroutine sum(a, b, с)
СПроцедура sum складывает два комплексных числа
complex*16 а, b, с
с = а + b end
Листинг 6.4. Интерфейсная процедура mexFunction (файл myсsumg.f) 19
subroutine mexFunction (nlhs, plhs, nrhs,
prhs)
C Интерфейсная процедура для sum C Описание типов аргументов
integer nlhs, nrhs, plhs(*), prhs(*)
C Описание типов используемых функций из Matlab
API
integer mxCreateFull, mxGetPr, mxGetPi
C Описание типов указателей на используемые переменные
|
integer a_pr, b_pr, c_pr, a_pi, b_pi, c_pi |
C Описание типов используемых переменных |
|
|
complex*16 a, b, с |
C Получение указателей на вещественные и мнимые |
|
части |
первого и второго входных аргументов, с которыми |
C |
|
C |
вызывается МЕХ-функция, указатели хранятся в |
массиве
Сprhs, используются функции Matlab API a_pr = mxGetPr(prhs(l))
a_pi = mxGetPi(prhs(1)) b_pr= mxGetPr (prhs (2)) b_pi = mxGetPi (prhs (2))
СЗапись значений первого и второго входных аргу-
ментов
Сс указателями a_pr, a_pi и b_pr, b_pi в пере-
менные
Са и b при помощи процедуры Matlab API
call mxCopyPtrToComplex16 (a_pr, a_pi, a, 1) call mxCopyPtrToCompiex16 (b_pr, b_pi, b, 1)
С Вызов процедуры sum, которая заносит в
Спеременную с сумму а и b call sum(a,b,c)
ССоздание выходного аргумента — комплексного мас-
сива
С размера один на один при помощи функции Matlab
API,
Свыходной аргумент есть указатель на массив plhs(l) = mxCreateFull (1, 1, 1)
c_pr = mxGetPr(plhs(1)) c_pi = mxGetPi (plhs (1))
СКопирование значения с в массив с указателями
с_рг
С(на вещественную часть) и c_pi (на мнимую часть)
20
call mxCopyComplex16ToPtr (с, c_pr, c_pi, 1) end
Создадим в текущем каталоге Matlab файлы mycsum.f и mycsumg.f и скомпилируем МЕХ-функцию при помощи команды mex (подробности описаны в предыдущем разделе):
>> mex mycsum.f mycsumg.f
Убедимся в том, что полученная МЕХ-функция mycsum работает
верно
>> s=mycsum(l+2i, 3-5i) s =
4.0000 - 3.0000i
Разумеется,mycsum правильновычисляетсуммунетолькокомплексных, но и вещественных аргументов:
>> s=mycsum(l, 3) s =
4
21