Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Антонюк и др.doc
Скачиваний:
49
Добавлен:
07.11.2018
Размер:
32.99 Mб
Скачать
      1. Настройка среды для сборки проекта

Перед началом создания проекта для будущего MEX-файла нужно убедиться в правильности настройки среды (переменных окружения) компилятора, который будет использоваться для компиляции динамической библиотеки.

MATLAB при установке запрашивает тип используемого компилятора и настраивает командные файлы, которые будут компилировать и собирать MEX-файлы при помощи указанного компилятора. Поэтому последовательность, в которой на компьютер устанавливаются компилятор и MATLAB, является довольно важной. Лучше, чтобы сначала на компьютер был установлен компилятор C (Microsoft Visual C++ 5.0), а затем – MATLAB.

В простых случаях, например, когда весь текст будущего расширения MATLAB содержится в единственном файле, имеется возможность вызвать последовательность операций сборки (компиляция, связывание и т.п.) прямо из среды MATLAB – при помощи команды MEX. Указанная команда является обычным batch-файлом Windows, в котором содержатся вызовы компилятора и других необходимых программ. Поэтому ею же можно воспользоваться для сборки расширения и в командной строке MS‑DOS.

Для работы в этом режиме нужно, чтобы были правильно настроены переменные среды окружения, необходимые компилятору при работе.

Проверьте следующие установки, вызвав команду set | more в окне MS‑DOS:

MSVCDir=d:\program files\devstudio\vc

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

include=%MSVCDir%\include;%MSVCDir%\mfc\include

lib=%MSVCDir%\lib;%MSVCDir%\mfc\lib

path=…(пути к прочим программам)…;%MSVCDir%\bin;c:\MATLAB\bin

Если что-то не в порядке, надо поправить файл autoexec.bat (или, под Windows NT, изменить значения в “Панель Управления/Система”) так, чтобы указанные пути соответствовали реально установленным программам.

После выполнения указанных настроек имеет смысл протестировать всю систему сборки. Для этого нужно скопировать к себе в рабочий каталог файл yprime.c из папки \MATLAB\extern\examples\mex. Затем, в среде MATLAB, сделать рабочий каталог текущим при помощи команды cd.

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

» mex yprime.c

» yprime(1,1:4)

ans =

2.0000 8.9685 4.0000 -1.0947

Данный пример содержит решение упрощенной задачи трех тел (Земля, Луна и легкий спутник) с координатами в центре масс системы Земля-Луна. Полученные числа являются координатами спутника и компонентами его скорости через одну единицу времени. В каталоге \MATLAB\extern\examples\mex есть файл yprime.m, решающий ту же задачу на языке MATLAB.

Если расширение MATLAB состоит из нескольких исходных текстов, то сборку такого расширения все равно можно выполнить той же командой, например:

» mex circle.c square.obj rectangle.c shapes.lib

В более сложных случаях, когда проект сложный и содержит много исходных текстов, элементы пользовательского интерфейса (ресурсы) и т.п., можно специальным образом настроить проект непосредственно в интегрированной среде Visual C++. Для этого следует выполнить следующие действия:

  1. создать проект DLL и добавить в него все необходимые исходные файлы, а также файл mexversion.rc;

  2. создать DEF-файл для проекта и явно экспортировать единственную интерфейсную функцию:

LIBRARY MYFILE.DLL

EXPORTS mexFunction

  1. включить созданный .DEF-файл в проект;

  2. создать библиотеку импорта для MEX-функций из файла MATLAB.DEF, находящегося в каталоге \MATLAB\extern\include:

LIB /DEF:MATLAB\EXTERN\INCLUDE\MATLAB.DEF/OUT:mymeximports.lib

  1. добавить эту библиотеку в проект;

  2. добавить каталог \MATLAB\EXTERN\INCLUDE к другим include-каталогам в опциях препроцессора для проекта (Project/Settings/Preprocessor);

  3. на этой же вкладке добавить MATLAB_MEX_FILE к списку предопределенных символов (Preprocessor definitions) для всех конфигураций (Release/Debug) проекта;

  4. для отладки можно во вкладке Debug (Project/Settings/Debug) указать в качестве запускающей программы (Executable for debug session) для проекта саму программу MATLAB: \MATLAB\BIN\MATLAB.EXE. Тогда можно будет задавать точки остановки внутри вашего расширения MATLAB, просматривать значения его переменных, проходить его в пошаговом режиме и выполнять другие отладочные действия.

      1. Схема взаимодействия MATLAB и MEX‑файла

Пусть в среде MATLAB производится вызов функции из MEX-файла:

[C,D]=fun(A,B);

После этого MATLAB создает четыре структуры типа mxArray: A, B, C, D. Структуры A и B будут содержать указатели на данные соответствующих матриц, а структуры C и D будут пока пустыми:

const mxArray *A;

A = prhs[0]

const mxArray *B;

B = prhs[1]

Внутри интерфейсной функции MEX-файла можно воспользоваться вспомогательной функцией mxGet___() для получения указателей на данные. Естественно, следует выбрать функцию mxGet___() соответствующую полю структуры mxArray, которое требуется считать.

Полученные указатели на данные следует передать в вычислительную функцию, которая и должна произвести все необходимые действия для получения результата. Не стоит перегружать интерфейсную функцию реальными вычислениями – это ухудшит читаемость разрабатываемой программы и затруднит ее отладку.

В ходе вычислений почти наверняка придется выделять память для хранения вспомогательных и результирующих данных. Для этого лучше всего воспользоваться функцией mxCreate__(), соответствующей типу данных, под которые надо выделить память. Использование этой функции гарантирует, что MATLAB сможет корректно уничтожить переменную, созданную внутри MEX-файла, если это потребуется. Если память выделяется обычным образом, при помощи оператора new или функции malloc(), то можно воспользоваться функцией mxSet__() для упрощения присваивания значений полям структуры mxArray.

Для того, чтобы возвратить выходные параметры C и D обратно в среду MATLAB, следует проинициализировать массив выходных параметров:

mxArray *C;

C = prhs[0];

mxArray *D;

D = prhs[1];

Далее, указатели C и D можно использовать для присваивания конкретных значений.

После возвращения управления в среду MATLAB полученные переменные C и D можно будет использовать обычным образом.