Main Content

C++ からの構造体配列の作成

MATLAB® 構造体には、フィールド名で参照するデータが含まれています。各フィールドには任意のデータ型を含めることができます。MATLAB コードは、structName.fieldName の形式のドット表記を使用して構造体内のデータにアクセスします。MATLAB 構造体のクラスは struct です。

MATLAB 構造体の配列では、各構造体は同じフィールド名をもっていなければなりません。

C++ エンジン プログラムを設定およびビルドする方法の詳細については、C++ エンジン プログラムのビルド要件を参照してください。

構造体配列の作成と MATLAB への送信

このサンプル コードは、構造体配列を作成して MATLAB ワークスペースに配置します。

配列を作成して送信する方法は次のとおりです。

  • 空の matlab::data::StructArray を作成し、配列の次元とフィールド名を定義します。

  • 配列とフィールド名のインデックスを使用してフィールドに値を代入します。matlab::data::ArrayFactory を使用して正しい配列型を定義します。

  • メンバー関数 MATLABEngine::setVariable を使用して、構造体配列を MATLAB ワークスペースに配置します。

#include "MatlabDataArray.hpp"
#include "MatlabEngine.hpp"
#include <iostream>
void putStructArray() {
    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;

    // Define 2-element struct array with two fields per struct
    matlab::data::StructArray structArray = factory.createStructArray({ 1, 2}, { "f1", "f2" });

    // Assign values to each field in first struct
    structArray[0]["f1"] = factory.createCharArray("First Data Set");
    structArray[0]["f2"] = factory.createArray<uint8_t>({ 1, 3 }, { 1, 2, 3 });

    // Assign values to each field in second struct
    structArray[1]["f1"] = factory.createCharArray("Second Data Set");
    structArray[1]["f2"] = factory.createArray<double>({ 1, 5 }, { 4., 5., 6., 7., 8. });
    
    // Put struct array in MATLAB workspace
    matlabPtr->setVariable(u"structArray", structArray);
}

MATLAB からの構造体の取得

matlab::engine::MATLABEngine のメンバー関数getVariableを使用して、MATLAB ワークスペースから構造体変数を取得します。

メモ

このサンプル コードは、MATLAB ワークスペースから構造体配列を取得します。このコードは、前の例で作成されたような structArray という名前の構造体配列変数が MATLAB ワークスペースにあると仮定します。構造体配列を MATLAB に渡す方法については、構造体配列の作成と MATLAB への送信を参照してください。

#include "MatlabDataArray.hpp"
#include "MatlabEngine.hpp"
void readStructArray() {
    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 the struct array from MATLAB
    matlab::data::StructArray matlabStruct = matlabPtr->getVariable(u"structArray");
}

struct 配列データへのアクセス

C++ の構造体は、さまざまな方法でアクセスすることができます。

  • 特定のフィールドへの参照を作成する。参照を変更することにより、構造体の値が変更されます。

  • フィールド値のコピーを作成する。コピーを変更しても、値を構造体フィールドに再代入しない限り、構造体の値は変更されません。

構造体配列についての情報を取得するには、matlab::data::StructArray のメンバー関数 getDimensionsgetNumberOfFields、および getFieldNames を使用します。

このサンプル コードは次の手順に従います。

  • MATLAB セッションから structArray という名前の構造体配列変数を取得します。

  • 構造体フィールドのいずれかへの参照を作成します。

  • 参照を使用してフィールドに含まれる double の配列の要素を変更します。

  • 変更された構造体配列を共有 MATLAB セッションに返します。

このサンプル コードは、前の節構造体配列の作成と MATLAB への送信で作成した共有 MATLAB セッションから構造体配列を取得します。

#include "MatlabDataArray.hpp"
#include "MatlabEngine.hpp"
#include <iostream>
void modifyStructArray() {
    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;

    // Get the struct array from MATLAB
    matlab::data::StructArray matlabStruct = matlabPtr->getVariable(u"structArray");
    matlab::data::ArrayDimensions dims = matlabStruct.getDimensions();
    std::cout << "structArray size is: " << dims[0] << " by " << dims[1] << std::endl;

    // Get number of fields
    size_t numFields = matlabStruct.getNumberOfFields();
    std::cout << "structArray has " << numFields << " fields" << std::endl;
    
    // Get the struct array fieldnames
    Range<ForwardIterator, MATLABFieldIdentifier const> fields = matlabStruct.getFieldNames();
    std::vector<matlab::data::MATLABFieldIdentifier> fieldNames;
    for (const auto& name : fields) {
        fieldNames.push_back(name);
    }

    // Change value of array element using a reference
    matlab::data::TypedArrayRef<double> field1 = matlabStruct[1][fieldNames[1]];
    field1[0] = -200.;

    // Return modified struct array to MATLAB
    matlabPtr->setVariable(u"structArray", matlabStruct);
}

参考

| | |

関連するトピック