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
のメンバー関数 getDimensions
、getNumberOfFields
、および 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); }
参考
matlab::data::StructArray
| matlab::data::ArrayFactory
| matlab::data::MATLABFieldIdentifier
| matlab::engine::MATLABEngine