Есть несколько вариантов вызова C кода из MatLab. Для меня наиболее удобен способ компилирования в dll, которую можно вызывать как обычную внутреннюю MatLab функцию. Это так называемые MEX-файлы.
Пусть мы хотим написать функцию, которая принимает матрицу, умножает каждый ее элемент на 2 и возвращает результат. Для создания такой dll необходимо:
1. Настроить MEX компилятор:
1.1. В командной строке набрать 'mex -setup'.
1.2. На вопрос ответить [y].
1.3. В предложенном списке компиляторов выбрать Lcc C.
2. Придумать название функции и также назвать c-файл. В нашем примере пусть это будет 'mex_2mult.c'. Код c-файла будет выглядеть следующим образом:
Код:
#include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[])
{
int nRows, nCols;
double *a, *b;
int i, j;
/* get input matrix */
nRows = mxGetM(prhs[0]);
nCols = mxGetN(prhs[0]);
a = (double *)mxGetPr(prhs[0]);
/* make output matrix */
plhs[0] = mxCreateDoubleMatrix(nRows, nCols, mxREAL);
b = (double *)mxGetPr(plhs[0]);
/* calculations */
for (i = 0; i < nRows; i++)
{
for (j = 0; j < nCols; j++)
{
b[i + j * nRows] = 2 * a[i + j * nRows];
}
}
}
Здесь mexFunction -- это точка входа в функцию, nrhs -- количество входных аргументов, prhs -- сами входные аргументы. Заметим, что matlab передает все матрицы как линейные векторы по колонкам.
3. Далее необходимо скомпилировать с-файл в dll:
Код:
mex mex_2mult.c
4. Полученную dll уже можно вызывать из m-файлов по ее имени, например m-файл может выглядеть как:
Код:
a = rand(100, 50);
b = mex_2mult(a);