Массив ячеек 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.
#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 workspace.
>> 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 workspace включает изменения, внесенные в ссылки элемента массива. Вот массив ячеек в 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 workspace, как тот, созданный в предыдущем примере. Чтобы передать массив ячеек 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 | mATLABEngine:: MATLABEngine | mATLAB engine.connect_matlab