Создание Массивов ячеек из C++

Массив ячеек MATLAB® является контейнером, в котором каждая ячейка может содержать массив любого типа. Механизм C++ MATLAB позволяет вам создать массивы ячеек с помощью функции членства matlab::data::ArrayFactory::createCellArray. Чтобы создать массив пустой ячейки, используйте createArray<matlab::data::Array>.

Можно передать массивы ячеек и из MATLAB. В MATLAB эти массивы имеют класс cell.

Класс matlab::data::CellArray реализован как массив массивов, заданных как:

matlab::data::TypedArray<matlab::data::Array>

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

Помещение массива ячеек в MATLAB workspace

Этот пример кода создает массив ячеек и помещает его в базовое рабочее пространство MATLAB.

#include "MatlabDataArray.hpp"
#include "MatlabEngine.hpp"
void cellArrayPut() {

    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;

    // Create cell array
    matlab::data::CellArray cellArray1 = factory.createCellArray({ 1,2 },
        factory.createCharArray("MATLAB Cell Array"),
        factory.createArray<double>({ 2,2 }, { 1.2, 2.2, 3.2, 4.2 }));

    // Put cell array in MATLAB workspace
    matlabPtr->setVariable(u"cellArray1", cellArray1);
}

Вызов функции whos MATLAB показывает переменную в рабочем пространстве MATLAB.

>> whos
  Name            Size            Bytes  Class    Attributes

  cellArray1      1x2               290  cell
>> cellArray1{:}

ans =

    'MATLAB Cell Array'


ans =

    1.2000    3.2000
    2.2000    4.2000

Доступ к элементам массива ячеек

Используйте индексацию [], чтобы получить доступ к элементам массива ячеек. Например, получите доступ к первому элементу массива ячеек, созданного в предыдущем разделе, и преобразуйте элемент в std::string:

matlab::data::CharArray cArray = cellArray1[0][0];
std::string str = cArray.toAscii();

Переменная str является копией значения в массиве ячеек.

Изменение элементов массива ячеек

Существуют различные способы изменить элементы в массиве ячеек:

  • Создайте ссылку на элемент и измените значение в массиве ячеек.

  • Скопируйте элемент, измените значение, затем повторно присвойте значение массиву ячеек.

Этот пример кода использует matlab::data::TypedArrayRef, чтобы создать ссылку на массив, содержавшийся в определенной ячейке. Затем массив изменяется путем изменения определенных элементов в массиве с помощью индексированного присвоения.

#include "MatlabDataArray.hpp"
#include "MatlabEngine.hpp"
void cellArrayMod() {
    //Modify elements of a cell array

    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;

    // Create a 2-by-2 array of arrays   
    matlab::data::CellArray cellArray2 = factory.createArray<matlab::data::Array>({ 2,2 });

    // Assign values to each cell
    cellArray2[0][0] = factory.createCharArray("A cell array");
    cellArray2[0][1] = factory.createArray<double>({ 1,3 }, { 2.2, 3.2, -4.2 });
    cellArray2[1][0] = factory.createArray<bool>({ 1,3 }, { true, true, false });
    cellArray2[1][1] = factory.createScalar<int32_t>(-3374);

    // Get reference to elements of the cell array
    // Modify the elements in the cell array
    matlab::data::TypedArrayRef<double> elem1 = cellArray2[0][1];
    elem1[1] = -3.2;
    matlab::data::TypedArrayRef<bool> elem2 = cellArray2[1][0];
    elem2[1] = false;

    // Put cell array in MATLAB workspace
    matlabPtr->setVariable(u"cellArray2", std::move(cellArray2));
}

Массив ячеек в рабочем пространстве MATLAB включает изменения, внесенные в ссылки элемента массива. Вот массив ячеек в MATLAB.

>> cellArray2{:}

ans =

    'A cell array'


ans =

  1×3 logical array

   1   0   0


ans =

    2.2000   -3.2000   -4.2000


ans =

  int32

   -3374

Получение массива ячеек от MATLAB

Этот пример кода получает массив ячеек от MATLAB. Этот код принимает, что существует переменная массива ячеек под названием cellArray2 в рабочем пространстве MATLAB, как то, созданное в предыдущем примере. Чтобы передать массив ячеек MATLAB, смотрите, Изменяют Элементы Массива ячеек.

Чтобы получить массив ячеек, выполните эти шаги:

  • Используйте функцию членства matlab::engine::MATLABEngine getVariable, чтобы принести массив ячеек на C++.

  • Задайте возвращенный массив ячеек как matlab::data::CellArray.

  • Возвратите содержимое ячейки, индексированной [1][0] как matlab::data::TypedArray<bool>.

  • Используйте функцию членства TypedArray::getNumberOfElements, чтобы циклично выполниться через элементы элемента массива.

void cellArrayGet() {
    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 a cell array from MATLAB
    matlab::data::CellArray ca = matlabPtr->getVariable(u"cellArray2");

    // Copy elements of a cell into vector
    matlab::data::TypedArray<bool> const elem2 = ca[1][0];
    std::vector<bool> logicalCell(elem2.getNumberOfElements());
    int i = 0;
    for (auto e : elem2) {
        logicalCell[i] = e;
        ++i;
    }	   
}

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

| | |

Похожие темы