Я не знаю, правильно ли я понял вопрос, поэтому скажу, что понял:
- У вас есть массив заданного размера, который представляет многомерную матрицу.
- Вы хотите преобразовать 5-мерный вектор в реальную позицию массива
Сначала я создал бы класс для его инкапсуляции, и я бы предоставил operator (), определенный с 5 аргументами (std :: size_t, unsigned int или около того). Этот оператор () должен сначала проверить диапазоны (возможно, выдать исключение и преобразовать все аргументы в конечную позицию.
Простейшим преобразованием будет:
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.
Если вы выполняете много операций, вы можете подумать о внутреннем представлении данных в другом порядке без изменения интерфейса, чтобы улучшить кэш частоту обращений.
Общий алгоритм конвертирует каждый индекс в одном измерении в следующий элемент измерения и добавляет смещение в этом измерении. Самый простой пример - система с двумя измерениями. Чтобы получить доступ к строке 3, столбцу 2 в массиве из 10 столбцов (при условии, что вы сохраняете по строкам, и для аргумента рассчитываете от 1 до) вы сначала рассчитаете начало третьей строки, то есть 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;
Это уменьшит количество умножений и будет легче определить для большего числа измерений.