Создание массивов структур из C++

Структуры MATLAB® содержат данные, на которые вы ссылаетесь с именами полей. Каждое поле может содержать любой тип данных. К данным о доступе в структуре код MATLAB использует запись через точку формы structName.fieldName. Классом структуры MATLAB является struct.

В массиве структур MATLAB каждая структура должна иметь те же имена полей.

Для получения информации о том, как установить и создать программы механизма C++, видит Сборку Программы Engine C++.

Создание массива структур и отправка в MATLAB

Этот пример кода создает массив структур и помещает его в рабочее пространство 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 с помощью функции членства 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);
}

Смотрите также

| | |

Похожие темы