C++ からの構造体配列の作成
MATLAB® 構造体には、フィールド名で参照するデータが含まれています。各フィールドには任意のデータ型を含めることができます。MATLAB コードは、structName.fieldName の形式のドット表記を使用して構造体内のデータにアクセスします。MATLAB 構造体のクラスは struct です。
MATLAB 構造体の配列では、各構造体は同じフィールド名をもっていなければなりません。
C++ エンジン プログラムを設定およびビルドする方法の詳細については、Requirements to Build C++ Engine Applicationsを参照してください。
構造体配列の作成と 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