C++ 配列用の MATLAB オブジェクト
MATLAB® は、C++ ネイティブ配列と std::vector
型をラップする clib.array
インターフェイスを提供します。用語 "clib 配列" は、これらの C++ 型の MATLAB 表現を指します。
MATLAB の clib 配列は、対応する C++ ネイティブ配列または std::vector
型が、サポートされる C++ の構成要素 (関数の入力引数、出力引数およびデータ メンバー) によって使用される場合にのみ定義されます。ライブラリ ヘッダー ファイルには、配列要素型の定義が含まれている必要があります。構成要素は MATLAB によってサポートされている必要があり、C++ ライブラリへの MATLAB インターフェイスをビルドするときに組み込まれる必要があります。
このトピックでは、MATLAB clib 配列を作成する方法、clib 配列を C++ 関数パラメーターとして使用する方法、および MATLAB 配列を C++ 配列オブジェクトに変換する方法を示します。このトピックでは、すべての MATLAB clib 配列の共通のプロパティとメソッドについても説明します。
C++ オブジェクトの MATLAB 配列の作成
C++ ネイティブ配列または std::vector
型を表す MATLAB オブジェクトを作成するには、関数 MATLABclibArray
を呼び出します。たとえば、インターフェイス libname
が myclass
という名前のクラスを定義しているとします。MATLAB で、このクラスを clib.libname.myclass
として参照します。5 つの myclass
オブジェクトからなる配列を作成します。
myclassArray = clibArray("clib.libname.myclass",5);
MATLAB 配列 myclassArray
の型は clib.array.libname.myclass
です。myclassArray
の要素にアクセスするには、MATLAB インデックスを使用します。たとえば、最初の要素にアクセスします。
e = myclassArray(1)
要素の型は clib.libname.myclass
です。
あるいは、要素の型が基本型、既定のコンストラクターを持つユーザー定義クラス、あるいは標準 string 型の場合、clib.array
コンストラクターを呼び出します。
基本型から配列を作成するには、対応する要素の型を知っていなければなりません。マッピング情報については、C++ から MATLAB へのデータ型のマッピングのベクトル整数型および浮動小数点型の表を参照してください。たとえば、C++ の型が std::vector<int32_t>
である場合、MATLAB 要素の型は clib.libname.Int
です。5 つの clib.libname.Int
要素をもつ配列を作成します。
myIntArray = clib.array.libname.Int(5)
同じユーザー定義クラスの 5 つの要素からなる配列を作成します。
myclassArray = clib.array.libname.myclass(5)
標準 string 型から配列を作成するため、std::vector<T> string 型の表を参照して要素の型の情報を調べます。たとえば、C++ の型が std::vector<std::string>
である場合、MATLAB 要素の型は clib.libname.std.String
です。5 つの clib.libname.std.String
要素をもつ配列を作成します。
myStringArray = clib.array.libname.std.String(5)
基本型の C++ ネイティブ配列を MATLAB 基本型として取り扱う
既定の設定では、MATLAB は基本型の C++ ネイティブ配列を MATLAB clib.array
型を使用して表します。基本の MATLAB 配列型を出力で保持する必要がある場合は、ReturnCArrays
引数を false
に設定して C++ ライブラリへの MATLAB インターフェイスをビルドします。詳細については、clibgen.generateLibraryDefinition
を参照してください。
メモ
C++ オブジェクトを MAT ファイルに保存することはサポートされていません。
メモ
大かっこを使用して C++ オブジェクトの配列を作成することはできません。
clib.array
パラメーターを指定した C++ 関数の呼び出し
MATLAB 変数を作成して、特定の C++ 型のパラメーターとして渡すことができます。これらの例では、直接的に、参照によって、固定サイズの配列として、配列要素を更新するために、const
オブジェクトとして、また非 const
オブジェクトとして、clib パラメーターを渡す方法を示しています。このコードでは、libname
という名前のインターフェイスをビルドすることを前提としています。
std::vector
パラメーター
std::vector
入力を予期する C++ 関数にパラメーターとして clib 配列を直接渡すと、MATLAB は clib 配列の要素とサイズを std::vector
引数に変換します。渡される配列の次元数は、パラメーターで予期される次元と一致する必要があります。たとえば、次の関数は double
型の std::vector
を受け取ります。
void fcn(std::vector<double> doubleVec);
MATLAB から関数シグネチャを表示します。
help clib.libname.fcn
fcn - clib.libname.fcn Representation of C++ function fcn. clib.libname.fcn(doubleVec) Input Arguments doubleVec vector clib.array.libname.Double
1 次元の clib 配列を作成し、fcn
に渡します。
arr1d = clibArray("clib.libname.Double",[3])
clib.libname.fcn(arr1d)
2 次元配列を渡すと、MATLAB はエラーを返します。
arr2d = clibArray("clib.libname.Double",[2 3]);
arr2d.Dimensions
ans = 2 3
clib.libname.fcn(arr2d)
Error using clib.libname.fcn No method 'clib.libname.fcn' with matching signature found.
固定サイズの配列のパラメーター
パラメーターが固定サイズの配列の場合、渡される配列の次元数と要素の型は、予期されるパラメーターの次元数と要素の型と一致する必要があります。たとえば、次の関数は double
型の固定サイズの配列を受け取ります。
void fcn(double arr[3]);
MATLAB から関数シグネチャを表示します。
help clib.libname.fcn
fcn - clib.libname.fcn Representation of C++ function fcn. clib.libname.fcn(arr) Input Arguments arr 3 element vector clib.array.libname.Double
次に、必要なサイズと型の clib 配列を指定して関数を呼び出します。
arr3 = clibArray("clib.libname.Double",3);
clib.libname.fcn(arr3);
参照渡しのパラメーター
clib 配列を C++ 関数に渡し、入力データを変更してデータを MATLAB に返すことができます。次に、MATLAB の C++ オブジェクト配列のメソッドにリストされているメソッドのいずれかを使用して、clib 配列のデータを MATLAB 配列に変換します。たとえば、次の関数は C++ 配列に int32_t
型および char
型のデータを取り込みます。
#include <cstdint> #include <vector> void getData(std::vector<int32_t>& arr) { int32_t data [] = {2, 4, 5}; arr.clear(); for (auto c : data) { arr.push_back(c); } } void getData(std::vector<char>& arr) { char data [] = {'M', 'A', 'T', 'L', 'A', 'B', '\0'}; arr.clear(); for (auto c : data) { arr.push_back(c); } }
関数 getData
を呼び出して int32_t
型の数値 clib 配列にデータを取り込み、それを MATLAB int32
配列に変換します。
narr = clib.array.libname.Int(3); clib.libname.getData(narr) int32(narr)
ans = 1×3 int32 row vector 2 4 5
次に、関数 getData
を呼び出して文字配列にデータを取り込み、それを MATLAB で使用するために変換します。
carr = clib.array.libname.Char(1); clib.libname.getData(carr); char(carr.int8)
ans = 'MATLAB '
更新された配列要素
C++ 関数が配列パラメーターの要素を更新すると、関数は MATLAB clib 配列も更新します。これは、配列が MATLAB ハンドルであるためです。たとえば、次の関数はパラメーター doubleArr
の要素を変更します。
void fcn(double * doubleArr, int size) { for(int i = 0; i < size; ++i) doubleArr[i] *= 2.0; }
インターフェイス libname
を作成するには、definelibname.m
定義ファイルを編集します。fcn
を定義しているステートメントのコメントを解除し、<SHAPE>
を "size"
に置き換えます。MATLAB から関数シグネチャを表示します。
help clib.libname.fcn
fcn - clib.libname.fcn Representation of C++ function fcn. clib.libname.fcn(doubleArr) Input Arguments doubleArr vector clib.array.libname.Double
次に、MATLAB からこの関数を呼び出して、配列要素を 2 倍の値に更新します。
doubleArr = clibConvertArray("clib.libname.Double", [2 3 4]); clib.libname.fcn(doubleArr); doubleArr(3) % display element 3
ans = 8
const
および非 const
のパラメーター
const
パラメーターは非 const
オブジェクトを受け取ることができますが、非 const
パラメーターは const
オブジェクトを受け取ることができません。たとえば、次の C++ クラスには、const
オブジェクトおよび非 const
オブジェクトを作成する関数と、const
の入力および非 const
の入力を受け取るメソッドがあります。
class MyClass { public: int m_value; MyClass():m_value(0) {} void nonConstMethod() {} int constMethod() const { return m_value; } } classObj; MyClass& funcNonConstObj() { return classObj; } const MyClass& funcConstObj() { return classObj; }
MATLAB から関数シグネチャを表示します。
help clib.libname.funcConstObj
funcConstObj - clib.libname.funcConstObj Representation of C++ function funcConstObj. RetVal = clib.libname.funcConstObj Output Arguments RetVal read-only clib.libname.MyClass
help clib.libname.funcNonConstObj
funcNonConstObj - clib.libname.funcNonConstObj Representation of C++ function funcNonConstObj. RetVal = clib.libname.funcNonConstObj Output Arguments RetVal clib.libname.MyClass
MyClass
オブジェクトの obj1
と obj2
を作成します。
obj1 = clib.libname.funcConstObj; obj2 = clib.libname.funcNonConstObj;
const
オブジェクトが読み取り専用であることを確認し、そのオブジェクトをその constMethod
メソッドおよび nonConstMethod
メソッドに渡します。
clibIsReadOnly(obj1)
ans = 1
obj1.constMethod; obj1.nonConstMethod;
Error using clib.libname.MyClass/nonConstMethod Calling nonconst method 'nonConstMethod' of read-only object 'clib.libname.MyClass' not supported.
ただし、非 const
オブジェクトは、その constMethod
メソッドと nonConstMethod
メソッドの両方に渡すことができます。
clibIsReadOnly(obj2)
ans = 0
obj2.constMethod; obj2.nonConstMethod;
MATLAB 配列から C++ 配列オブジェクトへの変換
既存の MATLAB 配列を C++ 配列オブジェクトとして使用できます。関数 clibConvertArray
を呼び出します。たとえば、MATLAB インターフェイス libname
があるとします。関数 clibConvertArray
を使用して、double 値の MATLAB 配列を C++ 配列オブジェクトに変換します。
a = [1 2 3];
arr = clibConvertArray("clib.libname.Double",a);
class(arr)
'clib.array.libname.Double'
MATLAB の C++ オブジェクト配列のプロパティ
clibArray
または clibConvertArray
で作成した MATLAB 配列には以下のプロパティがあります。
プロパティ | 型 | アクセス | 説明 |
---|---|---|---|
| double vector | 読み取り専用 | C++ の配列の次元数。たとえば、[2 5 3] は 2×5×3 の配列を示します。 |
| logical scalar | 読み取り専用 |
|
MATLAB の C++ オブジェクト配列のメソッド
clibArray
または clibConvertArray
で作成した MATLAB 配列には以下のメソッドがあります。
メソッド | 構文 | 説明 |
---|---|---|
| append([element]) | オプションで指定された要素を配列の最後に追加します。 プリミティブ型の MATLAB の clib 配列の場合、入力引数がなければゼロ値が追加されます。 クラス型の MATLAB の clib 配列の場合、入力引数がなければクラス型の既定のコンストラクターが追加されます。クラス型の既定のコンストラクターが削除された場合、ランタイム エラーが発生します。 |
| removeLast | 配列の最後の要素を削除します。MATLAB の clib 配列が空の場合、ランタイム エラーが発生します。 |
| double | 倍精度に変換します。 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| logical | logical に変換します。 |
メモリ管理
clibArray
または clibConvertArray
で作成された MATLAB 配列のメモリは MATLAB が所有および管理します。自分で clib 配列のメモリを明示的に解放する必要はありません。C++ オブジェクトのメモリを MATLAB から解放する方法の詳細については、clibRelease
を参照してください。
参考
clibArray
| clibConvertArray
| clibRelease
| clibIsReadOnly