Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Антонюк и др.doc
Скачиваний:
48
Добавлен:
07.11.2018
Размер:
32.99 Mб
Скачать

Программные интерфейсы

В модулях-расширениях MATLAB (MEX-файлах) для обмена параметрами всех типов с вычислительной средой MATLAB используется ровно одна структура, хотя и чрезвычайно гибкая. Называется эта структура – mxArray (Matlab Extension Array).

Все типы данных MATLAB – массивы, скаляры, строки, клеточные и многомерные массивы, объекты и т.п. выражаются при помощи этой единственной структуры.

Программный интерфейс создаваемой динамической библиотеки тоже достаточно прост. Должна быть обязательно экспортирована единственная функция с двумя параметрами – входным массивом структур mxArray и выходным массивом структур mxArray. Соответственно, задача модуля расширения заключается в том, чтобы на основе входной информации создать выходной массив.

Прототип интерфейсной функции объявлен в заголовочном файле \matlab\extern\include\mex.h следующим образом:

void mexFunction(

int nlhs, /* количество выходных параметров */

mxArray *plhs[],/*массив указателей на вых.параметры*/

int nrhs, /* количество входных параметров */

/**/

const mxArray *prhs[]/*массив указ-ей на вход.пар-ры */

);

Отметим, что в английской компьютерной литературе входные и выходные параметры называются “left hand side parameters” (параметры слева от знака присваивания) и “right hand side parameters” (параметры справа от знака присваивания). Сокращения этих названий вошли в имена параметров интерфейсной функции.

Рассмотрим структуру mxArray. Помимо прочих, она содержит следующие поля:

  • имя переменной среды MATLAB в текстовом виде,

  • размерность данной переменной,

  • ее тип,

  • является ли она вещественной или комплексной (в случае комплексной переменной создаются отдельно вектора вещественной и мнимой частей),

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

Матрицы (двумерные массивы) являются подмножеством mxArray, для чего в этой структуре предусмотрены поля pr (вещественная часть) и pi (мнимая часть). Каждое из этих полей представляет собой одномерный массив, содержащий элементы матриц (double-числа) поколоночно – сначала все элементы первого столбца матрицы, затем – второго и т.д.

Так как извлечение требуемого типа данных для обработки напрямую из общей структуры может быть сложным (из-за наличия разного рода флажков, типов, размерностей и т.п.), то MATLAB содержит специальную библиотеку вспомогательных функций, облегчающую работу с тем или иным типом данных внутри расширения MATLAB. Все функции этой библиотеки, работающие с массивом mxArray, имеют префикс mx (напр. mxGetPr()).

Другой набор функций в этой же библиотеке имеет префикс mex (напр. mexPrintf()). В отличие от предыдущих, они осуществляют ту или иную операцию в самой среде MATLAB, например – печатают строку текста. Никакая из этих функций не осуществляет прямого доступа к полям mxArray.

Оба указанных набора функций содержатся в динамических библиотеках, находящихся в каталоге \matlab\bin. Эти библиотеки следует подключить к проекту. Не забывайте также включать заголовочный файл mex.h во все исходные файлы вашей программы, в которых используются вызовы функций библиотеки MATLAB или ее типы данных.

В заключение, еще раз подчеркнем, что mxArray в состоянии описать любую переменную MATLAB, что и дает возможность написать расширение, работающее с любым типом данных.