![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| marcusmae |
|
||||||||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 5 Всего: 39 |
Здравствуйте, друзья,
Пока не поздно решил посоветоваться. Казалось бы, массивы - несложное дело, одна из основ. Но чем они больше и чем больше с ними работаешь, тем интереснее становится Допустим, у нас есть тензор, задающий поле вещественных значений. Для простоты, одинаковой размерности по всем направлениям. Этот тензор мог бы хранить, например, результаты работы какой-нибудь численной схемы, когда, имея трёхмерное поле значений на предыдущем шаге, требуется пересчитать значения на следующий. Пусть наша схема работает, скажем, по 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, 00:44 -------------------- ἀπὸ μηχανῆς θεός |
||||||||
|
|||||||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
Правильно. У второго варианта один недостаток - непривычный способ обращения к элементам. В частности, в С++ эта "проблема" решается классовой обёрткой так, что ты и не заметишь, что работаешь с "оптимизированным" динамическим массивом. Собственно говоря, статический массивы, размерности которых известны во время компиляции так и хранятся. Добавлено через 1 минуту и 3 секунды Кстати, в бусте такая обёрточка есть: http://boost.org/libs/multi_array/doc/user.html (если, конечно, приемлем С++ с его "тормозами" и буст с его "неповоротливостью"). -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
| marcusmae |
|
|||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 5 Всего: 39 |
archimed7592, спасибо за ответ.
Ага, в общем случае пригодится, спасибо. Для этого конекретного случая макросы очень помогли : символы типа левый, правый, центральный, верхний, нижний, ближний и дальний - _L, _R, _C, _U, _D, _F, _B.
Сразу стала видна симметрия и другие свойства алгоритма. Нашёл несколько мелких ошибок Не считаю плюсовый код сильно тормозным. Кавычки здесь по этому поводу? -------------------- ἀπὸ μηχανῆς θεός |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |