MATLAB® массив ячеек является контейнером, в котором каждая камера может содержать массив любого типа. Механизм MATLAB C++ позволяет вам создавать массивы ячеек с помощью matlab::data::ArrayFactory::createCellArray
функции представителя. Чтобы создать пустой массив ячеек, используйте createArray<matlab::data::Array>
.
Можно передать массивы ячеек в и из MATLAB. В MATLAB эти массивы имеют класс cell
.
The matlab::data::CellArray
класс реализован как массив массивов, заданный как:
matlab::data::TypedArray<matlab::data::Array>
Для получения информации о том, как настроить и создать программы C++ engine, смотрите Сборка программ C++ Engine.
Этот пример кода создает массив ячеек и помещает его в базовое рабочее пространство 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); }
Вызов MATLAB whos
функция показывает переменную в рабочем пространстве 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. Этот код принимает, что существует переменная массива ячеек с именем 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; } }
matlab::data::ArrayFactory
| matlab::data::TypedArray
| matlab::engine::connectMATLAB
| matlab::engine::MATLABEngine