インテル® DAAL 2018 デベロッパー・ガイド
数値テーブルは、メモリーの割り当てと割り当て解除のようなデータ管理、各メモリーアクセスのメソッド、辞書管理、テーブルサイズ管理のインターフェイスを提供します。
数値テーブルのライフサイクルは、次の主要ステップから構成されています。
次の図は、各ステップの数値テーブルの状態の間のフローおよび遷移を示しています。これらのステップの説明は、CSR のような、ライブラリーでサポートされる異なる種類の数値テーブルに適用されます。メソッド名およびそれぞれの引数は異なります。
データ辞書は、そのライフサイクル全体で数値テーブルに関連付けられます。辞書が初期化中にユーザーにより明示的に提供されない場合、数値テーブルのコンストラクターに提供されたパラメーターを使用して自動的に構築されます。
例えば、属性の数 (テーブルの列の数と同じ) を変更したことにより、数値テーブル辞書を変更する必要がある場合、そのデータを扱う数値テーブルの別のインスタンスを作成します。既存の初期化された数値テーブルについて各メソッドで辞書を変更しても、数値テーブルの内部データ構造は再割り当てされません。また、アプリケーションで予測できない結果が生じることがあります。
インテル® DAAL は、さまざまなテーブル初期化シナリオをカバーする、数値テーブル用のコンストラクターを提供します。コンストラクターには、テーブルの行と列の数または辞書が必要です。構築時に辞書がないか数値テーブルのサイズが不明な場合、デフォルトの値およびサイズでコンストラクターを使用できます。次のシナリオを利用できます。
オブジェクト構築時にテーブルサイズが不明な場合、空のテーブルを構築して、後でサイズを変更してメモリーを割り当てることができます。コンストラクターを使用してサイズを指定することもできますが、メモリーのポインターは後から提供します。
HomogenNumericTable<float> table(nColumns, nRows, NumericTable::doNnotAllocate); float data[nColumns * nRows]; table.setArray(data, nRows);
テーブルサイズがわかっていてデータがメモリーにない場合、インテル® DAAL は、オブジェクト構築時にメモリーを自動的に割り当ててメモリーを初期化する (つまり、要素がゼロの行列を割り当てる) ことができます。
HomogenNumericTable<float> table(nColumns, nRows, NumericTable::doAllocate, 0.0);
データがオブジェクト構築時までにメモリーですでに利用可能な場合、コンストラクターでこのデータのポインターを提供できます。
float data[nColumns * nRows]; HomogenNumericTable<float> table(data, nColumns, nRows);
数値テーブルの構築後にメモリーを割り当てまたは再割り当てするには、サービスメソッドを使用します。
resize()。
このメソッドは、提供されたパラメーターに従ってテーブルの行の数を変更し、後述の説明に従って処理します。
数値テーブルを初期化または再初期化した後、次のメソッドを使用して数値テーブルのデータにアクセスできます。
getBlockOfRows() および releaseBlockOfRows()。
getBlockOfRows() メソッドは、数値テーブルに格納されたデータブロックへのアクセスを提供します。rwflag 引数は読み取りまたは書き込みアクセスを指定します。要求された行のブロックをインターフェイスするメソッドに BlockDescriptor 型のオブジェクトを提供します。このオブジェクト (ブロック記述子) は、メソッドで指定された行の数と数値テーブルで指定された列の数で連続する行優先レイアウトのデータを表します。
インテル® DAAL では、数値テーブルのデータ型と異なるデータ型でブロック記述子のデータを表すことができます。例えば、同次データを float データ型で表し、ブロック記述子のデータを double で表すことができます。ブロック記述子オブジェクトの構築中に必要なデータ型を指定することができます。getBlockOfRows() メソッドを呼び出した後に releaseBlockOfRows() メソッドを呼び出していることを確認してください。数値テーブルとブロック記述子のデータ型、getBlockOfRows() メソッドの rwflag 引数が、releaseBlockOfRows() の動作を定義します。
rwflag が writeOnly または readWrite に設定されている場合、releaseBlockOfRows() はブロック記述子からのデータを数値テーブルに書き込みます。
数値テーブルとブロック記述子が異なるデータ型またはメモリーレイアウトを使用している場合、releaseBlockOfRows() は rwflag の値に関係なく割り当てられたバッファーの割り当てを解除します。
HomogenNumericTable<double> table(data, nColumns, nRows); BlockDescriptor<float> block; table.getBlockOfRows(firstReadRow, nReadRows, readOnly, block); float *array = block.getBlockPtr(); for (size_t row = 0; row < nReadRows; row++) { for (size_t col = 0; col < nColumns; col++) { std::cout << array[row * nColumns + col] << " "; } std::cout << std::endl; } table.releaseBlockOfRows(block);
getBlockOfColumnValues() および releaseBlockOfColumnValues()。
これらのメソッドは、getBlockOfRows() および releaseBlockOfRows() と同様に、数値テーブルの特定の列の値へのアクセスを提供します。
getNumberOfRows() および getNumberOfColumns()。
指定された数値テーブルに関連付けられた行と列の数を決定するには、これらのメソッドを呼び出します。
getDictionary() および resetDictionary()、getFeatureType() および getNumberOfCategories()。
これらのメソッドは、指定された数値テーブルに関連付けられたデータ辞書へのアクセスを提供します。詳細は、「データ辞書」を参照してください。
getDataMemoryStatus()。
メモリーが allocateDataMemory() メソッドで割り当てられたか、ユーザーが割り当てられたデータのポインターを提供したか、現在数値テーブルと関連付けられたデータがないかを判断するには、このメソッドを呼び出します。また、getArray() および setArray() メソッドは、指定されたレイアウトで指定されたテーブルに関連付けられたデータへのアクセスを提供します。
serialize および deserialize()。
serialize() メソッドは数値テーブルをシリアル化します。serialize() を呼び出した後、ほかのデータ・アクセス・メソッドを呼び出す前に、逆シリアル化メソッド deserialize() を呼び出します。
データリソースでの作業を完了した後、数値テーブルのデストラクターでメモリーの割り当ては暗黙的に解除されます。
ライブラリーで数値テーブル内部のデータのメモリーバッファーを内部的に割り当てまたは割り当て解除する場合、その破棄後に数値テーブルの getArray() メソッドにより返されたポインターを使用しないでください。
同次数値テーブルのデフォルトのデータ型は float です。
サンプル
C++:
Java*:
Python*: