Bagaimana cara "Dimensi Keempat" bekerja dengan array?

30

Abstrak:

Jadi, seperti yang saya pahami (walaupun saya memiliki pemahaman yang sangat terbatas), ada tiga dimensi yang kami (biasanya) kerjakan secara fisik:

Yang pertama akan diwakili oleh garis.
Yang ke-2 akan diwakili oleh kotak.
Yang ke-3 akan diwakili oleh kubus.

Cukup sederhana sampai kita sampai ke 4 - Agak sulit untuk menggambar dalam ruang 3D, jika Anda tahu apa yang saya maksud ... Beberapa orang mengatakan itu ada hubungannya dengan waktu .

Pertanyaan:

Sekarang, meskipun itu tidak masuk akal, itu semua baik bagi saya. Pertanyaan saya bukan tentang ini, atau saya akan menanyakannya pada MathSO atau PhysicsSO. Pertanyaan saya adalah: Bagaimana komputer menangani ini dengan array?

Saya tahu bahwa Anda dapat membuat array 4D, 5D, 6D, dll ... dalam banyak bahasa pemrograman yang berbeda, tetapi saya ingin tahu cara kerjanya.

Tanda tanya
sumber
66
Jika 3 dimensi dapat divisualisasikan sebagai kubus, maka 4 dimensi dapat divisualisasikan sebagai sekelompok kubus dalam satu garis. 5 dimensi dapat divisualisasikan sebagai kisi di mana setiap sel di kisi berisi ... sebuah kubus! Dan seterusnya ... "Dimensi Keempat" tidak ada hubungannya dengan waktu (apa pun itu ), kecuali jika Anda mendefinisikannya dalam konteks semantik program Anda.
FrustratedWithFormsDesigner
14
Secara umum, Anda dapat mengatasi punuk konseptual ini dengan mencoba menghindari memikirkan dimensi sebagai konstruksi fisik semata. Sebagai contoh, beberapa masalah pembelajaran mesin dapat memiliki dimensi dalam ratusan ribu, di mana setiap dimensi adalah fitur dari dataset.
Steven Evers
6
Lebih jauh ke komentar Steve Evers, pikirkan tipe data umum: warna RGB. Ini memiliki tiga dimensi, sehingga Anda dapat mempertimbangkan RGB "ruang warna". Sekarang tambahkan komponen alfa. Anda memiliki empat dimensi.
Josh Caswell
25
Ingatlah bahwa komputer tidak peduli dengan ide dimensi geometris - itu hanya perangkat untuk kenyamanan manusia. Jika Anda mengalokasikan array 5x5x5x5, komputer hanya mengalokasikan 625 elemen array dan melakukan matematika dengan indeks Anda sesuai.
David Zhang

Jawaban:

77

Untungnya, program tidak dibatasi oleh kendala fisik dari dunia nyata. Array tidak disimpan dalam ruang fisik, sehingga jumlah dimensi array tidak masalah. Mereka diratakan menjadi memori linier. Misalnya, array dimensi tunggal dengan dua elemen dapat ditata sebagai:

(0) (1)

Array 2x2 mungkin menjadi:

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

Array 2x2x2 tiga dimensi mungkin:

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

Semoga Anda bisa melihat ke mana arah ini. Empat dimensi mungkin:

(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)
Greg Hewgill
sumber
10
Array komputer tidak dibatasi oleh pemahaman manusia atau visualisasi, tetapi mereka dibatasi oleh kendala fisik, misalnya array dimensi d masing-masing panjang n akan mengambil n ^ d, atau lebih umum dengan dimensi panjang yang berbeda, n1 × n2 ×… × nd.
acelent
6
@ ColtonAllen: Saya tidak yakin apa yang Anda maksud. The definisi dimensi mengatakan "Secara kasar, itu adalah jumlah koordinat yang dibutuhkan untuk menentukan titik pada objek." Array dideklarasikan dalam C sebagai int a[2][2][2];array 3 dimensi.
Greg Hewgill
4
"Untungnya, program tidak dibatasi oleh kendala fisik dari dunia nyata" Jadi, itulah mengapa kita memiliki prosesor pada 4.5THz, dan tidak ada yang peduli tentang hirarki memori, bukan? Ini benar-benar jawaban paling lucu yang pernah saya
baca
24
@ Manu343726 Dia merujuk pada kenyataan bahwa kita hidup dalam (secara teoritis) dimensi terbatas ruang dan waktu, tetapi array dalam memori komputer memiliki dimensi "pura-pura" - semuanya disimpan dalam ruang yang bersebelahan secara linear dalam memori - sehingga tidak terbatas pada jumlah dimensi tempat tinggal kita. Jangan troll> :(
Blackhawk
15
@ Manu343726: Saya hati-hati mengatakan Program , bukan Komputer . Itu salah satu hal hebat tentang perangkat lunak.
Greg Hewgill
49

Anda tidak perlu membayangkan dalam dimensi spasial yang tinggi, anggap saja sebagai daun pakis. daun pakis

Tangkai utama adalah larik pertama Anda, dengan setiap cabang menjadi item yang disimpannya. Jika kami melihat cabang, ini adalah dimensi kedua Anda. Ini memiliki struktur serupa cabang yang lebih kecil yang datang mewakili data. Ini pada gilirannya memiliki cabang kecil mereka sendiri yang berlanjut sampai kita sampai pada daun kecil yang mewakili data dari array dimensi paling dalam atau tertinggi.

Anda dapat melihat bangunan ini jika Anda mendeklarasikan setiap level dengan namanya sendiri. Di sini saya menggunakan kembali setiap variabel level untuk meminimalkan kode:

leaf = 2;
tinyBranch = [leaf, leaf, leaf];
middleBranch = [tinyBranch, tinyBranch, tinyBranch];
bigBranch = [middleBranch, middleBranch, middleBranch];
mainBranch = [bigBranch, bigBranch, bigBranch];
n00begon
sumber
1
Bukankah visualisasi ini lebih dekat mewakili array bergerigi?
Matt Johnson-Pint
2
@MattJohnson Secara resmi ya, tetapi contoh ini tidak menjelaskan / memvisualisasikan array multi-dimensi juga.
M.Mimpen
4
+1 ini bukan hanya visualisasi yang rapi, tetapi lebih dekat dengan kebenaran daripada penjelasan linear untuk banyak implementasi array. Apakah sebagian besar orang di sini akan membatasi istilah "array" ke memori yang berdekatan, " array multidimensi " tentu saja istilah yang digunakan untuk pengaturan semacam itu dalam literatur untuk banyak bahasa.
DeveloperInDevelopment
46

Dimensinya adalah apa pun yang Anda inginkan, dimensi ke-4 tidak harus berupa waktu. Jika Anda menganggap tiga dimensi sebagai kubus, Anda dapat menganggap 4 dimensi sebagai deretan kubus. 5 dimensi, kotak kubus, dan sebagainya.

Anda juga bisa memiliki koleksi voxel 3d, dengan dimensi ke-4 berupa warna, atau kepadatan, atau properti lainnya.

Ketika Anda mengalokasikan memori untuk array multidimensi Anda, itu hanya cukup mengalokasikan produk dari setiap dimensi maksimum untuk tipe data Anda. Jika Anda memiliki larik 3d atau 'kubus' dari 10 elemen di setiap dimensi, Anda akan memiliki 1.000 elemen yang dialokasikan. Jika Anda membuat array 4d dengan 10 elemen di dimensi 4, komputer hanya akan mengalokasikan 10.000. Bump hingga 5 dimensi, dan akan mengalokasikan 100.000.

Komputer tidak peduli tentang makna apa pun tentang apa yang masing-masing dimensi wakili. Untuk memilih di mana dalam daftar elemen satu titik, itu hanya perkalian untuk memilih alamat memori.

Apa namanya
sumber
26

Bayangkan melakukan R&D pada beberapa perangkat medis baru, serangkaian sensor yang Anda letakkan di lengan pasien. Anda memiliki tujuh sukarelawan yang disiapkan untuk pengujian. Setiap sensor melaporkan pembacaan frekuensi rendah, frekuensi menengah, dan frekuensi tinggi, yang Anda ambil sekali setiap 100 ms selama sekitar satu menit.

Bagaimana cara menyimpan semua data dalam memori untuk analisis dan perencanaan?

Jelas sebuah array. Akan terlihat seperti ini (menggunakan pseudocode generik buatan):

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

Itu array lima dimensi, dan tidak ada yang rumit, misterius atau membingungkan tentang hal itu. Tidak ada alasan untuk mencoba menghubungkannya dengan ruang Euclidean 5 dimensi. Untuk mendapatkan nilai satu data, kami menggunakan ekspresi seperti

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

Itu seperti menanyakan basis data relasional di mana Anda memiliki catatan untuk setiap nilai data, dengan lima kolom memegang id pasien, id sensor dan sebagainya, dan sebuah kolom dengan nilai. Untuk mendapatkan satu titik data, Anda menggunakan lima istilah di WHERE: SELECT value FROM SensorData WHERE (patientid = 6) dan (sensorid = 5) dan (arm = "left") dan (channel = "midfreq") dan (sampleindex = 338 ).

Tidak ada yang mistis tentang tabel database dengan lima kolom atau lebih, kan?

(Saya menggunakan pengindeksan berbasis 1 meskipun dalam kehidupan nyata, berbasis 0 jauh lebih umum.)

Perhatikan bahwa saya adalah anak nakal karena sulit mengkodekan jumlah lengan. Jika saya pernah diberi dana untuk menyelidiki sensor ini pada gurita, saya dalam kesulitan!

Sayang
sumber
3
+1 Contoh luar biasa yang menunjukkan bahwa dimensi dapat berupa data apa pun yang Anda butuhkan.
Mike Mendukung Monica
20

Array hanya blok memori kontinu. Pengalamatan memori satu dimensi, Anda bisa maju atau mundur. Jadi dengan asumsi Anda memiliki array dengan 5 elemen, 5 blok memori akan dicadangkan. Jika Anda memiliki larik 2 dimensi dengan 5 elemen di setiap dimensi, 25 blok memori akan dicadangkan.

Zillolo
sumber
5
Ya, ingatlah ini saat Anda menambahkan lebih banyak dimensi ke array Anda. Penggunaan memori mungkin tidak sepele.
davidhaskins
18

... atau saya akan menanyakannya di MathSO ...

Sebenarnya, ahli matematika tidak akan pernah (atau paling tidak biasanya) mengasosiasikan dimensi keempat dengan sesuatu seperti waktu. Mereka juga tidak akan mengaitkan tiga yang pertama dengan ruang apa pun seperti: matematikawan hanya mendefinisikan dimensi sebagai properti abstrak, biasanya, ruang vektor (sering ini akan digeneralisasi ke manifold atau bahkan ruang metrik ). Dan definisi abstrak ini tidak peduli berapa banyak dimensi ruang fisik yang kita miliki. Konsep dimensi berlaku untuk ruang yang bahkan tidak menyerupai ruang fisik. Bahkan matematikawan (dan memang fisikawan) sangat sering menggunakan dimensi tak terbatas ruang, seperti ruang Hilbert mekanika kuantum.

Dengan klarifikasi itu, mari kita bicara array - Anda tidak perlu memahami ruang vektor, karena definisi abstrak sebenarnya jauh lebih sederhana di sini.

Sebuah array berukuran 0 × 1 × 2 × ... × n −1 ) (yaitu dimensi n ) hanyalah kumpulan dari 01 ⋅ ... ⋅ n −1 angka ( atau apa pun jenis objek yang mengisi array). Satu-satunya perbedaan untuk array satu dimensi dari panjang itu adalah bahwa Anda memiliki cara berguna khusus untuk mengindeks dimensi secara terpisah, yaitu

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

leftaroundabout
sumber
Agar jelas, Anda hanya perlu array dengan 3 elemen untuk menggambarkan 3 dimensi, dan array elemen N menjelaskan dimensi N. Namun, merinci setiap vektor adalah cerita yang berbeda. Seringkali, ini dilakukan dengan menunjukkan gambar ( imshowdengan Python) - dapat menampilkan dua dimensi spasial serta dimensi warna ketiga.
Scott
@Scott: Saya setuju gagasan "dimensi array" sangat disayangkan karena itu berarti sesuatu yang tidak terkait dengan dimensi ruang yang vektornya mungkin Anda wakili oleh array. (Namun saya juga berpikir itu bukan ide yang baik untuk merepresentasikan vektor dengan susunan polos, tidak menarik di tempat pertama.) Nama yang lebih baik mungkin adalah peringkat dari array, dalam analogi dengan tensor .
leftaroundabout
13

Dalam pemrograman, array cukup mudah diimplementasikan, tetapi mungkin tidak dimengerti.

Secara umum, setiap level array berarti memiliki konten n-fold. Itu berarti

  • int x[4]adalah 4 blok, masing-masing berisi int.
  • int x[5][4]5 blok, masing - masing berisi int[4].
  • int x[3][5][4]3 blok, masing-masing berisi int[5][4].
  • int x[2][3][5][4]adalah 2 blok, masing-masing berisi int[3][5][4].

Bagaimana Anda merujuk mereka terserah Anda, tetapi untuk pemahaman yang lebih baik, Anda memiliki sesuatu seperti

  • COLUMN untuk yang terakhir
  • ROW untuk yang kedua terakhir
  • PAGE untuk yang ketiga terakhir

Sampai di sini, saya membacanya di suatu tempat. Agar tetap di sini, kita juga bisa mendefinisikan

  • BOOK untuk yang keempat terakhir
  • dan mungkin SHELFuntuk yang kelima terakhir. (Atau, jika Anda mau, SHELFROWsehingga kami dapat melanjutkan.)

Yang mengatakan, saya tidak pernah melihat array dengan lebih dari 4 atau mungkin 5 dimensi dalam "kehidupan liar".

Dengan cara ini, Anda dapat mendefinisikan dan membayangkan int x[6][2][3][5][4]sebagai koleksi 6 "rak", masing-masing memiliki 2 buku, masing-masing memiliki 3 halaman, masing-masing memiliki 5 baris, masing-masing memiliki 4 kolom.

glglgl
sumber
13

Pikirkan array satu dimensi seperti lemari laci:

laci

Setiap laci adalah indeks dari array. Anda dapat meletakkan apa pun yang Anda inginkan di setiap laci, dan untuk banyak tujuan, setiap laci hanya akan berisi satu item (itu adalah array satu dimensi).

Lemari laci ini sangat ajaib, jadi tidak dibatasi oleh ruang fisik. Itu berarti bahwa Anda dapat meletakkan lemari berlaci lain di dalam setiap laci lemari laci pertama. Dada bagian dalam laci kemudian dapat berisi apa pun yang Anda inginkan. Itu array dua dimensi.

Jadi Anda bisa mengatakan sesuatu seperti "buka laci atas laci pertama, keluarkan laci itu dari laci itu, lalu buka laci bawah laci kedua lemari itu". Itu akan seperti mengakses indeks array 2D: myArray [0] [3];

Dan tentu saja, peti laci di dalam laci paling luar bisa berisi peti laci. Itu array tiga dimensi.

Jadi, pertanyaan Anda adalah: apa array empat dimensi? Ini peti laci peti laci peti laci, tentu saja!

Laci semua jalan ke bawah.

Kevin Workman
sumber
4
Dada laci semua turun, man.
Thomas Eding
8
Dan di laci terakhir? Penyu .
Kevin Workman
Menjadi sedikit bertele-tele. Mengingat ada 3 laci di setiap peti (berdasarkan gambar), bukan 4, dan Anda menggunakan indeks basis 0, laci bawah akan 2 bukan 3. Jadi, bukannya myArray[0][3]itu myArray[0][2]. Namun sebaliknya penjelasannya bagus.
Tom Heard
@TomHeard Laci pertama memiliki 3 laci, tetapi laci di dalam laci pertama memiliki 4 laci. Duh! : p
Kevin Workman
1
Oh, itu baik-baik saja. = D
Tom Heard
5

Sebagian besar aspek dari pertanyaan ini telah dipertimbangkan, tetapi saya pikir itu akan membantu jika Anda mempertimbangkan sifat dimensi. Tidak semua dimensi bersifat spasial. Dimensi adalah konteks untuk pengukuran. Berikut ini beberapa contohnya:

  • Frekuensi - warna atau nada
  • Massa
  • Valensi
  • Warna (up quark, down quark, quark aneh, quark terpesona dll)
  • Putar putaran
  • Sudut
  • Kekerasan
  • Hotness (dari cabai)

Dimensi "keempat" hanya keempat karena ada tiga dimensi spasial. Ruang dan waktu tampak besar karena, ya, mereka tampak besar. Sangat banyak di wajahmu. Tetapi kualitas terukur dan terukur apa pun bisa menjadi dimensi jika Anda mengukurnya.

Sebagai contoh, bra memiliki tiga dimensi: ukuran cangkir, ukuran dada, dan pengantara (saya tidak tahu apa yang kalian sebut, tapi maksud saya jarak antar cangkir).

Peter
sumber
1
"Tidak semua dimensi spasial." Untuk array, semua dimensi bersifat spasial.
Rhymoid
2
@ Rhymeoid: Untuk array, tidak ada dimensi yang inheren spasial dalam cara kita berpikir tentang ruang. : P Kami mendefinisikan mereka untuk mewakili apa pun yang kita inginkan.
cHao
@ cHao Mungkin jika Anda melihat semantik data yang mereka simpan. Tetapi di sisi representasional / sintaksis / implementasi hal-hal, semua dimensi array secara inheren spasial. Sebenarnya apa yang Anda andalkan saat menggunakan array sebagai bagian dari suatu algoritma.
Rhymoid
@ Rhymeoid: Itu adalah proses pemikiran yang sama yang menyebabkan pertanyaan ini ditanyakan sejak awal. Dimensi yang dapat dihitung tidak membuatnya spasial. Secara implementasi, tidak ada ruang. Hanya ada memori, dan memori adalah satu dimensi sejauh program mengetahui / melihat / peduli.
cHao
@ cHao: implementasiwise, ada ruang, karena ada juga waktu. Istilah 'kebocoran ruang' (sebagai alternatif untuk 'kebocoran memori', ditemukan di komunitas Haskell) bukan kebetulan. Fakta bahwa memori digambarkan sebagai satu dimensi adalah warisan dari BCPL.
Rhymoid
4

Dalam fisika, kita menganggap setiap dimensi spasial menjadi tak terbatas, yang membuat sulit menemukan ruang untuk dimensi baru.

Saat berhadapan dengan array terbatas, mudah untuk menemukan ruang.

Bayangkan selembar kertas dengan kisi dicetak di atasnya; Anda dapat menulis beberapa informasi di setiap sel grid. Itu array 2D: baris dan kolom.

Masukkan beberapa lembar kertas ke dalam folder file; itu array 3D: halaman, baris, dan kolom.

Taruh beberapa folder itu di kotak file. 4D array: folder, halaman, baris, kolom.

Susun kotak-kotak dalam kotak persegi panjang di atas palet kayu. 6D array: kotak-baris, kotak-kolom, folder, halaman, baris, kolom.

Susun lebih banyak kisi-kisi kotak di atasnya. 7D array: kedalaman kotak, baris-kotak, kolom-kotak, folder, halaman, baris, kolom.

Mulai menjejalkan palet ke dalam wadah pengiriman: array 9D. (Dengan asumsi setiap tumpukan setinggi bagian dalam wadah, sehingga Anda hanya bisa mendapatkan 2 dimensi lagi di sini.)

Menumpuk kontainer pengiriman di dek kapal kontainer: 12D array.

Armada kapal kontainer Anda sekarang merupakan array 13D.

Russell Borogove
sumber
"kami menganggap setiap dimensi spasial menjadi tak terbatas" tak terbatas bukan masalah terbesar di sini sebenarnya, berkelanjutan adalah masalah "nyata" (yaitu tak terhingga tak terhitung jumlahnya, dan kita membutuhkan pemetaan homeomorfik sehingga secara fisik bermakna).
leftaroundabout
3

Dalam sistem koordinat Cartesian, Anda memiliki sumbu x dan y di pesawat. Anda dapat mewakili angka apa pun di pesawat sebagai (x, y).

Dalam tiga "ruang" (atau dikenal sebagai kubus), Anda dapat memiliki sumbu x, y, dan z. Anda bisa mewakili elemen kubus apa pun sebagai (x, y, z).

Dalam ruang multivarian, Anda dapat memiliki sumbu x, y, z dan, w (di mana sumbu w adalah "imajiner"). Anda dapat mewakili elemen apa pun dari ruang itu sebagai (x, y, z, w).

Semua titik di ruang ini dilambangkan dengan vektor. Dalam empat spasi, Anda dapat memiliki dua vektor, di mana v1 = (x1, y1, z1, w1), dan v2 = (x2, y2, z2, w2). Kemudian Anda memanipulasi vektor-vektor ini seperti angka. Misalnya, jumlah dari dua vektor, v1 + v2 akan menjadi (x1, y1, z1, w1) + (x2, y2, z2, w2). Kemudian Anda menambahkan vektor istilah dengan istilah seperti yang Anda inginkan angka, untuk mendapatkan: (x1 + x2, y1 + y2, z1 + z2, w1 + w2).

Program Anda akan menentukan vektor menggunakan array yang sesuai, dan kemudian melakukan operasi aritmatika pada mereka dalam urutan yang sesuai.

Tom Au
sumber