Come funziona la "Quarta dimensione" con le matrici?


30

Astratto:

Quindi, come ho capito (anche se ho una comprensione molto limitata), ci sono tre dimensioni con cui (di solito) lavoriamo fisicamente:

Il primo sarebbe rappresentato da una linea.
Il secondo sarebbe rappresentato da un quadrato.
Il terzo sarebbe rappresentato da un cubo.

Abbastanza semplice fino a quando non arriviamo al 4 ° - È un po 'difficile disegnare in uno spazio 3D, se sai cosa intendo ... Alcune persone dicono che ha qualcosa a che fare con il tempo .

La domanda:

Ora, anche se non ha molto senso, per me va benissimo. La mia domanda non riguarda questo, o lo farei su MathSO o PhysicsSO. La mia domanda è: come fa il computer a gestirlo con gli array?

So che puoi creare array 4D, 5D, 6D, ecc ... in molti linguaggi di programmazione diversi, ma voglio sapere come funziona.


66
Se 3 dimensioni possono essere visualizzate come un cubo, allora 4 dimensioni possono essere visualizzate come un gruppo di cubi in una linea. 5 dimensioni possono essere visualizzate come una griglia in cui ogni cella della griglia contiene ... un cubo! E così via ... "quarta dimensione" non ha nulla a che fare con il tempo (qualunque cosa che sia), a meno che non si definisce come tale nel contesto della semantica del vostro programma.
FrustratedWithFormsDesigner

14
In generale, puoi superare questa gobba concettuale cercando di evitare di pensare alle dimensioni come costrutti strettamente fisici. Ad esempio, alcuni problemi di apprendimento automatico possono avere una dimensionalità in centinaia di migliaia, in cui ogni dimensione è una caratteristica del set di dati.
Steven Evers,


6
Oltre al commento di Steve Evers, pensa a un tipo di dati comune: un colore RGB. Ha tre dimensioni, quindi puoi considerare lo "spazio colore" RGB. Ora aggiungi un componente alfa. Hai quattro dimensioni.
Josh Caswell,

25
Ricorda che al computer non interessa l'idea delle dimensioni geometriche: questi sono solo un dispositivo per comodità umana. Se si alloca un array 5x5x5x5, il computer alloca solo un array di 625 elementi e calcola di conseguenza gli indici.
David Zhang,

Risposte:


77

Fortunatamente, i programmi non sono limitati dai vincoli fisici del mondo reale. Le matrici non sono memorizzate nello spazio fisico, quindi il numero di dimensioni della matrice non ha importanza. Sono appiattiti nella memoria lineare. Ad esempio, un array monodimensionale con due elementi potrebbe essere strutturato come:

(0) (1)

Un array dimensionale 2x2 potrebbe quindi essere:

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

Un array tridimensionale 2x2x2 potrebbe essere:

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

Spero che tu possa vedere dove sta andando. Quattro dimensioni potrebbero essere:

(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
Le matrici di computer non sono limitate dalla comprensione o dalla visualizzazione umana, ma sono limitate da vincoli fisici, ad esempio una matrice di dimensioni d ciascuna lunghezza n prenderà n ^ d, o più in generale con dimensioni di lunghezza diversa, n1 × n2 ×… × ND.
acelent

6
@ColtonAllen: Non sono sicuro di cosa ti riferisca. La definizione di dimensione dice "In parole povere, è il numero di coordinate necessarie per specificare un punto sull'oggetto". Un array dichiarato in C come int a[2][2][2];sarebbe un array tridimensionale.
Greg Hewgill,

4
"Fortunatamente, i programmi non sono limitati dai vincoli fisici del mondo reale". Ecco perché tutti noi abbiamo processori a 4.5 THz, e nessuno si preoccupa della gerarchia della memoria, no? Questa è davvero la risposta più divertente che abbia letto ....
Manu343726,

24
@ Manu343726 Si riferisce al fatto che viviamo in dimensioni (teoricamente) limitate dello spazio e del tempo, ma le matrici nella memoria del computer hanno dimensioni "finte" - è tutto memorizzato in uno spazio linearmente contiguo nella memoria - quindi non si limitano al numero di dimensioni in cui viviamo. Non troll> :(
Blackhawk

15
@ Manu343726: Ho detto con attenzione Programmi , non Computer . Questa è una delle cose grandi del software.
Greg Hewgill,

49

Non è necessario immaginarlo in grandi dimensioni spaziali, basta pensarlo come una foglia di felce. foglia di felce

Il gambo principale è il tuo primo array, con ogni ramo che è un elemento che sta memorizzando. Se guardiamo un ramo questa è la tua seconda dimensione. Ha una struttura simile di rami più piccoli che ne arrivano rappresentando i suoi dati. Questi a loro volta hanno i loro piccoli rami che continuano fino a quando non arriviamo alle minuscole foglie che rappresentano i dati dell'array di dimensioni più interne o più alte.

Puoi vederlo crescere se dichiari ogni livello con il suo nome. Qui sto riutilizzando ogni livello possibile per minimizzare il codice:

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

1
Questa visualizzazione non rappresenterebbe più da vicino un array frastagliato?
Matt Johnson-Pint,

2
@MattJohnson Formalmente sì, ma questo esempio spiega / visualizza anche array multidimensionali.
M.Mimpen,

4
+1 questa non è solo una visualizzazione ordinata, ma più vicina alla verità rispetto alla spiegazione lineare per molte implementazioni di array. Indipendentemente dal fatto che la maggior parte delle persone qui limiterebbe il termine "array" a memoria contigua, " array multidimensionale " è certamente il termine usato per tali accordi in letteratura per molte lingue.
DeveloperInDevelopment

46

Le dimensioni sono qualunque cosa tu voglia essere, la quarta dimensione non deve necessariamente essere il tempo. Se pensi a tre dimensioni come a un cubo, puoi pensare a 4 dimensioni come a una fila di cubi. 5 dimensioni, una griglia di cubi e così via.

Potresti anche avere una collezione 3d di voxel, con una quarta dimensione che è colore, densità, o qualche altra proprietà.

Quando si alloca la memoria per l'array multidimensionale, alloca semplicemente il prodotto di ciascuna dimensione massima per il tipo di dati. Se hai una matrice 3d o un "cubo" di 10 elementi in ogni dimensione, avrai 1.000 elementi assegnati. Se si crea un array 4d con 10 elementi nella 4a dimensione, il computer ne assegnerà solo 10.000. Aumenta fino a 5 dimensioni e ne assegnerà 100.000.

Al computer non interessa alcun tipo di significato su ciò che rappresenta ogni dimensione. Per selezionare dove si trova un elenco di elementi nell'elenco, è sufficiente moltiplicare per selezionare un indirizzo di memoria.


26

Immagina di fare ricerca e sviluppo su alcuni nuovi dispositivi medici, una serie di sensori che metti lungo le braccia di un paziente. Hai sette volontari in fila per i test. Ogni sensore riporta letture a bassa, media e alta frequenza, che si prendono una volta ogni 100 ms per circa un minuto.

Come archiviare tutti quei dati in memoria per l'analisi e la stampa?

Un array, ovviamente. Sembrerebbe così (usando lo pseudocodice generico inventato):

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

È un array a cinque dimensioni e non c'è nulla di complicato, misterioso o sconcertante. Non c'è motivo di provare ad associarlo allo spazio euclideo a 5 dimensioni. Per ottenere qualsiasi valore di dati, utilizziamo un'espressione like

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

È come eseguire una query su un database relazionale in cui è presente un record per ciascun valore di dati, con cinque colonne che contengono l'ID paziente, l'ID sensore e così via e una colonna con il valore. Per ottenere un punto dati si usano cinque termini in WHERE: SELEZIONARE il valore DA SensorData DOVE (patientid = 6) e (sensorid = 5) e (arm = "left") e (channel = "midfreq") e (sampleindex = 338 ).

Non c'è nulla di mistico in una tabella di database con cinque o più colonne, vero?

(Sto usando l'indicizzazione in base 1 anche se nella vita reale, in base 0 è molto più comune.)

Nota che sono un ragazzaccio a causa della codifica del numero di armi. Se mi viene mai dato un finanziamento per indagare su questi sensori su un polipo, sono nei guai!


3
+1 Ottimo esempio che dimostra che le dimensioni possono essere tutti i dati richiesti.
Mike supporta Monica il

20

Un array è solo un blocco di memoria continua. L'indirizzamento della memoria è monodimensionale, puoi andare avanti o indietro. Quindi supponendo di avere un array con 5 elementi, saranno riservati 5 blocchi di memoria. Se si dispone di un array bidimensionale con 5 elementi in ciascuna dimensione, verranno riservati 25 blocchi di memoria.


5
Sì, tienilo a mente quando aggiungi più dimensioni ai tuoi array. L'uso della memoria potrebbe non essere banale.
Davididkins,

18

... o lo chiederei su MathSO ...

Bene, in effetti i matematici non assocerebbero mai (o almeno non di solito) una quarta dimensione a qualcosa di simile al tempo. Né assocerebbero i primi tre a qualcosa di simile allo spazio: i matematici semplicemente definiscono la dimensione come una proprietà astratta, tipicamente, di uno spazio vettoriale (spesso questo sarà generalizzato a molteplici o addirittura spazi di ). E questa definizione astratta non si preoccupa di quante dimensioni abbia lo spazio fisico in cui ci muoviamo. Il concetto di dimensioni si applica agli spazi che non assomigliano nemmeno allo spazio fisico. In effetti i matematici (e in effetti i fisici) usano molto spesso la dimensione infinita spazi metrici , come gli spazi di Hilbert della meccanica quantistica .

Con questo chiarito, parliamo di array: non è necessario comprendere gli spazi vettoriali, poiché qui la definizione astratta è in realtà molto più semplice.

Un array di dimensioni ( 0 × 1 × 2 × ... × n −1 ) (cioè della dimensione n ) è semplicemente una raccolta di 01 ⋅ ... ⋅ n −1 numeri ( o qualunque tipo di oggetto popoli l'array). L'unica differenza con una matrice unidimensionale di quella lunghezza è che hai un modo particolarmente utile di indicizzare le dimensioni separatamente, vale a dire

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


Per essere chiari, hai solo bisogno di una matrice con 3 elementi per descrivere 3 dimensioni e una matrice di elementi N descrive N dimensioni. Tuttavia, dettagliare ogni vettore è una storia diversa. Spesso, viene mostrato mostrando un'immagine ( imshowin Python): può mostrare due dimensioni spaziali e una terza dimensione di colore.
Scott,

@Scott: sono d'accordo che la nozione di "dimensione di un array" sia sfortunata perché significa qualcosa non correlato alla dimensionalità di uno spazio di cui potresti rappresentare i vettori con le matrici. (Comunque penso anche che non sia una buona idea rappresentare i vettori con array semplici e non sottratti in primo luogo.) Un nome migliore potrebbe essere il rango di un array, in analogia con i tensori .
lasciato circa il

13

Nella programmazione, le matrici sono abbastanza facili da implementare, ma forse non da capire.

In generale, ogni livello di array significa avere il contenuto n-pold. Questo significa

  • int x[4]sono 4 blocchi, ognuno contenente un int.
  • int x[5][4]sono 5 blocchi, ognuno contenente un int[4].
  • int x[3][5][4]sono 3 blocchi, ognuno contenente un int[5][4].
  • int x[2][3][5][4]sono 2 blocchi, ognuno contenente un int[3][5][4].

Il modo in cui ti riferisci a loro dipende da te, ma per una migliore comprensione, hai qualcosa di simile

  • COLUMN per l'ultimo
  • ROW per il penultimo
  • PAGE per il terzo

Fino a qui, l'ho letto da qualche parte. Per rimanere qui, possiamo anche definire

  • BOOK per il quarto
  • e forse SHELFper il quinto ultimo. (O, se preferisci, in SHELFROWmodo che possiamo continuare.)

Detto questo, non ho mai visto array con più di 4 o forse 5 dimensioni in "vita selvaggia".

In questo modo, puoi definire e immaginare int x[6][2][3][5][4]una raccolta di 6 "scaffali", ciascuno con 2 libri, ognuno con 3 pagine, ognuna con 5 righe, ognuna con 4 colonne.


13

Pensa a una matrice unidimensionale come una cassettiera:

cassettiera

Ogni cassetto è un indice dell'array. Puoi mettere quello che vuoi in ogni cassetto e, per molti scopi, ogni cassetto conterrà solo un singolo elemento (che è un array unidimensionale).

Questa cassettiera è magica, quindi non è limitata dallo spazio fisico. Ciò significa che puoi inserire un'altra cassettiera all'interno di ciascun cassetto della prima cassettiera. Le cassettiere interne possono quindi contenere tutto ciò che desideri. Questa è una matrice bidimensionale.

Quindi puoi dire qualcosa come "aprire il primo cassetto del primo cassettone, estrarre il cassettone da quel cassetto, quindi aprire il cassetto inferiore di quel secondo cassettone". Sarebbe come accedere a un indice di un array 2D: myArray [0] [3];

E, naturalmente, le cassettiere all'interno della cassettiera più esterna possono esse stesse contenere cassettiere. Questa è una matrice tridimensionale.

Quindi, la tua domanda è: cos'è una matrice quadridimensionale? È una cassettiera di cassettiere di cassettiere di cassettiere, ovviamente!

Sono i cassetti fino in fondo.


4
Sono dei cassetti fino in fondo, amico.
Thomas Eding,

8
E nell'ultima cassettiera? Tartarughe .
Kevin Workman,

Essere leggermente pedanti. Dato che ci sono 3 cassetti in ogni cassa (in base all'immagine), non 4, e stai usando un indice base 0, il cassetto inferiore sarebbe 2 non 3. Quindi invece myArray[0][3]che sarebbe myArray[0][2]. Ma per il resto una buona spiegazione.
Tom Heard,

@TomHeard La prima cassettiera ha 3 cassetti, ma la cassettiera all'interno del primo cassetto ha 4 cassetti. Duh! : p
Kevin Workman,

1
Oh allora va bene. = D
Tom Heard

5

La maggior parte degli aspetti di questa domanda sono già stati considerati, ma penso che sarà utile se si considera la natura di una dimensione. Non tutte le dimensioni sono spaziali. Una dimensione è un contesto per la misurazione. Ecco alcuni esempi:

  • Frequenza: colore o tonalità
  • Massa
  • Valenza
  • Colore (su quark, giù su quark, strano quark, quark incantato ecc.)
  • Direzione di rotazione
  • Angolo
  • rumorosità
  • Calore (di peperoncino)

La "quarta" dimensione è solo quarta perché ci sono tre dimensioni spaziali. Lo spazio e il tempo sembrano grandi perché, beh, sembrano grandi. Molto in faccia. Ma qualsiasi qualità quantificabile e misurabile può essere una dimensione se la si misura.

Ad esempio, i reggiseni hanno tre dimensioni: dimensione della tazza, dimensione del torace e interstiziale (non so come lo chiamano voi ragazze, ma intendo la distanza tra le tazze).


1
"Non tutte le dimensioni sono spaziali." Per le matrici, tutte le dimensioni sono spaziali.
Rhymoid,

2
@Rhymoid: per le matrici, nessuna dimensione è intrinsecamente spaziale nel modo in cui pensiamo allo spazio. : P Li definiamo per rappresentare ciò che vogliamo.
cHao,

@cHao Forse se guardi la semantica dei dati che memorizzano. Ma dal lato rappresentativo / sintattico / attuativo delle cose, tutte le dimensioni dell'array sono intrinsecamente spaziali. In realtà è ciò da cui si dipende quando si utilizzano gli array come parte di un algoritmo.
Rhymoid,

@Rhymoid: questo è lo stesso processo di pensiero che ha portato a porre questa domanda in primo luogo. Una dimensione enumerabile non la rende spaziale. Dal punto di vista dell'implementazione, non c'è spazio. C'è solo memoria e la memoria è monodimensionale per quanto un programma sa / vede / se ne frega.
cHao,

@cHao: in termini di implementazione, c'è spazio, perché c'è anche tempo. Il termine "perdita di spazio" (in alternativa a "perdita di memoria", trovato nella comunità di Haskell) non è un caso. Il fatto che la memoria sia descritta come monodimensionale è un'eredità di BCPL.
Rhymoid,

4

In fisica, assumiamo che ogni dimensione spaziale sia infinita, il che rende piuttosto difficile trovare spazio per nuove dimensioni.

Quando si ha a che fare con array finiti, è facile trovare spazio.

Immagina un foglio di carta con una griglia stampata su di esso; puoi scrivere alcune informazioni in ogni cella della griglia. Questo è un array 2D: riga e colonna.

Metti diversi di quei fogli di carta in una cartella di file; questo è un array 3D: pagina, riga e colonna.

Metti diverse di quelle cartelle in una casella di file. Matrice 4D: cartella, pagina, riga, colonna.

Disporre le scatole in una griglia rettangolare su un pallet di legno. 6D array: box-row, box-column, cartella, pagina, riga, colonna.

Impila più griglie di scatole sopra a quelle. Array 7D: box-depth, box-row, box-column, cartella, pagina, riga, colonna.

Inizia a riempire i pallet in un container: array 9D. (Supponendo che ogni pila sia alta come l'interno del contenitore, quindi puoi ottenere solo altre 2 dimensioni qui.)

Impilare i container sul ponte di una nave portacontainer: array 12D.

La tua flotta di navi portacontainer è ora un array 13D.


"supponiamo che ogni dimensione spaziale sia infinita" infinito non è il problema più grande qui in realtà, continuo è il problema "reale" (cioè infinitamente numerabile, e abbiamo bisogno di una mappatura omeomorfa, quindi è fisicamente significativa).
lasciato il

3

Nel sistema di coordinate cartesiane, hai gli assi xey su un piano. Puoi rappresentare qualsiasi numero sul piano come (x, y).

In tre "spazi" (altrimenti noto come cubo), puoi avere gli assi x, ye z. Puoi rappresentare qualsiasi elemento del cubo come (x, y, z).

Nello spazio multivariato, puoi avere gli assi x, y, z e, w (dove l'asse w è "immaginario"). Puoi rappresentare qualsiasi elemento di quello spazio come (x, y, z, w).

Tutti questi punti nello spazio sono indicati da vettori. In quattro spazi, puoi avere due vettori, dove v1 = (x1, y1, z1, w1) e v2 = (x2, y2, z2, w2). Quindi manipoli questi vettori come faresti con i numeri. Ad esempio, la somma dei due vettori, v1 + v2 sarebbe (x1, y1, z1, w1) + (x2, y2, z2, w2). Quindi aggiungi questi vettori termine per termine come faresti con i numeri, per ottenere: (x1 + x2, y1 + y2, z1 + z2, w1 + w2).

Il programma definirà i vettori utilizzando array appropriati e quindi eseguirà operazioni aritmetiche su di essi nell'ordine appropriato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.