“Dördüncü Boyut” dizilerle nasıl çalışır?


30

Özet:

Dolayısıyla, anladığım kadarıyla (çok sınırlı bir anlayışa sahip olmama rağmen), fiziksel olarak çalıştığımız üç boyut var:

Birincisi bir çizgiyle temsil edilir.
2nci kare ile temsil edilir.
Üçüncüsü bir küp ile temsil edilir.

Dördüncü seviyeye gelene kadar yeterince basit - 3D uzayda çizmek biraz zor, ne demek istediğimi anlıyorsan ... Bazılarının zamanla ilgisi olduğunu söylüyorlar .

Soru:

Şimdi, bu pek mantıklı gelmese de, bu benim için harika. Sorum bu konuda değil, ya da MathSO ya da PhysicsSO hakkında soruyorum. Sorum şu: Bilgisayar bunu dizilerle nasıl idare ediyor?

Pek çok farklı programlama dilinde 4D, 5D, 6D vb. Dizileri oluşturabileceğinizi biliyorum, ama bunun nasıl çalıştığını bilmek istiyorum.


66
3 boyutta bir küp olarak görselleştirilebilirse, 4 boyut bir çizgide bir demet küp olarak görselleştirilebilir. 5 boyut, ızgaradaki her hücrenin bir küp içerdiği bir ızgara olarak görselleştirilebilir! Ve daha neler ... "Dördüncü Boyut" (her ne zaman bir ilgisi yok yani sizin programı semantik bağlamında gibi tanımlama yapmadan gelir).
SinirliWithFormsDesigner

14
Genel olarak, boyutları kesinlikle fiziksel yapılar olarak düşünmekten kaçınmaya çalışarak bu kavramsal kamburluğun üstesinden gelebilirsiniz. Örneğin, bazı makine öğrenim problemleri, her boyutun veri setinin bir özelliği olduğu, yüz binlerce kişide bir boyutsallığa sahip olabilir.
Steven Evers,


6
Steve Evers'in yorumuna ek olarak, ortak bir veri türü düşünün: bir RGB renk. Bunun üç boyutu vardır, bu nedenle RGB "renk alanı" nı düşünebilirsiniz. Şimdi bir alfa bileşeni ekleyin. Dört boyutun var.
Josh Caswell,

25
Bilgisayarın geometrik boyutlar fikrini önemsemediğini unutmayın - bunlar sadece insanların rahatlığı için bir cihazdır. 5x5x5x5 dizisi ayırırsanız, bilgisayar yalnızca 625 öğeden oluşan bir dizi ayırır ve dizinlerinizi buna göre hesaplar.
David Zhang,

Yanıtlar:


77

Neyse ki, programlar gerçek dünyanın fiziksel kısıtlamaları ile sınırlı değildir. Diziler fiziksel alanda depolanmadığından, dizinin boyutlarının sayısı önemli değildir. Doğrusal hafızaya düzleştirilirler. Örneğin, iki elemanlı tek boyutlu bir dizi şöyle sıralanabilir:

(0) (1)

2x2 boyutlu bir dizi daha sonra olabilir:

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

Üç boyutlu 2x2x2 bir dizi olabilir:

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

Umarım bunun nereye gittiğini görebilirsiniz. Dört boyut olabilir:

(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
Bilgisayar dizileri insan anlama veya görselleştirme ile sınırlı değildir, ancak fiziksel kısıtlamalarla sınırlandırılmıştır, örneğin her biri n uzunluğundaki her bir d boyutu dizisi n ^ d veya daha genel olarak farklı uzunluk boyutlarıyla, n1 × n2 ×… × nd.
acelent

6
@ColtonAllen: Ne demek istediğinizi tam olarak bilmiyorum. Boyutun tanımı "Kabaca o nesne üzerinde bir noktayı tanımlamak için yeterli koordinat sayısıdır, konuşma." Diyor C olarak bildirilen bir dizi int a[2][2][2];, 3 boyutlu bir dizi olacaktı.
Greg Hewgill,

4
“Neyse ki, programlar gerçek dünyanın fiziksel kısıtlamaları ile sınırlı değil” Bu yüzden neden 4.5THz'de işlemcilerimiz var ve hiç kimse bellek hiyerarşisini önemsemiyor, öyle değil mi? Bu gerçekten
okuduğum

24
@ Manu343726 Sınırlı uzay ve zaman boyutlarında (teorik olarak) yaşadığımız gerçeğine atıfta bulunuyor, ancak bilgisayar belleğindeki diziler "pretend" boyutlarına sahip - hepsi bellekte doğrusal olarak bitişik bir alanda depolanıyor - bu yüzden bunlar sınırlı değil İçinde yaşadığımız boyutların sayısı. Troll> :(
Blackhawk

15
@ Manu343726: Bilgisayarları değil, Programları dikkatlice söyledim . Bu yazılımla ilgili en güzel şeylerden biri.
Greg Hewgill,

49

Uzamsal boyutlarda hayal etmeniz gerekmez, sadece eğreltiotu yaprağı olarak düşünün. eğrelti yaprağı

Asıl sap ilk dizinizdir ve her dal sakladığı bir öğedir. Bir şubeye bakarsak, bu senin ikinci boyutun. Verilerini temsil eden, daha küçük dallardan oluşan benzer bir yapıya sahiptir. Bunlar, kendi içlerindeki en küçük ya da en yüksek boyut dizisinin verilerini temsil eden küçük yapraklara ulaşana kadar devam eden kendi küçük dallarına sahiptir.

Her seviyeyi kendi adıyla bildirirseniz bu binayı görebilirsiniz. Burada kodu en aza indirmek için değişken olan her seviyeyi yeniden kullanıyorum:

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

1
Bu görselleştirme, pürüzlü bir diziyi daha yakından temsil etmiyor mu?
Matt Johnson-Pint,

2
@MattJohnson Resmen evet, ancak bu örnek çok boyutlu dizileri de açıklıyor / görselleştiriyor.
M.Mimpen

4
+1 bu sadece düzgün bir görselleştirme değil, birçok dizi uygulamasının doğrusal açıklamasından gerçeğe daha yakın. Buradaki insanların çoğunun "dizi" terimini bitişik hafıza ile sınırlandırıp kısıtlamaması, "çok boyutlu dizi ", literatürdeki pek çok dil için bu tür düzenlemeler için kesinlikle kullanılan bir terimdir.
DeveloperInDevelopment

46

Boyutları ne olmak istiyorsan, dördüncü boyutun mutlaka zaman olması gerekmiyor. Küp olarak üç boyut düşünürseniz, 4 boyutu küp sıra olarak düşünebilirsiniz. 5 boyut, bir küp küp vb.

Ayrıca dördüncü boyut renk, yoğunluk veya başka bir özellik olan 3d voksel koleksiyonuna sahip olabilirsiniz.

Çok boyutlu diziniz için bellek ayırdığınızda, sadece veri türünüz için maksimum her boyuttaki ürünü ayırır. Her boyutta 10 elementten oluşan bir 3d dizi veya 'küp' varsa, ayrılmış 1000 elemente sahip olacaksınız. 4. boyutta 10 elementli bir 4d dizisi yaparsanız, bilgisayar sadece 10.000 tahsis eder. 5 boyuta kadar çarptırın ve 100.000 tahsis edecek.

Bilgisayar, her boyutun neyi temsil ettiği ile ilgili herhangi bir anlamı umursamıyor. Öğeler listesinde tek bir noktanın nerede olduğunu seçmek, sadece bir hafıza adresi seçmekle çarpılır.


26

Bazı yeni tıbbi cihazlarda, bir hastanın kollarına koyduğunuz bir dizi sensörde Ar-Ge yaptığını düşünün. Test için sıraya giren yedi gönüllünüz var. Her sensör yaklaşık bir dakika boyunca her 100ms'de bir kez aldığınız düşük frekans, orta frekans ve yüksek frekans okumalarını rapor eder.

Tüm bu veriler analiz ve komplo için bellekte nasıl saklanır?

Belli ki bir dizi. Buna benziyor (telafi edilmiş jenerik sözde kodu kullanılarak):

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

Bu beş boyutlu bir dizi ve bu konuda aldatıcı, gizemli veya şaşırtıcı bir şey yok. Bunu 5 boyutlu Öklid uzayıyla ilişkilendirmeye çalışmak için hiçbir neden yoktur. Herhangi bir veri değeri elde etmek için aşağıdaki gibi bir ifade kullanırız:

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

Tıpkı her veri değeri için bir kayda sahip olduğunuz, hasta kimliğini, sensör kimliğini vb. Tutan beş sütunu ve değeri olan bir sütunu içeren ilişkisel bir veritabanını sorgulamak gibidir. Bir veri noktası elde etmek için, NEREDE'de beş terim kullanırsınız: SensorData WHERE'DEN SEÇİM değeri (patientid = 6) ve (sensorid = 5) ve (arm = "left") ve (channel = "midfreq") ve (sampleindex = 338) ).

Beş veya daha fazla sütunlu bir veritabanı tablosu hakkında mistik bir şey yok, değil mi?

(Ben gerçek hayatta, 0 tabanlı çok daha yaygın olsa da 1 tabanlı endeksleme kullanıyorum.)

Silah sayısının zor kodlanmasından dolayı kötü bir çocuk olduğumu unutmayın. Bu sensörleri bir ahtapotta araştırmam için fon sağlansaydım, başım belada!


3
+1 Boyutların, istediğiniz herhangi bir veri olabileceğini gösteren mükemmel bir örnek.
Mike, Monica,

20

Bir dizi sadece sürekli bellekten oluşan bir bloktur. Hafıza adresleme tek boyutludur, ileri ya da geri gidebilirsiniz. Böylece 5 elementli bir diziniz olduğunu varsayarsak, 5 bellek bloğu ayrılacaktır. Her boyutta 5 öğeli 2 boyutlu bir diziniz varsa, 25 bellek bloğu ayrılacaktır.


5
Evet, dizilerinize daha fazla boyut eklerken bunu aklınızda bulundurun. Hafıza kullanımı önemsiz olmayabilir.
davidhaskins,

18

... ya da MathSO'da sormak isterdim ...

Aslında, matematikçiler dördüncü bir boyutu hiçbir zaman (ya da en azından genellikle değil) zaman gibi bir şeyle ilişkilendiremezler. Ayrıca, ilk üç olanı şunun gibi bir şeyle ilişkilendirmezler: matematikçiler boyutu basitçe bir vektör uzayının soyut bir özelliği olarak tanımlarlar (çoğu zaman bu manifoldlara veya hatta metrik uzaylara genellenir ). Ve bu soyut tanım, içine taşındığımız fiziksel alanın kaç boyutta olduğu ile ilgilenmiyor. Boyut kavramı, fiziksel alana bile benzemeyen alanlara uygulanır. Aslında matematikçiler (ve gerçekten de fizikçiler) çok sık sonsuz-boyutlu kullanırlar. kuantum mekaniğinin Hilbert uzayları gibi uzaylar.

Bunu açıklığa kavuşturmakla, hadi dizilerden bahsedelim - vektör uzaylarını anlamanıza gerek yok çünkü soyut tanım burada çok daha basit.

Bir ( 0 × 1 × 2 × ... × n −1 ) boyutuna sahip bir dizi (yani n boyutu ), sadece 01 ⋅ ... ⋅ n numbers1 sayı koleksiyonudur ( veya hangi tür nesne olursa olsun diziyi doldurur). Bu uzunluktaki tek boyutlu bir dizilimdeki tek fark, boyutları ayrı ayrı indekslemek için belirli bir faydalı yolun olmasıdır.

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


Açık olmak gerekirse, 3 boyutu tanımlamak için yalnızca 3 öğeli bir diziye ihtiyacınız var ve bir N öğesi dizisi N boyutlarını açıklıyor. Ancak, her vektörün detaylandırılması farklı bir hikayedir. Çoğu zaman, bir resim gösterilerek yapılır ( imshowPython'da) - üçüncü bir boyutun yanı sıra iki uzamsal boyut gösterebilir.
Scott

@Scott: “Bir dizinin boyutu” nosyonunun talihsiz olduğu fikrine katılıyorum, çünkü vektörleri dizilerle temsil edebileceğiniz bir alanın boyutluluğuyla ilgisi olmayan bir şey anlamına geliyor. (Bununla birlikte Ben de ilk etapta sade, unabstracted diziler tarafından vektörleri temsil etmek, iyi bir fikir olmadığını düşünüyorum.) Daha iyi bir isim olabilir rütbe ile benzer şekilde, bir dizinin tensörlerle .
leftaroundabout

13

Programlamada, dizilerin uygulanması oldukça kolaydır, ancak belki anlaşılmayabilir.

Genel olarak, her bir dizi seviyesi içeriğe sahip olmak anlamına gelir n. Bunun anlamı

  • int x[4]her biri bir içeren 4 bloktur int.
  • int x[5][4]her biri birer içeren 5 bloktur int[4].
  • int x[3][5][4]Her biri birer içeren 3 bloktur int[5][4].
  • int x[2][3][5][4]her biri bir içeren 2 bloktur int[3][5][4].

Onlara nasıl atıfta bulunduğunuz size kalmış, ancak daha iyi anlamak için,

  • COLUMN sonuncusu için
  • ROW ikincisi için
  • PAGE üçüncü sonuncusu için

Buraya kadar bir yerde okudum. Burada kalmak için tanımlayabiliriz

  • BOOK dördüncü için
  • ve belki SHELFde beşinciden biri için. (Ya da tercih ederseniz SHELFROWdevam edebilmemiz için.)

Bununla birlikte, "vahşi yaşam" da 4 veya 5 boyuttan fazla olan dizileri hiç görmedim.

Bu şekilde, int x[6][2][3][5][4]her biri 4 kitap içeren, her birinde 5 sayfa bulunan 2 kitap, her birinde 3 sayfa bulunan 6 kitaplık bir koleksiyon tanımlayabilir ve hayal edebilirsiniz .


13

Çekmece sandığı gibi tek boyutlu bir dizi düşünün:

çekmeceli dolap

Her çekmece, dizinin bir endeksidir. Her çekmeceye istediğinizi koyabilirsiniz ve birçok amaç için, her çekmece yalnızca tek bir öğe içerecektir (bu tek boyutlu bir dizidir).

Bu çekmeceli sandık büyülüdür, yani fiziksel alanla sınırlı değildir. Bu , ilk çekmecenin her bir çekmecesine başka bir çekmece koyabileceğiniz anlamına gelir . Çekmecenin iç sandıkları daha sonra ne istersen içerebilir. Bu iki boyutlu bir dizi.

"İlk çekmecenin üst çekmecesini aç, çekmecenin çekmecesini çek, sonra ikinci çekmecenin alt çekmecesini aç" gibi bir şey söyleyebilirsin. Bu, 2B dizinin bir dizinine erişmek gibi olur: myArray [0] [3];

Ve elbette, en dıştaki çekmecenin içindeki çekmeceli sandıkların içinde çekmeceli sandık bulunabilir. Bu üç boyutlu bir dizi.

Peki, sorunuz şudur: dört boyutlu bir dizi nedir? Elbette çekmeceli çekmeceli çekmeceli çekmeceli bir sandık!

Tüm yol boyunca çekmeceler var.


4
Tamamen çekmeceli sandık var dostum.
Thomas Eding,

8
Ve son çekmecede? Kaplumbağalar .
Kevin Workman

Biraz bilgiçlik yapmak. Her göğsünde 3 resme bakıldığında (resme göre), 4 değil, bir temel 0 indeksi kullanıyorsunuz, alt çekmece 2 değil 3 myArray[0][3]olacaktı myArray[0][2]. Ama başka türlü iyi bir açıklama.
Tom Heard

@TomHeard İlk çekmecenin 3 çekmecesi vardır, ancak ilk çekmecenin içindeki çekmecenin 4 çekmecesi vardır. Duh! : p
Kevin Workman,

1
Oh o zaman bu iyi. = D
Tom Heard

5

Bu sorunun yönleri çoğu zaten düşünülmüş, ancak bir boyutun doğasını düşünürseniz bunun yardımcı olacağını düşünüyorum. Tüm boyutlar mekansal değil. Boyut, ölçüm için bir bağlamdır. İşte bazı örnekler:

  • Frekans - renk veya perde
  • kitle
  • değerlik
  • Renk (yukarı kuark, aşağı kuark, tuhaf kuark, büyülü kuark vb.)
  • Dönüş yönü
  • Açı
  • gürültü
  • Sıcaklık (biber)

"Dördüncü" boyut sadece dördüncü, çünkü üç uzamsal boyut var. Uzay ve zaman büyük görünüyor çünkü, büyük görünüyorlar. Yüzünde çok fazla. Ancak, ölçülebilir, ölçülebilir herhangi bir kalite, ölçtüğünüzde boyut olabilir.

Örneğin, sutyenler üç boyuta sahiptir: bardak ebadı, göğüs ebadı ve ara geçiş (kızların ne dediğini bilmiyorum ama bardaklar arasındaki mesafeyi kastediyorum).


1
"Bütün boyutlar mekansal değil." Diziler, tüm boyutlar olan uzamsal.
Rhymoid

2
@ Rhymoid: Diziler için, boşluk hakkında düşünme biçimimizde hiçbir boyut doğal olarak uzamsal değildir. : P Onları istediğimizi temsil edecek şekilde tanımlarız.
cHao

@cHao Belki de depoladıkları verinin semantiğine bakarsanız. Ancak, nesnelerin temsili / sözdizimsel / uygulama tarafında, tüm dizi boyutları doğası gereği mekansaldır. Dizileri bir algoritmanın parçası olarak kullanırken aslında buna bağlısınız.
Rhymoid

@ Rhymoid: Bu, ilk başta bu sorunun sorulmasına yol açan aynı düşünce sürecidir. Numaralandırılabilir bir boyut, onu uzamsal yapmaz. Uygulamada yer yok. Sadece hafıza vardır ve hafıza bir programın bildiği / gördüğü / umurunda olduğu sürece tek boyutludur.
cHao

@cHao: Uygulamaya göre, zaman var çünkü yer var. 'Alan sızıntısı' terimi (Haskell topluluğunda bulunan 'hafıza sızıntısı' için bir alternatif olarak) tesadüf değildir. Belleğin tek boyutlu olarak tanımlanması, BCPL'den gelen bir mirastır.
Rhymoid

4

Fizikte, her bir uzamsal boyutun sonsuz olduğunu varsayıyoruz, bu da yeni boyutlar için yer bulmayı oldukça zorlaştırıyor.

Sonlu dizilerle uğraşırken yer bulmak kolaydır.

Üzerine basılmış bir kılavuz içeren bir sayfa düşünün; Kılavuzun her hücresine bazı bilgiler yazabilirsiniz. Bu bir 2D dizi: satır ve sütun.

Bu kağıt sayfalarının bir kısmını bir dosya klasörüne yerleştirin; bu bir 3B dizi: sayfa, satır ve sütun.

Bu klasörlerin birkaçını bir dosya kutusuna yerleştirin. 4D dizisi: klasör, sayfa, satır, sütun.

Kutuları, ahşap bir palet üzerindeki dikdörtgen bir ızgarada düzenleyin. 6D dizi: kutu satır, kutu sütun, klasör, sayfa, satır, sütun.

Bunların üzerine daha fazla kutu ızgara yığını. 7D dizisi: kutu derinliği, kutu satır, kutu sütun, klasör, sayfa, satır, sütun.

Paletleri bir nakliye konteynerine sıkıştırmaya başlayın: 9D dizisi. (Her yığının kabın içinde olduğu kadar uzun olduğu varsayılarak, burada sadece 2 boyut daha alabilirsiniz.)

12D dizisi: Bir konteyner gemisinin güvertesinde nakliye konteynırlarını biriktirin.

Konteyner gemileri filonuz artık 13 boyutlu bir dizi.


"Her bir uzamsal boyutun sonsuz olduğunu varsayıyoruz" sonsuz, buradaki en büyük mesele değil, sürekli olan "gerçek" problemdir (yani aşırı sayılabilir şekilde sonsuzdur ve homeomorfik bir haritalamaya ihtiyacımız vardır, bu nedenle fiziksel olarak anlamlıdır).
leftaroundabout

3

Kartezyen koordinat sisteminde, bir düzlemde x ve y eksenleri vardır. Uçaktaki herhangi bir sayıyı (x, y) olarak temsil edebilirsiniz.

Üç boşlukta (aksi takdirde küp olarak bilinir), x, y ve z eksenlerine sahip olabilirsiniz. Küpün herhangi bir öğesini (x, y, z) olarak temsil edebilirsiniz.

Çok değişkenli uzayda, x, y, z ve, w eksenlerine sahip olabilirsiniz (burada w ekseni "hayali" dir). Bu boşluğun herhangi bir öğesini (x, y, z, w) olarak temsil edebilirsiniz.

Uzayda bu noktaların hepsi vektörlerle belirtilir. Dört boşlukta, v1 = (x1, y1, z1, w1) ve v2 = (x2, y2, z2, w2) olmak üzere iki vektöre sahip olabilirsiniz . Daha sonra bu vektörleri sayıdaki gibi değiştirirsiniz. Örneğin, iki vektörün toplamı, v1 + v2 (x1, y1, z1, w1) + (x2, y2, z2, w2) olacaktır. Daha sonra bu vektörleri terim olarak, sayıları istediğiniz gibi ekleyin: (x1 + x2, y1 + y2, z1 + z2, w1 + w2).

Programınız vektörleri uygun dizileri kullanarak tanımlayacak ve daha sonra üzerlerine uygun sırayla aritmetik işlemler yapacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.