2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 
Сообщение15.04.2008, 09:08 


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

 Профиль  
                  
 
 
Сообщение15.04.2008, 09:27 
Супермодератор
Аватара пользователя


29/07/05
8248
Москва
 !  PAV:
Замечание за дублирование сообщений

 Профиль  
                  
 
 
Сообщение15.04.2008, 23:44 


14/08/07
14
Москва
Есть несколько вариантов вызова 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 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group