- •Интерфейс.
- •Управление памятью.
- •Работа с m-файлами.
- •Резервирование памяти.
- •Матричные операции.
- •Пример.
- •Постановка задачи.
- •Решение.
- •Литература:
- •Предпосылки.
- •Установка компонента matlab Compiler.
- •Точка входа.
- •Анализ аргументов.
- •Связывание с локальными переменными входных и выходных аргументов.
- •Тело программы.
- •Заключение.
Точка входа.
Каждый MEX–файл имеет точку входа — часть кода, с которой начинается выполнение программы. Такой точкой является функция mexFunction:
void mexFunction(
int nlhs,
mxArray *plhs[],
int nrhs,
const mxArray *prhs[]
)
{
// дальнейший код на C/C++
}
Переменные nlhs и nrhs содержат соответственно число выходных и входных переменных (аргументов). Элементами массивов plhs и prhs являются указатели на значения аргументов. Например, для выражения [T, X] = samefun(A, B, C) значения nlhs = 2, nrhs = 3.
Анализ аргументов.
Если есть вероятность некорректного ввода входных аргументов, то имеет смысл осуществить проверку на количество, размерность и тип входных аргументов, а также на количество выходных аргументов:
/* Проверка количества входных и выходных
аргументов */
if (nrhs != 2) // Если число аргументов входа не равно
двум, то завершить программу с сообщением
mexErrMsgTxt("Two inputs required.");
if(nlhs != 1) // Если число аргументов выхода не равно
одному, то завершить программу с сообщением
mexErrMsgTxt("One output required.");
Для проверки соответствия типу аргументов входа используется ряд функций API MATLAB начинающихся префиксом mxIs, входным параметром которых является указатель на аргумент:
/* Проверить, что первый аргумент входа является
действительным числом. */
if( !mxIsNumeric(prhs[0]) // Вх. есть не число,
|| !mxIsDouble(prhs[0]) // или вх. есть не тип double,
|| mxIsComplex(prhs[0]) // или вх. комплексный,
|| mxGetN(prhs[0])*mxGetM(prhs[0]) !=1 // и это не скаляр…
) // то вывести сообщение с завершением программы.
mexErrMsgTxt("Input x must be a scalar.");
Связывание с локальными переменными входных и выходных аргументов.
Что бы работать со значениями аргументов входа и выхода их необходимо связать с локальными переменными, для чего в общем случае используют функцию double * mxGetPr(mxArray * p). Так как указатели массива выхода plhs первоначально ничем не инициализированы, то нужно это сделать с помощью функций mxCreate, например:
Инициализируем plhs[0] матрицей действительных чисел 5х3:
plhs[0] = mxCreateDoubleMatrix(5, 3, mxREAL);
Теперь нужно связать локальные переменные с входом и выходом. В зависимости от типа аргумента в MATLAB API есть несколько функций, начинающихся с префикса mxGet:
double in_1; // скаляр
double * in_2, * out_1; // массивы (матрица)
/* Скаляр */
in_1 = mxGetScalar(prhs[0]); // вернуть первый элемент
/* Матрица */
int nrows, ncols;
nrows = mxGetM(prhs[1]); // вернуть число строк
ncols = mxGetN(prhs[1]); // вернуть число столбцов
in_2 = mxGetPr(prhs[1]); // вернуть указатель на входной массив
out_1 = mxGetPr(plhs[0]); // вернуть указатель на выходной массив
Теперь можно работать с локальными переменными.
Пример:
Имеем матрицу M = [1 2; 3 4; 5 6], тогда в массиве xони будут представлены следующим образом:x= (1, 3, 5, 2, 4, 6). Тогда M(i, j) = *( x + nrows*(j-1) + i - 1).
M(1, 2) = *( x + 3*(2-1) + 1 - 1) = *( x + 3) = 2
Для работы с массивами произвольной длины используют две основные функции:
const int * mxGetDimensions(const mxArray * prhs);
int mxGetNumberOfDimensions(const mxArray * prhs);