Страницы: 1
RSS
VBA. Многомерные массивы
 
Добрый день
Начал разбираться (теоретически) с массивами VBA. Возник вопрос, зачем нужны многомерные массивы, в каких задачах они используются и, собственно, как их понять?
Одномерные, максимум двумерные представить могу (одномерные - один столбец), двумерные (несколько столбцов) данных, если правильно все понял... и представить могу, и зачем они нужны, и как с ними работать (примерно).
А вот, начиная с трехмерного - вообще не представляю... Трехмерный еще как-то вижу в виде куба (смутное такое видение) данных (только вижу, а что с ним делать, зачем... не представляю)... Четырехмерный - уже полный мрак, даже некого визуального образа нет... А VBA позволяет 60-мерные  массивы  8-0   Даже страшно представить, что это... не говоря уже зачем и как с этим обращаться, в каких задачах...

Помогите, пож, понять, как их использовать, когда, как вы их видите, представляете при работе, скажем, 11-мерный массив...? С какой максимальной размерностью приходилось Вам сталкиваться и почему нельзя было обойтись в той ситуации, скажем 2-мерным массивом?  
 
Многомерный - это уже двумерный.
И один столбец (или строка) листа - это уже двумерный массив! У каждого элемента есть номер строки, и номер столбца.
А одномерный - это обычно виртуальный массив, если его выгружать на лист, то без ухищрений заполнится строка, а не столбец.
Размерностью более 2-х я практически не использую, было пару раз массив массивов, или словарь словарей/коллекций - но это понять проще, чем 11-мерный массив :)
Массив массивов можно использовать например так - представьте лист, где в первом столбце наименование фирмы, во втором в каждой ячейке список сделок этой фирмы. В массиве.
А если к каждой сделке например прикрепить список оплаченных товаров...
Вот если это взять в массив - получится "трёхэтажный" массив, но будет ли это трёхмерный массив - не знаю... :)
Изменено: Hugo - 24.03.2016 09:30:46
 
Ливиан, Вы уже поняли, зачем нужны двумерные массивы (потому что одной размерности для описания данных одного листа (плоскости) недостаточно).
Как описать в одном массиве не один лист, а всю книгу (несколько листов)?
Очевидно, приходится добавить ещё одну размерность - номер листа.
А если до кучи надо знать хронологию изменения книги - добавите 4-е измерение, время.
Мысль улавливаете. Размерности добавляются, если для описания объекта существующих координат недостаточно.
Если Вы не можете представить себе пятимерный массив физически (я, кстати, тоже), это не значит, что он не нужен - просто в нём на данный момент у нас нет необходимости.
Как-то так...
 
т.е. правильно ли я понял, массив любой размерности можно преобразовать "без потерь" в двумерный массив
Цитата
Hugo написал:
Массив массивов можно использовать например так - представьте лист, где в первом столбце наименование фирмы, во втором в каждой ячейке список сделок этой фирмы. В массиве.
А если к каждой сделке например прикрепить список оплаченных товаров...
Преобразуем в двумерный. 1 столбец - наименование фирмы, во 2 - в каждой ячейке список сделок сделки этой фирмы. В массиве, в 3 столбце - признак оплачено/не оплачено
Точно также можно и следующий пример:  
Цитата
Апострофф написал:
Как описать в одном массиве не один лист, а всю книгу (несколько листов)?
Очевидно, приходится добавить ещё одну размерность - номер листа.
А если до кучи надо знать хронологию изменения книги - добавите 4-е измерение, время.
Преобразуем в двумерный. 1 столбец - номер листа, 2 столбец - номер столбца, 3 столбец - номер строки, 4 столбец - время редактирования
Пока, получается, любой многомерный можно преобразовать в двумерный ("стандартный") массив - плоскую таблицу
А многомерный массив (больше 2-мерного) - это такая альтернатива  простой и удобной форме хранения данных (без которой можно и обойтись даже профессиональному программисту всю его карьеру, если бы другие программисты не использовали в своих кодах, которые ему придется понимать)?
Брррр....совсем запутался...
 
11-мерный массив, который можно представить и даже придумать реальное применение -
Код
Sub предки()
Dim a1(1): a1(0) = "мамка": a1(1) = "папка"
Dim a2(1, 1): a2(0, 0) = "бабка1": a2(0, 1) = "дедка1": a2(1, 0) = "бабка2": a2(1, 1) = "дедка2"
Dim a3(1, 1, 1)
a3(0, 0, 0) = "прабабка1"
'пропущено 6 позиций
a3(1, 1, 1) = "прадедка4"

'пропущено 7 поколений

Dim a11(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
a11(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) = "прапрапрапрапрапрапрапрапрабабка1"
'пропущено 2046 позиций
a11(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) = "прапрапрапрапрапрапрапрапрадедка1024"
End Sub
Изменено: Апострофф - 24.03.2016 10:37:43
 
Апострофф, пример - класс! )
 
Да, пример хорош... а перед глазами маячит двумерный массив с 11 столбцами (поколениями)... Надо попривыкнуть...
 
Не, в 11 столбцов такое трудно впихнуть... Ну разве что положить на бок генеалогическое древо...
И если заполнить все пустые ячейки - получим нормальный двумерный массив :)
 
Т.е. опять в этом примере получается, в принципе, "малой кровью" можно обойтись - двумерным массивом - плоской таблицей...
Правильно ли будет утверждение, что теоретически любую задачу, решение которой было реализовано с помощью много...многомерных массивов, можно решить и с помощью двумерного массива?  
 
Можно так:
одномерный - строка записей
двухмерный - лист
трехмерный - книга
четырехмерный - книжная полка
пятимерный - книжный шкаф
шестимерный - библиотека
семимерный - несколько библиотек
и т.д.
 
Цитата
Ливиан написал:
Правильно ли будет утверждение, что теоретически любую задачу, решение которой было реализовано с помощью много...многомерных массивов, можно решить и с помощью двумерного массива?
Не совсем.
Правильным будет утверждение, что массив любой размерности можно представить в виде ОДНОМЕРНОГО массива (именно так организована память в ПК и работа интерпретаторов, которые преобразуют наши многомерки в линейную адресацию)
 
И в итоге у каждой "строки книги" есть точный адрес, который можно записать в цепочку ячеек, т.е. можно обойтись плоской таблицей. Получается так.
 
Пример:
 
Цитата
Ливиан написал:
Правильно ли будет утверждение, что теоретически любую задачу, решение которой было реализовано с помощью много...многомерных массивов, можно решить и с помощью двумерного массива?
Для этого, на примере Andrey Belkin, все книги нужно переписать на ооочень большой лист, только вот искать что то нужное будет сложно.
Изменено: MCH - 24.03.2016 12:00:57
 
Спасибо Всем большое за Вашу помощь.
Не скажу, что все понял, но не из-за недостатка информации или ее качества, а как раз из-за количества информации :). Надо походить с этим пару дней, переварить... Если что, еще напишу  
 
Ливиан, смотрите простой пример.
Есть школа в которой, допустим, 33 класса (11*3(А,Б,В)) по 20 учеников в каждом.
Чтобы получить список учеников одного класса, используя только массивы (без словарей и коллекций) вам придётся:
для двухмерного массива - как минимум 660 раз пробежать по всем ученикам и проверить класс, объявить новый массив, размерностью в количество найденных, и ещё раз пробежать исходный массив чтобы заполнить список учеников.
для трехмерного массива - пробежать максимум 33 класса и вернуть содержимое найденного элемента массива.

П.С. Разрицу между одно, двух и многомерными массивами красиво и наглядно демонстрирует сводная таблица в сжатой, табличной или форме структуры.
Изменено: Dima S - 24.03.2016 13:06:39
 
Цитата
т.е. правильно ли я понял, массив любой размерности можно преобразовать "без потерь" в двумерный массив

Блин, вы прикалываетесь, что ли? Это вообще задача не по программированию, а по математике.
Одномерный массив - перенумерованный набор элементов.
Двумерный массив - таблица с элементами, i,j - номера строк и столбцов соответственно.
Трехмерный массив - кубическая таблица, i,j,k - номера кубических ячеек по осям x,y,z соответственно.

i,j,k - ничего не напоминает? Это орты в декартовой системе координат. Ну и теперь подумайте, зачем же нужна трехмерная система координат, если у вас уже есть двухмерная. Сможете двухмерной обойтись? Сильно сомневаюсь, но зависит от задачи.

Теперь, как преобразовать "без потерь" трехмерное пространство на плоскость? Скорее всего, никак. Но опять же, смотря что имеется в виду. Можно рассмотреть проекцию трехмерного объекта на плоскость. Но понятно, что одной и той же проекции могут соответствовать различные трехмерные объекты.

Кстати, почитайте учебник по линейной алгебре, что ли. Там по аналогии вводится и понятие n-мерного пространства для общего случая.
 
m8ogw, правила, личку читайте.
 
В VBA нет особого смысла говорить о многомерных массивах (больше 2 измерений). В своей практике я максимум использовал массивы из 2 измерений. 3 и больше - никогда не встречал. Тем более, что с интерпретируемым языком (за редким исключением) анализ многомерных массивов не построишь.

О многомерных массивах в практичных целях говорят, когда они используются в рамках DL для разных непростых компьютерных задач: распознавание голоса, компьютерное зрение, видео. Математики такие массивы называют тензорами, а 1-мерный массив (вектор) - это есть не что иное, как частный случай тензора с измерением 1.
С уважением,
Федор/Все_просто
Страницы: 1
Наверх