質問を正しく理解したかどうかわからないので、理解したことを述べます。
- 多次元行列を表す特定のサイズの配列があります。
- 5次元ベクトルを配列の実位置に変換したい
最初にそれをカプセル化するクラスを作成し、5 つの引数 (std::size_t、unsigned int など) で定義された operator() を提供します。この operator() は、最初に範囲をチェックする必要があります (おそらく例外をスローし、すべての引数を最終位置に変換します。
最も単純な変換は次のとおりです。
size_t position( size_t idx_r, size_t idx_l, size_t idx_rho, size_t idx_alpha, size_t idx_beta )
{
size_t pos = (((((((idx_r * dim_l) + idx_l) * dim_rho) + idx_rho) * dim_alpha) + idx_alpha) * dim_beta) + idx_beta;
return pos;
}
dim_XXXは、次元 XXX のマトリックスのサイズを表します。
多くの操作を実行している場合は、インターフェイスを変更せずに異なる順序でデータを内部的に表すことを検討して、キャッシュヒット率を向上させることをお勧めします。
一般的なアルゴリズムは、1 つの次元の各インデックスを次の次元要素に変換し、その次元にオフセットを追加します。最も簡単な例は、2 次元システムです。10 列の配列の行 3 列 2 にアクセスするには (行ごとに格納すると仮定し、引数のために 1 から数えます)、最初に 3 行目の開始点、つまり行ごとに 3 * 10 要素を計算します。次に、行 2 (列 2) 内にオフセットを追加します。
それを 3 次元配列に拡張する場合は、まず平面のインデックスに平面のサイズを掛けて探している平面を見つけ、次に前のアルゴリズムを使用する必要があります。
size_t position( size_t x, size_t y, size_t z )
{
size_t start_of_plane_z = z * dim_y * dim_x; // z * size_of_plane
size_t start_of_row_y = y * dim_x; // y * size_of_row
size_t offset_inside_row = x;
return start_of_plane_z + start_of_row_y + offset_inside_row;
}
ここで、いくつかの基本的な代数を適用して、方程式を次のように変えることができます。
size_t pos = (((z * dim_y) + y) * dim_x) + x;
これにより、乗算の数が減り、より多くの次元の定義が容易になります。