Структуры MATLAB ® содержат данные, на которые ссылаются имена полей. Каждое поле может содержать данные любого типа. Для доступа к данным в структуре в коде MATLAB используется точечная нотация формыstructName.fieldName. Класс структуры MATLAB: struct.
В массиве структур MATLAB каждая структура должна иметь одинаковые имена полей.
Сведения о настройке и сборке программ ядра C++ см. в разделе Сборка программ ядра C++.
Этот пример кода создает структурный массив и помещает его в рабочую область MATLAB.
Вот как создать и отправить массив.
Создать пустой matlab::data::StructArray, определение размеров массива и имен полей.
Назначьте значения полям с помощью индексов массива и имен полей. Определите правильный тип массива с помощью matlab::data::ArrayFactory.
Поместите структурный массив в рабочую область MATLAB с помощью MATLABEngine::setVariable функция-член.
#include "MatlabDataArray.hpp" #include "MatlabEngine.hpp" #include <iostream>
void putStructArray() {
using namespace matlab::engine;
// Connect to named shared MATLAB session started as:
// matlab -r "matlab.engine.shareEngine('myMatlabEngine')"
String session(u"myMatlabEngine");
std::unique_ptr<MATLABEngine> matlabPtr = connectMATLAB(session);
// Create MATLAB data array factory
matlab::data::ArrayFactory factory;
// Define 2-element struct array with two fields per struct
matlab::data::StructArray structArray = factory.createStructArray({ 1, 2}, { "f1", "f2" });
// Assign values to each field in first struct
structArray[0]["f1"] = factory.createCharArray("First Data Set");
structArray[0]["f2"] = factory.createArray<uint8_t>({ 1, 3 }, { 1, 2, 3 });
// Assign values to each field in second struct
structArray[1]["f1"] = factory.createCharArray("Second Data Set");
structArray[1]["f2"] = factory.createArray<double>({ 1, 5 }, { 4., 5., 6., 7., 8. });
// Put struct array in MATLAB workspace
matlabPtr->setVariable(u"structArray", structArray);
}Получение структурной переменной из рабочей области MATLAB с помощью matlab::engine::MATLABEngine
Функция члена getVariable.
Примечание
Этот пример кода получает массив структуры из рабочей области MATLAB. Этот код предполагает, что существует переменная структурного массива с именем structArray в рабочей области MATLAB, как и созданная в предыдущем примере. Сведения о передаче массива структуры в MATLAB см. в разделах Создание массива структуры и Отправка в MATLAB.
#include "MatlabDataArray.hpp" #include "MatlabEngine.hpp"
void readStructArray() {
using namespace matlab::engine;
// Connect to named shared MATLAB session started as:
// matlab -r "matlab.engine.shareEngine('myMatlabEngine')"
String session(u"myMatlabEngine");
std::unique_ptr<MATLABEngine> matlabPtr = connectMATLAB(session);
// Get the struct array from MATLAB
matlab::data::StructArray matlabStruct = matlabPtr->getVariable(u"structArray");
}Существует несколько способов доступа к структуре в C++:
Создайте ссылку на определенное поле. Изменения ссылки изменяют значение в структуре.
Создайте копию значений полей. Изменения копии не изменяют значения в структуре, если значение не переназначено полю структуры.
Для получения информации о массиве структуры используйте matlab::data::StructArray функции-члены getDimensions, getNumberOfFields, и getFieldNames
Этот пример кода следует за следующими шагами:
Получение переменной массива структуры с именем structArray из сеанса MATLAB.
Создание ссылки на одно из полей структуры.
Изменение элемента двойного массива, содержащегося в поле, с использованием ссылки.
Возвращает измененный массив структуры в общий сеанс MATLAB.
Этот пример кода получает массив структуры из общего сеанса MATLAB, который был создан в предыдущем разделе «Создать массив структуры» и «Отправить в MATLAB».
#include "MatlabDataArray.hpp" #include "MatlabEngine.hpp" #include <iostream>
void modifyStructArray() {
using namespace matlab::engine;
// Connect to named shared MATLAB session started as:
// matlab -r "matlab.engine.shareEngine('myMatlabEngine')"
String session(u"myMatlabEngine");
std::unique_ptr<MATLABEngine> matlabPtr = connectMATLAB(session);
// Create MATLAB data array factory
matlab::data::ArrayFactory factory;
// Get the struct array from MATLAB
matlab::data::StructArray matlabStruct = matlabPtr->getVariable(u"structArray");
matlab::data::ArrayDimensions dims = matlabStruct.getDimensions();
std::cout << "structArray size is: " << dims[0] << " by " << dims[1] << std::endl;
// Get number of fields
size_t numFields = matlabStruct.getNumberOfFields();
std::cout << "structArray has " << numFields << " fields" << std::endl;
// Get the struct array fieldnames
Range<ForwardIterator, MatlabFieldIdentifier const> fields = matlabStruct.getFieldNames();
std::vector<matlab::data::MATLABFieldIdentifier> fieldNames;
for (const auto& name : fields) {
fieldNames.push_back(name);
}
// Change value of array element using a reference
matlab::data::TypedArrayRef<double> field1 = matlabStruct[1][fieldNames[1]];
field1[0] = -200.;
// Return modified struct array to MATLAB
matlabPtr->setVariable(u"structArray", matlabStruct);
}matlab::data::ArrayFactory | matlab::data::MATLABFieldIdentifier | matlab::data::StructArray | matlab::engine::MATLABEngine