Як працює "Четвертий вимір" з масивами?


30

Анотація:

Отже, наскільки я це розумію (хоча я розумію дуже обмежено), є три аспекти, з якими ми (як правило) працюємо фізично:

Перший буде представлений лінією.
2-я була б представлена ​​квадратом.
Третій був би представлений кубом.

Досить просто, поки ми не дістанемося до 4-го - це важко малювати в тривимірному просторі, якщо ви знаєте, що я маю на увазі ... Деякі люди кажуть, що це має щось спільне з часом .

Питання:

Зараз, хоча це не має великого сенсу, це зі мною все чудово. Моє запитання не стосується цього, або я б його задавав на 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];був би тривимірним масивом.
Грег Хьюгілл

4
"На щастя, програми не обмежені фізичними обмеженнями реального світу". Отож, чому ми маємо процесори на 4.5THz, і ніхто не переймається ієрархією пам'яті, чи не так? Це справді найсмішніша відповідь, яку я
прочитав

24
@ Manu343726 Він має на увазі той факт, що ми живемо в (теоретично) обмежених розмірах простору і часу, але масиви в пам'яті комп'ютера мають "вигляд" розмірів - все це зберігається в лінійно-суміжному просторі в пам'яті - тому вони не обмежуються кількість розмірів, в яких ми живемо. Не тролюй> :(
Blackhawk

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-й вимір не обов'язково повинен бути часом. Якщо ви думаєте про три виміри як куб, ви можете думати про 4 виміри як про ряд кубів. 5 розмірів, сітка з кубів тощо.

Ви також можете мати 3d колекцію вокселів, 4-й розмір - колір, щільність або інша властивість.

Коли ви виділяєте пам'ять для багатовимірного масиву, він просто виділяє добуток кожного розміру максимум для вашого типу даних. Якщо у вас є 3d масив або "куб" з 10 елементів у кожному вимірі, вам буде виділено 1000 елементів. Якщо зробити 4d масив з 10 елементами в 4-му вимірі, комп'ютер просто виділить 10 000. Збільшити його до 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: ВИБІРТЕ значення ВІД SensorData WHERE (patientid = 6) і (sensid = 5) і (arm = "left") та (channel = "midfreq") та (sampleindex = 338 ).

Немає нічого містичного в таблиці бази даних з п'ятьма і більше стовпцями, чи не існує?

(Я використовую індексацію на основі 1, хоча в реальному житті 0-базується набагато частіше.)

Зауважте, що я поганий хлопчик через жорстке кодування кількості зброї. Якщо мені колись дадуть фінансування на дослідження цих датчиків на восьминога, я переживаю проблеми!


3
+1 Відмінний приклад, що демонструє, що розмірами можуть бути будь-які потрібні вам дані.
Майк підтримує Моніку

20

Масив - це лише блок неперервної пам'яті. Адресація пам'яті є одновимірною, ви можете рухатися вперед або назад. Отже, якщо у вас є масив з 5 елементами, 5 блоків пам'яті буде зарезервовано. Якщо у вас є двовимірний масив з 5 елементами в кожному вимірі, 25 блоків пам'яті буде зарезервовано.


5
Так, майте це на увазі, оскільки ви додаєте більше розмірів до своїх масивів. Використання пам'яті може бути нетривіальним.
davidhaskins

18

... або я б просив це на MathSO ...

Ну, власне, математики ніколи (або принаймні не зазвичай) пов'язують четвертий вимір із чим-небудь подібним часом. Вони також не пов'язують перших трьох з будь-яким простором, як-от: математики просто визначають розмірність як абстрактну властивість, як правило, векторного простору (часто це буде узагальнено до багатозначень чи навіть метричних просторів ). І це абстрактне визначення не стосується того, скільки розмірів має фізичний простір, в якому ми маємо рухатися. Поняття розмірів стосується просторів, які навіть не нагадують фізичний простір. Насправді математики (і справді фізики) дуже часто використовують нескінченномірність простори, такі як простори квантової механіки Гільберта.

З цим уточненим давайте поговоримо з масивами - вам не потрібно розуміти векторні простори, оскільки абстрактне визначення насправді набагато простіше.

Масивний розмір ( 0 × 1 × 2 × ... × n −1 ) (тобто розмірність n ) - це просто сукупність numbers 01 ⋅ ... ⋅ n −1 чисел ( або будь-який тип об'єкта заповнює масив). Єдина відмінність одновимірного масиву такої довжини полягає в тому, що у вас є особливий корисний спосіб індексації розмірів окремо, а саме

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


Щоб було зрозуміло, вам потрібно лише масив з 3 елементами для опису 3 вимірів, а масив N елементів описує N вимірів. Однак деталізація кожного вектора - це інша історія. Часто це робиться, показуючи зображення ( imshowна Python) - воно може показувати два просторові розміри, а також третій колірний вимір.
Скотт

@Scott: Я погоджуюсь, що поняття "розмірність масиву" невдале, оскільки воно означає щось, що не має відношення до розмірності простору, вектори якого ви можете представляти масивами. (Однак я також думаю, що не дуже гарна ідея в першу чергу представляти вектори простими, необмеженими масивами.) Кращою назвою може бути ранг масиву, аналогічно тензорам .
Лише близько

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 ящики. Да! : p
Кевін Уоркман

1
О, тоді це добре. = D
Том Херд

5

Більшість аспектів цього питання вже були розглянуті, але я думаю, що це допоможе, якщо врахувати природу того чи іншого виміру. Не всі розміри є просторовими. Вимір - це контекст для вимірювання. Ось кілька прикладів:

  • Частота - колір або крок
  • Меса
  • Валентність
  • Колір (верхній кварк, нижній кварк, дивний кварк, зачарований кварк тощо)
  • Спіновий напрямок
  • Кут
  • Гучність
  • Гарячість (чилі)

"Четвертий" вимір - лише четвертий, оскільки є три просторові виміри. Простір і час ткацькі верстати великі, тому що, ну, вони маячать великі. Дуже багато в своєму обличчі. Але будь-яка вимірювана, вимірювана якість може бути виміром, якщо вимірювати її.

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


1
"Не всі розміри є просторовими." Для масивів, всі розміри є просторовими.
Римоїд

2
@Rhymoid: Для масивів жоден розмір не є властивим простором у тому, як ми думаємо про простір. : P Ми визначаємо їх, щоб вони представляли все, що ми хочемо.
cHao

@cHao Можливо, якщо ви подивитеся на семантику даних, які вони зберігають. Але на репрезентативній / синтаксичній / реалізаційній стороні речей усі розміри масиву за своєю суттю просторові. Насправді від того, від чого ви залежите, використовуйте масиви як частину алгоритму.
Римоїд

@Rhymoid: Це той самий процес мислення, який призвів до того, що це питання задавали в першу чергу. Обчислюваний розмір не робить його просторовим. Реалізуючидо того, місця немає. Є лише пам'ять, а пам'ять є одновимірною, наскільки програма знає / бачить / піклується.
cHao

@cHao: впроваджуючи, є простір, тому що також є час. Термін «витік простору» (як альтернатива «витоку пам’яті», знайдений у спільноті Haskell) не є випадковим. Той факт, що пам'ять описується як одновимірний - це спадщина BCPL.
Римоїд

4

У фізиці ми вважаємо, що кожен просторовий вимір є нескінченним, що ускладнює пошук простору для нових вимірів.

Маючи справу з кінцевими масивами, легко знайти простір.

Уявіть аркуш паперу з сіткою, надрукованою на ньому; ви можете записати деяку інформацію в кожну клітинку сітки. Це 2D масив: рядок і стовпець.

Помістіть кілька таких аркушів паперу у папку з файлами; це 3D-масив: сторінка, рядок та стовпець.

Покладіть кілька цих папок у вікно файлів. 4D масив: папка, сторінка, рядок, стовпець.

Поставте коробки у прямокутну сітку на дерев'яному піддоні. 6D масив: поле-рядок, коробка-стовпчик, папка, сторінка, рядок, стовпець.

Накладіть більше сіток ящиків поверх них. 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.