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

Ниже приводится текст законченного примера расширения среды MATLAB, в котором производится удвоение переданного аргумента.

#include "mex.h"

#include <math.h>

/* Вычислительная процедура */

void timestwo(double y[], double x[])

{

y[0] = 2.0*x[0];

return;

}

/* Интерфейсная функция */

void mexFunction(

int nlhs, mxArray *plhs[],

int nrhs, const mxArray *prhs[])

{

double *y;

double *x;

unsigned int m, n;

/* Проверяем количество аргументов. */

if (nrhs !=1) {

mexErrMsgTxt("Only one input argument allowed.");}

else if (nlhs !=1) {

mexErrMsgTxt("Only one output argument allowed.");

}

/* Входной аргумент x должен быть скаляром. */

m = mxGetM(prhs[0]);

n = mxGetN(prhs[0]);

if (!mxIsDouble(prhs[0] || mxIsComplex(prhs[0])

|| !(m ==1 && n ==1)){

mexErrMsgTxt("Input x must be a scalar.");

}

/* Создаем выходную матрицу для возврата в среду MATLAB. */

plhs[0] = mxCreateDoubleMatrix(m, n, mxREAL);

/*Инициализир. указатели на вход. и вых.пар-тры. */

y = mxGetPr(plhs[0]);

x = mxGetPr(prhs[0]);

/* Вызываем вычислительную функцию. */

timestwo(y, x);

}

/* Конец файла.*/

      1. Вызов команд среды matlab из mex-файла

Есть возможность вызывать функции, операторы, M-файлы и даже другие MEX-файлы в среде MATLAB прямо из вашего MATLAB-расширения, написанного на языке C. Для этого нужно воспользоваться функцией из библиотеки MATLAB mexCallMATLAB(). Использование ее аналогично другим mx__() и mex__() функциям.

Следующий пример создает заполненный массив, вызывает функцию mexCallMATLAB() для показа его содержимого, затем, через нее же вычисляет собственные вектора и собственные значения заданной матрицы в среде MATLAB, и, наконец в третий раз вызывает эту же функцию для показа собственных векторов.

#include "mex.h"

#include <math.h>

void mexFunction(int nlhs,mxArray *plhs[],

int nrhs,const mxArray *prhs[])

{

double pr[] = {5.2, 7.9, 1.3, 4.2};

double pi[] = {3.4, 6.5, 2.2, 9.1};

mxArray *array_ptr;

int num_out, num_in;

mxArray *output_array[2], *input_array[2];

/* Создаем заполненную матрицу размерности 2х2.*/

array_ptr = mxCreateDoubleMatrix(2, 2, mxCOMPLEX);

memcpy(mxGetPr(array_ptr), pr, 4*sizeof(double));

memcpy(mxGetPi(array_ptr), pi, 4*sizeof(double));

/* В среде MATLAB это эквивалентно disp(array). */

num_out = 0;

num_in = 1;

input_array[0] = array_ptr;

mexCallMATLAB(num_out, output_array,

num_in, input_array, "disp");

/* А это – то же самое, что [v, d] = eig(array). */

num_out = 2;

num_in = 1;

input_array[0] = array_ptr;

mexCallMATLAB(num_out, output_array,

num_in, input_array, "eig");

/* Выведем результат: disp(v). */

num_out = 0;

num_in = 1;

input_array[0] = output_array[0];

mexCallMATLAB(num_out, output_array,

num_in, input_array, "disp");

}

/* Конец файла.*/

Отметим, что функцией mexCallMATLAB() можно пользоваться вперемешку с собственными вычислениями в расширении MATLAB, так же, как и остальными функциями библиотек MATLAB.