Как «Четвертое измерение» работает с массивами?


30

Аннотация:

Итак, насколько я понимаю (хотя у меня очень ограниченное понимание), есть три измерения, с которыми мы (обычно) работаем физически:

1-й будет представлен линией.
2-й будет представлен квадратом.
3-й будет представлен кубом.

Достаточно просто, пока мы не дойдем до четвертого. Трудно рисовать в трехмерном пространстве, если вы понимаете, что я имею в виду ... Некоторые люди говорят, что оно как- то связано со временем .

Вопрос:

Теперь, хотя это не имеет особого смысла, это прекрасно для меня. Мой вопрос не об этом, или я буду задавать его на MathSO или PhysicsSO. Мой вопрос: как компьютер справляется с массивами?

Я знаю, что вы можете создавать массивы 4D, 5D, 6D и т. Д. На разных языках программирования, но я хочу знать, как это работает.


66
Если 3 измерения можно представить в виде куба, то 4 измерения можно представить в виде группы кубов в линии. 5 измерений можно представить в виде сетки, где каждая ячейка в сетке содержит ... куб! И так далее ... «Четвертое измерение» не имеет ничего общего со временем (независимо от того, что есть), если не определить его как таковой в контексте семантики программы.
FrustratedWithFormsDesigner

14
В общем, вы можете преодолеть этот концептуальный горб, пытаясь не думать о измерениях как о чисто физических конструкциях. Например, некоторые проблемы машинного обучения могут иметь размерность в сотни тысяч, где каждое измерение является особенностью набора данных.
Стивен Эверс


6
В дополнение к комментарию Стива Эверса, представьте себе общий тип данных: цвет RGB. Это имеет три измерения, поэтому вы можете рассматривать RGB как «цветовое пространство». Теперь добавьте альфа-компонент. У вас есть четыре измерения.
Джош Касвелл

25
Помните, что компьютер не заботится об идее геометрических размеров - это всего лишь устройство для удобства человека. Если вы выделяете массив 5x5x5x5, компьютер просто выделяет массив из 625 элементов и соответствующим образом выполняет математические расчеты с вашими индексами.
Дэвид Чжан

Ответы:


77

К счастью, программы не ограничены физическими ограничениями реального мира. Массивы не хранятся в физическом пространстве, поэтому количество измерений массива не имеет значения. Они расплющены в линейную память. Например, одномерный массив с двумя элементами может быть представлен как:

(0) (1)

Тогда размерный массив 2x2 может быть:

(0,0) (0,1) (1,0) (1,1)

Трехмерный массив 2x2x2 может быть:

(0,0,0) (0,0,1) (0,1,0) (0,1,1) (1,0,0) (1,0,1) (1,1,0) (1,1,1)

Вы можете надеяться увидеть, куда это идет. Четыре измерения могут быть:

(0,0,0,0) (0,0,0,1) (0,0,1,0) (0,0,1,1) (0,1,0,0) (0,1,0,1) (0,1,1,0) (0,1,1,1)
(1,0,0,0) (1,0,0,1) (1,0,1,0) (1,0,1,1) (1,1,0,0) (1,1,0,1) (1,1,1,0) (1,1,1,1)

10
Компьютерные массивы не ограничены человеческим пониманием или визуализацией, но они ограничены физическими ограничениями, например, массив из d измерений, каждая из которых имеет длину n, будет принимать n ^ d или, в более общем случае, с различными измерениями длины, n1 × n2 ×… × без обозначения даты
отлично

6
@ColtonAllen: Я не совсем уверен, что вы имеете в виду. Определение размерности говорит : «Грубо говоря, это число координат , необходимых для указания точки на объекте.» Массив, объявленный в C как int a[2][2][2];3-мерный массив.
Грег Хьюгилл

4
«К счастью, программы не ограничены физическими ограничениями реального мира». Так вот почему все наши процессоры имеют тактовую частоту 4,5 ТГц, и никто не заботится об иерархии памяти, не так ли? Это действительно самый забавный ответ, который я
прочитал

24
@ Manu343726 Он имеет в виду тот факт, что мы живем (теоретически) в ограниченных измерениях пространства и времени, но массивы в памяти компьютера имеют «притворные» измерения - все они хранятся в линейно непрерывном пространстве в памяти - поэтому они не ограничиваются количество измерений, в которых мы живем. Не тролль> :(
Блэкхок

15
@ Manu343726: Я осторожно сказал Программы , а не Компьютеры . Это одна из замечательных особенностей программного обеспечения.
Грег Хьюгилл

49

Вам не нужно представлять в больших пространственных измерениях, просто думайте об этом как лист папоротника. лист папоротника

Главный стебель - это ваш первый массив, где каждая ветвь является элементом, который он хранит. Если мы посмотрим на ветку, это ваше второе измерение. Он имеет похожую структуру небольших ветвей, представляющих его данные. Они, в свою очередь, имеют свои собственные небольшие ветви, которые продолжаются до тех пор, пока мы не доберемся до крошечных листьев, представляющих данные самого внутреннего или самого высокого размерного массива.

Вы можете увидеть это построение, если объявите каждый уровень своим именем. Здесь я повторно использую каждый переменный уровень, чтобы минимизировать код:

leaf = 2;
tinyBranch = [leaf, leaf, leaf];
middleBranch = [tinyBranch, tinyBranch, tinyBranch];
bigBranch = [middleBranch, middleBranch, middleBranch];
mainBranch = [bigBranch, bigBranch, bigBranch];

1
Разве эта визуализация не будет более точно представлять зубчатый массив?
Мэтт Джонсон-Пинт

2
@MattJohnson Формально да, но этот пример также объясняет / визуализирует многомерные массивы.
М.Мимпен

4
+1 это не только аккуратная визуализация, но и ближе к истине, чем линейное объяснение для многих реализаций массивов. Независимо от того, будет ли большинство людей здесь ограничивать термин «массив» непрерывной памятью, «многомерный массив » - это, безусловно, термин, используемый для таких соглашений в литературе для многих языков.
DeveloperInDevelopment

46

Измерения - это то, чем вы хотите быть, 4-е измерение не обязательно должно быть временем. Если вы думаете о трех измерениях как о кубе, вы можете думать о четырех измерениях как о ряду кубов. 5 размеров, сетка из кубиков и тд.

Вы также можете иметь 3d коллекцию вокселей, с 4-м измерением, являющимся цветом, или плотностью, или некоторым другим свойством.

Когда вы выделяете память для вашего многомерного массива, он просто просто выделяет произведение каждого измерения максимально для вашего типа данных. Если у вас есть трехмерный массив или «куб» из 10 элементов в каждом измерении, вам будет выделено 1000 элементов. Если вы сделаете этот массив 4d с 10 элементами в 4-м измерении, компьютер просто выделит 10000. Увеличьте его до 5 измерений, и он выделит 100 000.

Компьютер не заботится о каком-либо значении того, что представляет каждое измерение. Чтобы выбрать, где в списке элементов находится одна точка, просто умножьте, чтобы выбрать адрес памяти.


26

Представьте себе, что вы проводите НИОКР на каком-то новом медицинском устройстве, серии датчиков, которые вы надеваете на руки пациента. У вас есть семь добровольцев, выстроенных в очередь для тестирования. Каждый датчик сообщает о низкочастотных, среднечастотных и высокочастотных показаниях, которые вы принимаете каждые 100 мс в течение минуты.

Как сохранить все эти данные в памяти для анализа и построения графиков?

Массив, очевидно. Это выглядело бы так (с использованием готового универсального псевдокода):

npatients = 7
nsensors = 4     // number of sensors on an arm
nchannels = 3
nsamples = 60.0 / 0.1
sensordata = Array[ npatients, nsensors, 2, nchannels, nsamples ]

Это пятимерный массив, и в этом нет ничего хитрого, таинственного или сбивающего с толку. Нет причин пытаться связать его с 5-мерным евклидовым пространством. Чтобы получить любое значение данных, мы используем выражение

x = sensordata[6, 5, 1, 2, 338)

Это как запрос к реляционной базе данных, в которой у вас есть запись для каждого значения данных: пять столбцов содержат идентификатор пациента, идентификатор датчика и т. Д., А также столбец со значением. Чтобы получить одну точку данных, вы используете пять терминов в WHERE: значение SELECT FROM SensorData WHERE (patientid = 6) и (sensorid = 5) и (arm = "left") и (channel = "midfreq") и (sampleindex = 338 ).

В таблице базы данных с пятью или более столбцами нет ничего мистического, не так ли?

(Я использую индексирование на основе 1, хотя в реальной жизни 0-основание встречается гораздо чаще.)

Обратите внимание, что я плохой мальчик из-за жесткого кодирования количества рук. Если мне когда-нибудь дадут финансирование на исследование этих датчиков на осьминоге, у меня проблемы!


3
+1 Отличный пример, демонстрирующий, что измерениями могут быть любые данные, которые вам нужны.
Майк поддерживает Монику

20

Массив - это только блок непрерывной памяти. Адресация памяти является одномерной, вы можете идти вперед или назад. Итак, если у вас есть массив с 5 элементами, 5 блоков памяти будут зарезервированы. Если у вас есть двумерный массив с 5 элементами в каждом измерении, 25 блоков памяти будут зарезервированы.


5
Да, имейте это в виду, когда вы добавляете больше измерений в свои массивы. Использование памяти может быть не тривиальным.
Давидхаскинс

18

... или я бы спросил об этом на MathSO ...

Ну, на самом деле математики никогда (или, по крайней мере, обычно) не связывают четвертое измерение с чем-то вроде времени. Также они не будут ассоциировать первые три с чем-то вроде пространства: математики просто определяют измерение как абстрактное свойство, как правило, векторного пространства (часто это обобщается на многообразия или даже метрические пространства ). И это абстрактное определение не заботится о том, сколько измерений имеет физическое пространство, в которое мы попадаем. Концепция измерений применима к пространствам, которые даже не похожи на физическое пространство. На самом деле математики (и действительно физики) очень часто используют бесконечномерный пространства, такие как гильбертовы пространства квантовой механики.

С этим пояснением давайте поговорим о массивах - вам не нужно понимать векторные пространства, поскольку абстрактное определение здесь на самом деле намного проще.

( 0 × 1 × 2 × ... × п -1 ) -sized массив (т.е. размерности п ) просто сборник л 0л 1 ⋅ ... ⋅ п -1 числа ( или любой тип объекта заполняет массив). Единственное отличие от одномерного массива такой длины состоит в том, что у вас есть особый полезный способ индексации размеров отдельно, а именно

i lin = i n − 1 + n − 1 ⋅ ( i n −2 + n − 1 ⋅ (... 2 ⋅ ( i 1 + 1i 0 ) ...))


Чтобы было понятно, вам нужен только массив с 3 элементами для описания 3 измерений, а массив из N элементов описывает N измерений. Однако детализация каждого вектора - это отдельная история. Часто это делается путем показа изображения ( imshowв Python) - оно может показывать два пространственных измерения, а также третье измерение цвета.
Скотт

@ Скотт: Я согласен, что понятие «размерность массива» является неудачным, потому что оно означает нечто, не имеющее отношения к размерности пространства, векторы которого вы можете представлять в массивах. (Однако я также думаю, что не очень хорошая идея представлять векторы простыми, неабстрагированными массивами, во-первых.) Лучшим именем может быть ранг массива по аналогии с тензорами .
Оставлено около

13

В программировании массивы довольно легко реализовать, но, возможно, не понять.

Как правило, каждый уровень массивов означает, что его содержание nскладывается. Это означает

  • int x[4]4 блока, каждый из которых содержит int.
  • int x[5][4]5 блоков, каждый из которых содержит int[4].
  • int x[3][5][4]3 блока, каждый из которых содержит int[5][4].
  • int x[2][3][5][4]2 блока, каждый из которых содержит int[3][5][4].

Как вы относитесь к ним, зависит от вас, но для лучшего понимания у вас есть что-то вроде

  • COLUMN за последний
  • ROW для второго по последнему
  • PAGE за третий последний

До этого я где-то читал. Чтобы остаться здесь, мы можем также определить

  • BOOK за четвертый последний
  • и, может быть, SHELFдля пятого последнего. (Или, если хотите, SHELFROWчтобы мы могли продолжить.)

Тем не менее, я никогда не видел массив с более чем 4 или, может быть, 5 измерениями в «дикой жизни».

Таким образом, вы можете определить и представить int x[6][2][3][5][4]себе набор из 6 «полок», каждая из которых имеет 2 книги, каждая из которых имеет 3 страницы, каждая имеет 5 строк, каждая из которых имеет 4 столбца.


13

Думайте об одномерном массиве как о комоде:

комод

Каждый ящик является индексом массива. Вы можете поместить все, что вы хотите, в каждый ящик, и для многих целей каждый ящик будет содержать только один элемент (это одномерный массив).

Этот комод магический, поэтому он не ограничен физическим пространством. Это означает, что вы можете положить еще один комод в каждый ящик первого комода. Внутренние комоды могут содержать все, что вы хотите. Это двумерный массив.

Таким образом, вы можете сказать что-то вроде: «откройте верхний ящик первого комода, достаньте комод из этого ящика, затем откройте нижний ящик этого второго комода». Это было бы похоже на доступ к индексу двумерного массива: myArray [0] [3];

И, конечно же, комоды внутри самого внешнего комода могут сами содержать комоды. Это трехмерный массив.

Итак, ваш вопрос: что такое четырехмерный массив? Это комод комодов, комодов комодов, комодов, конечно!

Это ящики полностью вниз.


4
Это комоды внизу, чувак.
Томас Эдинг

8
А в последнем комоде? Черепахи .
Кевин Воркман

Быть слегка педантичным. Учитывая, что в каждом сундуке 3 ящика (в зависимости от рисунка), а не 4, и вы используете базовый индекс 0, нижний ящик будет 2, а не 3. Так что вместо myArray[0][3]него будет myArray[0][2]. Но в остальном хорошее объяснение.
Том Херд

@TomHeard У первого комода есть 3 ящика, но у комода внутри первого ящика есть 4 ящика. Duh! : p
Кевин Воркман

1
О, тогда это хорошо. = D
Том Херд

5

Большинство аспектов этого вопроса уже были рассмотрены, но я думаю, что это поможет, если вы рассмотрите природу измерения. Не все измерения пространственные. Измерение - это контекст для измерения. Вот некоторые примеры:

  • Частота - цвет или высота
  • масса
  • Валентность
  • Цвет (вверх кварка, вниз кварка, странного кварка, очарованного кварка и т. Д.)
  • Направление вращения
  • Угол
  • громкость
  • Жаркость (чили)

«Четвертое» измерение - только четвертое, потому что есть три пространственных измерения. Пространство и время кажутся большими, потому что, ну, они кажутся большими. Очень сильно в твоем лице. Но любое измеряемое, измеримое качество может быть измерением, если вы его измеряете.

Например, бюстгальтеры имеют три измерения: размер чашки, размер груди и междоузлия (я не знаю, как вы, девочки, называете это, но я имею в виду расстояние между чашками).


1
«Не все измерения пространственные». Для массивов все измерения являются пространственными.
Рифмоид

2
@Rhymoid: Для массивов никакие измерения не являются пространственно- естественными в нашем понимании пространства. : P Мы определяем их, чтобы представлять все, что мы хотим.
Цао

@cHao Может быть, если вы посмотрите на семантику данных, которые они хранят. Но на стороне представления / синтаксиса / реализации все измерения массива по своей природе пространственные. Это на самом деле то, от чего вы зависите, когда используете массивы как часть алгоритма.
Рифмоид

@Rhymoid: Это тот же мыслительный процесс, который привел к тому, что этот вопрос задавался в первую очередь. Перечислимое измерение не делает его пространственным. Внедрение, нет места. Есть только память, а память одномерна, насколько программа знает / видит / заботится.
Цао

@cHao: для реализации есть место, потому что есть и время. Термин «утечка пространства» (как альтернатива «утечка памяти», найденная в сообществе Haskell) не является совпадением. Тот факт, что память описывается как одномерный, является наследием BCPL.
Рифмоид

4

В физике мы предполагаем, что каждое пространственное измерение бесконечно, что затрудняет поиск пространства для новых измерений.

Имея дело с конечными массивами, легко найти место.

Представьте себе лист бумаги с напечатанной на нем сеткой; Вы можете написать некоторую информацию в каждой ячейке сетки. Это 2D массив: строка и столбец.

Поместите несколько из этих листов бумаги в папку с файлами; это трехмерный массив: страница, строка и столбец.

Поместите несколько из этих папок в поле файла. 4D массив: папка, страница, строка, столбец.

Расставьте ящики в прямоугольной сетке на деревянном поддоне. 6D массив: box-row, box-column, папка, страница, строка, столбец.

Сложите больше сеток коробок сверху тех. 7D массив: глубина коробки, коробка-строка, коробка-столбец, папка, страница, строка, столбец.

Начните складывать поддоны в транспортировочный контейнер: массив 9D. (Предполагая, что каждая пачка имеет такую ​​же высоту, как и внутренняя часть контейнера, вы можете получить здесь только 2 измерения.)

Сложите транспортные контейнеры на палубу контейнеровоза: массив 12D.

Ваш флот контейнеровозов теперь является массивом 13D.


«Мы предполагаем, что каждое пространственное измерение бесконечно». На самом деле бесконечность здесь не самая большая проблема , непрерывная - это «реальная» проблема (т. е. бесконечно исчисляемая бесконечно, и нам нужно гомеоморфное отображение, чтобы оно было физически значимым).
Оставлено около

3

В декартовой системе координат у вас есть оси X и Y на плоскости. Вы можете представить любое число на плоскости как (x, y).

В трехпространстве (иначе называемом кубом) вы можете иметь оси x, y и z. Вы можете представить любой элемент куба как (x, y, z).

В многомерном пространстве вы можете иметь оси x, y, z и, w (где ось w является «мнимой»). Вы можете представить любой элемент этого пространства как (x, y, z, w).

Все эти точки в пространстве обозначены векторами. В четырехмерном пространстве вы можете иметь два вектора, где v1 = (x1, y1, z1, w1) и v2 = (x2, y2, z2, w2). Затем вы управляете этими векторами, как числами. Например, сумма двух векторов, v1 + v2 будет (x1, y1, z1, w1) + (x2, y2, z2, w2). Затем вы добавляете эти векторы по порядку, как числа, чтобы получить: (x1 + x2, y1 + y2, z1 + z2, w1 + w2).

Ваша программа определит векторы, используя соответствующие массивы, а затем выполнит арифметические операции с ними в соответствующем порядке.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.