Main Content

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;
    }	   
}

参考

| | |

関連するトピック