Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция 11.pdf
Скачиваний:
31
Добавлен:
03.08.2018
Размер:
695.16 Кб
Скачать

Скомпилируем МЕХ-функцию при помощи команды 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