Main Content

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 を呼び出します。たとえば、インターフェイス libnamemyclass という名前のクラスを定義しているとします。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 オブジェクトの obj1obj2 を作成します。

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 配列には以下のプロパティがあります。

プロパティ

アクセス

説明

Dimensions

double vector読み取り専用

C++ の配列の次元数。たとえば、[2 5 3] は 2×5×3 の配列を示します。

Resizable

logical scalar読み取り専用

  • true — 要素を追加または削除できます。

  • false — 要素を追加または削除することはできません。

MATLAB の C++ オブジェクト配列のメソッド

clibArray または clibConvertArray で作成した MATLAB 配列には以下のメソッドがあります。

メソッド

構文

説明

append

append([element])

オプションで指定された要素を配列の最後に追加します。

プリミティブ型の MATLAB の clib 配列の場合、入力引数がなければゼロ値が追加されます。

クラス型の MATLAB の clib 配列の場合、入力引数がなければクラス型の既定のコンストラクターが追加されます。クラス型の既定のコンストラクターが削除された場合、ランタイム エラーが発生します。

removeLast

removeLast

配列の最後の要素を削除します。MATLAB の clib 配列が空の場合、ランタイム エラーが発生します。

double

double

倍精度に変換します。

int8

int8

int8 に変換します。

uint8

uint8

uint8 に変換します。

int16

int16

int16 に変換します。

uint16

uint16

uint16 に変換します。

int32

int32

int32 に変換します。

uint32

uint32

uint32 に変換します。

int64

int64

int64 に変換します。

uint64

uint64

uint64 に変換します。

logical

logical

logical に変換します。

メモリ管理

clibArray または clibConvertArray で作成された MATLAB 配列のメモリは MATLAB が所有および管理します。自分で clib 配列のメモリを明示的に解放する必要はありません。C++ オブジェクトのメモリを MATLAB から解放する方法の詳細については、clibRelease を参照してください。

参考

| | |

関連するトピック