Типы данных для передачи MEX-функций

MATLAB® Data API поддерживает типы массивов, которые позволяют MEX-функциям передавать конкретные типы данных от и к MATLAB. Для получения информации о дополнительных типах массивов смотрите MATLAB Data API.

Самый общий тип массива является matlab::data::Array. Более конкретные типы обеспечивают дополнительную функциональность. Для примера, matlab::data::TypedArray<T> обеспечивает поддержку и matlab::data::CharArray итератора обеспечивает конвертеры для ASCII и UTF16 типов.

В следующих разделах показа, как определить вход и выходные типы с помощью MATLAB Data API. Предположим, что среда MEX с входами и выходами заданы как показано в следующем определении класса. Используйте matlab::data::ArrayFactory для создания выходных массивов.

class MexFunction : public matlab::mex::Function {
public:
    void operator()(matlab::mex::ArgumentList outputs, matlab::mex::ArgumentList inputs) {
        matlab::data::ArrayFactory factory;
        ...
    }

Типизированные массивы

Использование matlab::data::TypedArray<T> для определения конкретных типов, таких как числовые и логические значения. Для примера позвоните myMexFcn от MATLAB.

m = [-2 2 6 8];
result = myMexFcn(m);

Присвойте вход типа MATLAB double в MEX-функция.

matlab::data::TypedArray<double> doubleArray = inputs[0];

Возвращает выход типа double в MATLAB:

outputs[0] = factory.createArray<double>({ 1,4 }, { -2.0, 2.0, 6.0, 8.0 });

Символьные массивы

Использование matlab::data::CharArray для передачи символьных массивов в функции MEX-функции. Для примера позвоните myMexFcn от MATLAB с вектором символов.

result = myMexFcn('Character vector');

Присвойте вход типа MATLAB char в MEX-функция.

matlab::data::CharArray charVector2 = inputs[0];

Возвращает выход типа char в MATLAB.

outputs[0] = factory.createCharArray("Character vector");

Строковые массивы

Использование matlab::data::TypedArray<MATLABString> для передачи строковых массивов в функции MEX-функции. Для примера позвоните myMexFcn от MATLAB с строковыми массивами.

result = myMexFcn(["Array", "of", "strings"]);

Присвойте вход типа MATLAB string в MEX-функция.

matlab::data::TypedArray<matlab::data::MATLABString> stringArray = inputs[0];

Возвращает выход типа string в MATLAB.

outputs[0] = factory.createArray({ 1,3 }, { u"Array", u"of", u"strings" });

Массивы ячеек

Использование matlab::data::CellArray для передачи массивов ячеек в функции MEX-функции. Для примера позвоните myMexFcn из MATLAB с массивом ячеек.

result = myMexFcn({'MATLAB cell array', [1.2 2.2; 3.2 4.2]});

Присвойте вход типа MATLAB cell в MEX-функция.

matlab::data::CellArray inCellArray2 = inputs[0];

Возвращает выход типа cell в MATLAB.

outputs[0] = factory.createCellArray({ 1,2 },
                factory.createCharArray("MATLAB Cell Array"),
                factory.createArray<double>({ 2,2 }, { 1.2, 3.2, 2.2, 4.2 }));

Обратите внимание на различие в упорядоченном расположении основных строк и основных столбцов между C++ и MATLAB при определении 2-D массивов.

Массивы структур

Использование matlab::data::StructArray для передачи структур в функции MEX-функции. Для примера позвоните myMexFcn из MATLAB со структурой.

st.Name = 'Color';
st.Value = uint8([1 0 1]);
result = myMexFcn(st);

Присвойте вход типа MATLAB struct в MEX-функция.

matlab::data::StructArray inStructArray = inputs[0];

Возвращает выход типа struct в MATLAB.

matlab::data::StructArray S = factory.createStructArray({ 1,1 }, { "Name","Value" });
S[0]["Name"] = factory.createCharArray("Color");
S[0]["Value"] = factory.createArray<uint8_t>({ 1, 3 }, { 1, 0, 1 });
outputs[0] = S;

Объекты MATLAB

Использование matlab::data::Array для передачи объектов в функции MEX-функции. Для примера позвоните myMexFcn из MATLAB с объектом пользовательского класса с именем MyClass.

classdef MyClass
    property 
        MeanValue = 0.5
    end
end
obj = MyClass;

Присвойте вход типа MATLAB MyClass в MEX-функция.

matlab::data::Array obj = inputs[0];

Предположим, что MyClass задает свойство, называемое MeanValue который содержит скаляр double. Получите значение свойства с помощью matlab::engine::MATLABEngine::getProperty.

matlab::data::TypedArray<double> meanValue = matlabPtr->getProperty(obj, u"MeanValue");
double m = meanValue[0];

Установите значение свойства используя matlab::engine::MATLABEngine::setProperty и верните объект в MATLAB как matlab::data::Array.

matlabPtr->setProperty(obj, u"MeanValue", factory.createScalar<double>(1.02));
outputs[0] = obj;

Пример работы с объектами MATLAB см. в разделе Объекты MATLAB в MEX-функциях.

См. также

| | | |

Похожие темы