2013-04-08 3 views
1

Я опытный пользователь MATLAB, но абсолютно новый для файлов C и MEX. У меня есть сложная программа, написанная на C, которую мне нужно вызвать из MATLAB. Программа состоит из нескольких десятков файлов в папке, в том числе один, называемый main.c, который обрабатывает входы из командной строки, передает результаты другим классам, которые выполняют фактические вычисления.Создайте файл MATLAB MEX для программы C

Обычно, чтобы установить эту программу из командной строки, я запустил ./configure, сделав в командной строке UNIX. Затем, чтобы запустить программу, ./runMyProgram -f input_file.txt -p some_parameters. Программа принимает текстовый файл, состоящий из списка чисел, как ввод, и печатает таблицу результатов в окне команд. Я хочу передать программе массив MATLAB (вместо файла .txt) и вернуть массив (вместо печатной таблицы результатов).

Я прочитал документацию MEX от Mathworks (который я нашел довольно непрозрачным), а также некоторые другие «учебные пособия», но я полностью потерян - примеры для очень простых однопрофильных программ на C и дона 'действительно обсуждать, как обращаться с более крупной и более сложной программой. Достаточно ли заменить файл main.c файлом MEX, который делает то же самое? Кроме того, как мне собрать весь пакет в MATLAB?

Я был бы признателен за любой простой английский совет о том, с чего начать, или указатели на любые учебники, посвященные предмету понятным образом.

+0

Посмотрите здесь: http://www.shawnlankton.com/2008/03/getting-started-with-mex-a-short-tutorial/. Это очень помогло мне, когда я начинал. – Justin

+1

Это боль для создания сложных файлов MEX. Не ожидайте, что это будет хороший опыт. :) – Memming

+0

Почему бы вам просто не использовать 'system' или аналогичный для запуска программы из MATLAB, а затем проанализировать вывод? Таким образом, вам не нужно писать код C или беспорядок с кодом программы (и вам не придется делать это снова, если программа будет обновлена ​​его автором). – wakjah

ответ

2

Да. Обычно заменой файла main.c файлом MEX является процесс. В вашем случае, поскольку у вас уже есть сложная компоновка сборки, может быть проще создать библиотеку, а затем создать отдельный файл mex, который просто связывается с этой библиотекой. Это будет намного проще, чем построить все, используя команду mex. Если вы экспортируете функцию, которую необходимо вызвать из своей библиотеки, вы можете позвонить ей из своей mexFunction. mexFunction может делать все создание и чтение mxArrays. Простой пример mexFunction может быть,

#include "mex.h" 
// Include headers for your library 

void 
mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[]) 
{ 
    void* x = mxGetData(prhs[0]); // Assume one input. Check nrhs 
    plhs[0] = mxCreateDoubleMatrix(10,10,mxREAL); // Create 10x10 double matrix for output 
    void* y = mxGetData(plhs[0]); 
    yourLibraryFunction(x, y); // Read from x and write to y. Pass sizes in if needed 
}