Структуры MATLAB® содержат данные, на которые вы ссылаетесь с именами полей. Каждое поле может содержать любой тип данных. К данным о доступе в структуре код MATLAB использует запись через точку формы structName.fieldName
. Классом структуры MATLAB является struct
.
В массиве структур MATLAB каждая структура должна иметь те же имена полей.
Для получения информации о том, как установить и создать программы механизма C++, видит Сборку Программы Engine 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 auto 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"); auto numelem = matlabStruct.getDimensions(); std::cout << "structArray size is: " << numelem[0] << " by " << numelem[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 auto 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