Come funziona la "Quarta dimensione" con gli array?

30

Abstract:

Quindi, a quanto 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 2 ° sarebbe rappresentato da un quadrato.
Il terzo sarebbe rappresentato da un cubo.

Semplice abbastanza da arrivare al 4 - È piuttosto difficile disegnare uno spazio 3D, se sai cosa intendo ... Alcuni dicono che ha qualcosa a che fare con il tempo .

La domanda:

Ora, anche se questo non ha molto senso, è tutto fantastico con me. La mia domanda non è su questo, o lo chiederei su MathSO o PhysicsSO. La mia domanda è: Come funziona il computer con gli array?

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

    
posta Questionmark 02.07.2014 - 23:24
fonte

11 risposte

77

Fortunatamente, i programmi non sono limitati dai vincoli fisici del mondo reale. Gli array non sono memorizzati nello spazio fisico, quindi il numero di dimensioni dell'array non ha importanza. Sono appiattiti nella memoria lineare. Ad esempio, una matrice monodimensionale con due elementi potrebbe essere presentata come:

(0) (1)

Una matrice 2x2 dimensionale 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)

Puoi sperare di vedere dove sta andando. Le 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)
    
risposta data 02.07.2014 - 23:32
fonte
49

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

Il gambo principale è il tuo primo array, ogni ramo è un oggetto che sta memorizzando. Se guardiamo un ramo questa è la tua seconda dimensione. Ha una struttura simile di rami più piccoli provenienti da esso che rappresenta i suoi dati. Questi a loro volta hanno i loro piccoli rami che continuano fino ad arrivare alle minuscole foglie che rappresentano i dati della matrice più interna o più alta.

Puoi vedere questo edificio 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];
    
risposta data 03.07.2014 - 02:58
fonte
46

Le dimensioni sono ciò che vuoi essere, la 4a dimensione non deve necessariamente essere il tempo. Se pensi a tre dimensioni come un cubo, puoi pensare a 4 dimensioni come una fila di cubi. 5 dimensioni, una griglia di cubi e così via.

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

Quando si assegna la memoria per il proprio array multidimensionale, si limita semplicemente ad allocare il prodotto di ogni dimensione massima per il proprio tipo di dati. Se hai una matrice 3d o un "cubo" di 10 elementi in ogni dimensione, avrai 1.000 elementi allocati. Se si realizza un array 4d con 10 elementi nella quarta dimensione, il computer assegna solo 10.000. Aumentalo fino a 5 dimensioni e assegnerà 100.000.

Il computer non si preoccupa di alcun tipo di significato su ciò che rappresenta ogni dimensione. Per selezionare la posizione dell'elenco degli elementi, è sufficiente la moltiplicazione per selezionare un indirizzo di memoria.

    
risposta data 02.07.2014 - 23:38
fonte
25

Immagina di fare R & D su qualche nuovo dispositivo medico, una serie di sensori che metti tra le braccia di un paziente. Hai sette volontari in fila per i test. Ogni sensore riporta letture a bassa frequenza, a media frequenza e ad alta frequenza, che si prendono una volta ogni 100ms per circa un minuto.

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

Un array, ovviamente. Sarebbe come questo (usando 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 ]

Questo è un array a cinque dimensioni, e non c'è nulla di complicato, misterioso o sconcertante in proposito. Non c'è motivo di provare ad associarlo con lo spazio euclideo a 5 dimensioni. Per ottenere qualsiasi valore di un dato, usiamo un'espressione come

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

È come eseguire query su un database relazionale in cui si dispone di un record per ogni valore di dati, con cinque colonne contenenti ID paziente, ID sensore e così via e una colonna con il valore. Per ottenere un punto dati, utilizzare cinque termini nel WHERE: SELECT valore FROM SensorData WHERE (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 basata su 1 anche se nella vita reale, 0-based è molto più comune.)

Nota che sono un ragazzaccio a causa del duro codificare il numero di braccia. Se ho mai dato un finanziamento per indagare su questi sensori su un polipo, sono nei guai!

    
risposta data 03.07.2014 - 03:22
fonte
20

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

    
risposta data 02.07.2014 - 23:32
fonte
18

...or I'd be asking it on MathSO...

Beh, in effetti i matematici mai (o almeno non di solito) associano una quarta dimensione a qualcosa come il tempo. Né avrebbero associato i primi tre con qualcosa di simile: i matematici semplicemente definiscono la dimensione come proprietà astratta di, tipicamente, un spazio vettoriale (spesso questo sarà generalizzato a varietà o eventi spazi metrici ). E questa definizione astratta non si preoccupa di quante dimensioni ha lo spazio fisico in cui ci imbattiamo. Il concetto di dimensioni si applica agli spazi che non assomigliano nemmeno allo spazio fisico. Infatti, i matematici (e in effetti i fisici) usano molto spesso spazi di infinito-dimensionale , come gli spazi di Hilbert della meccanica quantistica.

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

An ( & ell; 0 × & ell; 1 × & ell; 2 × ... × & ell; n -1 ) - dimensioni array (cioè di dimensione n ) è semplicemente una raccolta di & ell; 0 & ell; 1 ⋅ ... ⋅ & ell; n -1 numeri (o qualsiasi tipo di oggetto popola il array). L'unica differenza con un array unidimensionale di tale lunghezza è che hai un modo particolarmente utile di indicizzare le dimensioni separatamente, cioè

i lin = i n -1 + & amp ; ell; n -1 ⋅ ( i n -2 + & ell; n -1 ⋅ (... & ell; 2 ⋅ ( i 1 + & ell; 1 i 0 ) ...))

    
risposta data 03.07.2014 - 02:58
fonte
13

Nella programmazione, gli array sono abbastanza facili da implementare, ma forse non da capire.

Generalmente, ogni livello di array significa avere il contenuto n -fold. Ciò significa

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

Come ti stai riferendo a loro dipende da te, ma per una migliore comprensione, hai qualcosa come

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

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

  • BOOK per il penultimo quarto
  • e forse SHELF per il quinto ultimo. (Oppure, se preferisci, SHELFROW in modo che possiamo continuare.)

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

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

    
risposta data 03.07.2014 - 08:02
fonte
13

Pensa a una matrice monodimensionale come una cassettiera:

Ognicassettoèunindicedell'array.Puoimetteretuttociòchevuoiinognicassetto,epermoltiscopi,ognicassettoconterràsolounsingolooggetto(èunarrayunidimensionale).

Questocassettoneèmagico,quindinonèlimitatodallospaziofisico.Ciòsignificachepuoiinserireun'altracassettieraall'internodiciascuncassettodellaprimacassettiera.Icassettiinternideicassettipossonoquindicontenerequalsiasicosatuvoglia.Questaèunamatricebidimensionale.

Quindipuoidirequalcosacome"apri il primo cassetto del primo cassettone, estrai il cassettone dal cassetto, quindi apri il cassetto inferiore del secondo cassettone". Sarebbe come accedere a un indice di un array 2D: myArray [0] [3];

E, naturalmente, i cassettoni all'interno del cassettone più esterno possono essi stessi contenere casse di cassetti. Questa è una matrice tridimensionale.

Quindi la tua domanda è: cos'è un array quadridimensionale? È un cassettone di cassettoni di cassettoni di cassettoni, naturalmente!

Sono i cassetti verso il basso.

    
risposta data 03.07.2014 - 18:08
fonte
5

La maggior parte degli aspetti di questa domanda è già stata presa in considerazione, ma penso che sarà di aiuto 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 intonazione
  • Messa
  • Valence
  • Colore (quark up, quark down, quark strano, quark incantato, ecc.)
  • Senso di rotazione
  • Angolo
  • Loudness
  • Calore (del peperoncino)

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

Per esempio, i reggiseni hanno tre dimensioni: misura della coppa, taglia toracica e interstiziale (non so come la chiamano le ragazze, ma intendo la distanza tra le tazze).

    
risposta data 05.07.2014 - 13:27
fonte
4

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

Quando si tratta di matrici finite, è 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 molti di quei fogli di carta in una cartella di file; questa è una matrice 3D: pagina, riga e colonna.

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

Disporre le scatole in una griglia rettangolare su un pallet di legno. Array 6D: casella-riga, casella-colonna, cartella, pagina, riga, colonna.

Impila più griglie di scatole sopra a quelle. 7D array: box-depth, box-row, box-column, folder, page, row, column.

Inizia a riempire i pallet in un container di spedizione: array 9D. (Supponendo che ogni pila sia alta quanto l'interno del contenitore, in questo modo puoi ottenere solo altre 2 quote qui.)

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

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

    
risposta data 04.07.2014 - 00:29
fonte
3

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

In three- "space" (altrimenti noto come cubo), puoi avere gli assi x, yez. 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 denotati 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 aggiungete questi vettori per termini come se fossero numeri, per ottenere: (x1 + x2, y1 + y2, z1 + z2, w1 + w2).

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

    
risposta data 03.07.2014 - 22:00
fonte

Leggi altre domande sui tag