| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Представления многомерных массивов |
| Автор: marcusmae 30.11.2007, 00:32 | ||||||||
| Здравствуйте, друзья, Пока не поздно решил посоветоваться. Казалось бы, массивы - несложное дело, одна из основ. Но чем они больше и чем больше с ними работаешь, тем интереснее становится Допустим, у нас есть тензор, задающий поле вещественных значений. Для простоты, одинаковой размерности по всем направлениям. Этот тензор мог бы хранить, например, результаты работы какой-нибудь численной схемы, когда, имея трёхмерное поле значений на предыдущем шаге, требуется пересчитать значения на следующий. Пусть наша схема работает, скажем, по 9-точечному шаблону, то есть, для расчёта нового значения во внутренней (не граничной) точке поля (i,j,k) требуется задействовать 9 точек предыдущего поля : (i,j,k), (i-1,j,k), (i+1,j,k), (i,j-1,k), (i,j+1,k), (i,j,k-1), (i,j,k+1). Этот пересчёт как-то там работает, неважно как :
Предмет интереса - представление динамического массива и манера обхода его элементов. Первый способ состоит в простом заведении массива массивов массивов :
Работать с ним просто и удобно :
Так уж это хорошо? = Я думаю, не очень. Массив по первой звезде - это массив указателей на указатели, второй массив - тоже, и только по третьей звезде от адреса машина отсчитывает смещение и получает значение элемента. Все массивы количеством размерность в квадрате могут быть сколь угодно разбросаны в куче (и в страничной памяти), и, вероятно, при таком представлении скорость работы не самая высокая. Для сравнения - второй вариант - векторизация :
Здесь трёхмерное поле заводится как одномерный вектор, в котором строки X идут одна за одной, образовывая последовательно плоскости XY, а последовательность плоскостей является самим трёхмерным полем. Добор по указателям выглядит диковато только на первый взгляд. Можно наделать всяких хитрых и удобных макросов, и запись примет вполне читабельный вид. Вектор значений, в отличие от первого способа, непрерывен, и для перемещения по нему достаточно сложений и вычитаний. Какой из способов на Ваш взгляд лучше и почему? Правильно ли я думаю, что второе представление должно значительно быстрее работать на больших размерностях? Какие преимущества и недостатки Вы видите помимо приведённых? Как предпочитаете пользоваться многомерными массивами - может быть существуют другие способы? |
| Автор: marcusmae 30.11.2007, 18:33 | ||
| archimed7592, спасибо за ответ. Ага, в общем случае пригодится, спасибо. Для этого конекретного случая макросы очень помогли : символы типа левый, правый, центральный, верхний, нижний, ближний и дальний - _L, _R, _C, _U, _D, _F, _B.
Сразу стала видна симметрия и другие свойства алгоритма. Нашёл несколько мелких ошибок Не считаю плюсовый код сильно тормозным. Кавычки здесь по этому поводу? |