exponenta event banner

Создание функций C++ MEX с помощью C Matrix API

Примечание

MATLAB ® предоставляет API, использующий современную семантику C++ и шаблоны проектирования, API данных MATLAB. MathWorks рекомендует создавать функции MEX с помощью этого API. Дополнительные сведения см. в разделе Приложения C++ MEX.

Если функции MEX должны выполняться в MATLAB R2017b или ранее, необходимо использовать функции C Matrix API в приложениях C++. Функции MEX, созданные с помощью C Matrix API, поддерживают все стандарты языка C++. В этом разделе рассматриваются конкретные проблемы языка C++, которые необходимо учитывать при создании и использовании файлов MEX.

Примеры кода MATLAB C можно использовать в приложениях C++. Например, см. mexcpp.cpp в примере класса C++, который содержит операторы C и C++.

Создание исходного файла C++

В примерах исходного кода MATLAB C++ используется .cpp расширение файла. Расширение .cpp однозначен и распознается компиляторами C++. Другие возможные расширения: .C, .cc, и .cxx.

Компиляция и связывание

Чтобы построить файл C++ MEX, введите:

mex filename.cpp

где filename имя файла исходного кода в пути MATLAB.

Файл C++ MEX можно запустить только в системах с той же версией MATLAB, в которой был скомпилирован файл.

Соображения по памяти для деструкторов классов

Не используйте mxFree или mxDestroyArray функции в деструкторе C++ класса, используемого в MEX-функции. Если функция MEX выдает ошибку, MATLAB очищает переменные файла MEX, как описано в разделе Автоматическая очистка временных массивов в файлах MEX.

Если возникает ошибка, которая приводит к выходу объекта из области действия, MATLAB вызывает деструктор C++. Освобождение памяти непосредственно в деструкторе означает, что и MATLAB, и деструктор освобождают одну и ту же память, что может повредить память.

Использовать mexPrintf для печати в окне команд MATLAB

Используя cout или язык C printf функция не работает так, как ожидалось в файлах C++ MEX. Используйте mexPrintf вместо этого функция.

Пример класса C++

Файл MEX mexcpp.cpp показывает, как использовать код C++ с файлом MEX языка C. В примере используются функции из C Matrix API. Он использует функции-члены, конструкторы, деструкторы и iostream включить файл.

Функция определяет класс myData с функциями-членами display и set_dataи переменные v1 и v2. Он создает объект d класса myData и отображает инициализированные значения v1 и v2. Затем он устанавливает v1 и v2 и отображает новые значения. Наконец, delete оператор очищает объект.

Чтобы создать этот пример, скопируйте файл по пути MATLAB и в командной строке введите:

mex mexcpp.cpp

Синтаксис вызова: mexcpp(num1, num2).

Пример обработки файлов C++

mexatexit.cpp В примере показаны функции обработки файлов C++. Сравните его с примером кода C mexatexit.c, которая использует mexAtExit функция.

Пример C++

В примере C++ используется fileresource для обработки функций открытия и закрытия файлов. Функция MEX вызывает деструктор для этого класса, который закрывает файл данных. В этом примере также печатается сообщение на экране при выполнении операций над файлом данных. Однако в этом случае единственной выполняемой операцией С-файла является операция записи, fprintf.

Чтобы построить mexatexit.cpp MEX-файл, скопируйте файл в путь MATLAB и введите:

mex mexatexit.cpp

Тип:

z = 'for the C++ MEX-file';
mexatexit(x)
mexatexit(z)
clear mexatexit
Writing data to file.
Writing data to file.

Отображение содержимого matlab.data.

type matlab.data
my input string
for the C++ MEX-file

Пример C

Пример кода C регистрирует mexAtExit для выполнения задач очистки (закрытия файла данных) при очистке файла MEX. В этом примере выполняется печать сообщения на экране с помощью mexPrintf при выполнении операций с файлами fopen, fprintf, и fclose.

Чтобы построить mexatexit.c MEX-файл, скопируйте файл в путь MATLAB и введите:

mex mexatexit.c

Выполните пример.

x = 'my input string';
mexatexit(x)
Opening file matlab.data.
Writing data to file.

Очистите файл MEX.

clear mexatexit
Closing file matlab.data.

Отображение содержимого matlab.data.

type matlab.data
my input string

См. также

|

Связанные примеры

Подробнее