среда, 5 мая 2010 г.

Matlab.cpp

Цель работы или аналитический обзор.
Сегодня задался вопросом «как запустить из Matlab функцию, реализованную в C++». Оказывается такая возможность у Matlab есть начиная с 7ой версии. Механизм называется Mex. Идея в том, что компилируя с-код, Matlab получает бинарный файл с разрешением mex. Для его работы необходимо, чтобы на машине был установлен c++ компилятор, в списке таких компиляторов фигурируют Visual C++ разных поколений, Lcc (встроен в Matlab) и Intel C++. А вот mingw для Windows почему-то нет. Файл .mex интерпретируется матлабом как функция.
Следует отметить, что Matlab так же позволяет работать со своими модулями из С++, запускать его внутренние функции, выполнять m-скрипты и вообще что угодно. Для этого достаточно создать объект класса Engine с помощью функции engOpen и внимательно читать документацию. Основные пользовательские функции engPutVariable, engEvalString, mxCreateDoubleMatrix. Интересно, что при создании переменной с++ программой, эта переменная отображается и в графической среде Matlab.
Хейдер «mex.h». Основной тип данных mxArray. Методы манипуляции его данными mxGet(Set)Data и mxGetPr. Второй возвращает указатель на массив данных, при изменении которого меняются значения массива матлаба. При работе с первым следует использовать указатели на данные, инициализированные с помощью mxCalloc.
Ход работы.
Мой интерес заключался в добавлении к Matlab функции, которая смогла бы считывать разделители (маркеры и регионы) из wav файлов. Как эти метки хранятся в wav файле – отдельная тема. Я уже писал, как это делается.
Сначала нужно было настроить mex для работы с нужным компилятором. Для этого я воспользовался командой mex –setup. Ответив на несколько ненавязчивых вопросов, получим предупреждение о том, что mex файл не будет работать на компьютере, на котором нет VS. В принципе, логичнее в качестве компилятора для mex использовать Lcc, но он слишком урезан и я не стал сражаться с ошибками, которые он выдавал.
Изначально у меня была программа для считывания разделителей на с++ с использованием Qt. Я реализовал файл read_wav_markers.cpp, в котором переопределил функцию mexFunction, которая запускается при вызове функции из матлаб. Затем написал батник build_mex_file.bat для облегчения компиляции. Результат выложил на github.

Комментариев нет:

Отправить комментарий