C++ からの cell 配列の作成
MATLAB® cell 配列は、各 cell が任意の型の配列を含むことができるコンテナーです。MATLAB C++ エンジンにより、メンバー関数 matlab::data::ArrayFactory::createCellArray
を使用して cell 配列を作成できます。空の cell 配列を作成するには createArray<matlab::data::Array>
を使用します。
cell 配列を MATLAB と受け渡しすることができます。MATLAB では、これらの配列は cell
クラスになります。
matlab::data::CellArray
クラスは、次のように定義される配列の配列として実装されています。
matlab::data::TypedArray<matlab::data::Array>
C++ エンジン プログラムを設定およびビルドする方法の詳細については、C++ エンジン プログラムのビルド要件を参照してください。
MATLAB ワークスペースへの cell 配列の配置
このサンプル コードは、cell 配列を作成して 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
cell 配列の要素へのアクセス
cell 配列の要素にアクセスするには、[]
のインデックスを使用します。たとえば、前の節で作成した cell 配列の 1 番目の要素にアクセスし、その要素を std::string
に変換します。
matlab::data::CharArray cArray = cellArray1[0][0]; std::string str = cArray.toAscii();
変数 str
は cell 配列の値のコピーです。
cell 配列の要素の変更
cell 配列の要素は、さまざまな方法で変更できます。
要素への参照を作成し、cell 配列で値を変更する。
要素をコピーして値を変更し、値を cell 配列に再代入する。
このサンプル コードは matlab::data::TypedArrayRef
を使用して、特定の cell に含まれている配列への参照を作成します。その後、インデックス付きの代入を使用して配列の特定の要素を変更することにより、配列を変更します。
#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 ワークスペースの cell 配列には、配列要素の参照に加えられた変更も含まれます。以下に、MATLAB の cell 配列を示します。
>> cellArray2{:} ans = 'A cell array' ans = 1×3 logical array 1 0 0 ans = 2.2000 -3.2000 -4.2000 ans = int32 -3374
MATLAB からの cell 配列の取得
このサンプル コードは、MATLAB から cell 配列を取得します。このコードは、前の例で作成されたような cellArray2
という名前の cell 配列変数が MATLAB ワークスペースにあると仮定します。cell 配列を MATLAB に渡す方法については、cell 配列の要素の変更を参照してください。
cell 配列を取得するには、次の手順に従います。
matlab::engine::MATLABEngine
のメンバー関数getVariableを使用して cell 配列を C++ に含める。返された cell 配列を
matlab::data::CellArray
として定義する。[1][0]
でインデックス付けされた cell の内容をmatlab::data::TypedArray<bool>
として返す。メンバー関数
TypedArray::getNumberOfElements
を使用して、cell 配列の要素をループ処理する。
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::engine::connectMATLAB
| matlab::data::ArrayFactory
| matlab::engine::MATLABEngine
| matlab::data::TypedArray