2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 
Сообщение15.04.2008, 09:08 
Здравствуйте. Мне необходимо написать расширение MATLAB на языке С. В связи с этим возник вопрос как правильно задать матрицу на С? Как правильно записать интерфейсную функцию? Если кто-то с этим сталкивался - подскажите пожалуйста. На примере простой задачи: пусть в MATLAB сформирована какая-тоо матрица А, размерностью 16х16, необходимо считать ее в приложение С и без изменений передать снова в MATLAB.

 
 
 
 
Сообщение15.04.2008, 09:27 
Аватара пользователя
 !  PAV:
Замечание за дублирование сообщений

 
 
 
 
Сообщение15.04.2008, 23:44 
Есть несколько вариантов вызова 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);

 
 
 [ Сообщений: 3 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group