Làm thế nào để các thứ nguyên kích thước thứ tư làm việc với các mảng?


30

Trừu tượng:

Vì vậy, theo tôi hiểu (mặc dù tôi có hiểu biết rất hạn chế), có ba khía cạnh mà chúng tôi (thường) làm việc với thể chất:

Đầu tiên sẽ được đại diện bởi một dòng.
Thứ 2 sẽ được đại diện bởi một hình vuông.
Thứ 3 sẽ được đại diện bởi một khối.

Đủ đơn giản cho đến khi chúng tôi đến lần thứ 4 - Thật khó để vẽ trong không gian 3D, nếu bạn hiểu ý tôi là ... Một số người nói rằng nó có liên quan đến thời gian .

Câu hỏi:

Bây giờ, mặc dù điều đó không có nhiều ý nghĩa, nhưng đó là tất cả tuyệt vời với tôi. Câu hỏi của tôi không phải là về vấn đề này, hoặc tôi sẽ hỏi nó trên MathSO hoặc Vật lý. Câu hỏi của tôi là: Làm thế nào để máy tính xử lý việc này với mảng?

Tôi biết rằng bạn có thể tạo các mảng 4D, 5D, 6D, v.v ... bằng nhiều ngôn ngữ lập trình khác nhau, nhưng tôi muốn biết cách hoạt động của nó.


66
Nếu 3 chiều có thể được hình dung như một khối, thì 4 chiều có thể được hiển thị dưới dạng một khối các đường thẳng. 5 kích thước có thể được hình dung như một lưới trong đó mỗi ô trong lưới chứa ... một khối lập phương! Và cứ thế ... "Thứ nguyên thứ tư" không liên quan gì đến thời gian (bất kể đó là gì), trừ khi bạn định nghĩa nó như vậy trong bối cảnh ngữ nghĩa của chương trình của bạn.
Thất vọngWithFormsDesigner

14
Nói chung, bạn có thể vượt qua cái bướu khái niệm này bằng cách cố gắng tránh nghĩ về kích thước là các cấu trúc vật lý nghiêm ngặt. Ví dụ: một số vấn đề về máy học có thể có một chiều trong hàng trăm nghìn, trong đó mỗi chiều là một tính năng của bộ dữ liệu.
Steven Evers


6
Để biết thêm về nhận xét của Steve Evers, hãy nghĩ về một loại dữ liệu phổ biến: màu RGB. Điều này có ba chiều, vì vậy bạn có thể xem xét "không gian màu" RGB. Bây giờ thêm một thành phần alpha. Bạn có bốn chiều.
Josh Caswell

25
Hãy nhớ rằng máy tính không quan tâm đến ý tưởng về kích thước hình học - chúng chỉ là một thiết bị để thuận tiện cho con người. Nếu bạn phân bổ một mảng 5x5x5x5, máy tính chỉ cần phân bổ một mảng gồm 625 phần tử và thực hiện phép toán với các chỉ số của bạn theo đó.
David Zhang

Câu trả lời:


77

May mắn thay, các chương trình không bị giới hạn bởi các ràng buộc vật lý của thế giới thực. Mảng không được lưu trữ trong không gian vật lý, vì vậy số lượng kích thước của mảng không thành vấn đề. Chúng được làm phẳng thành bộ nhớ tuyến tính. Ví dụ: một mảng một chiều có hai phần tử có thể được đặt ra là:

(0) (1)

Một mảng 2x2 sau đó có thể là:

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

Một mảng 2x2x2 ba chiều có thể là:

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

Bạn có thể hy vọng xem nơi này sẽ đi. Bốn chiều có thể là:

(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
Mảng máy tính không bị giới hạn bởi sự hiểu biết hoặc hình dung của con người, nhưng chúng bị giới hạn bởi các ràng buộc vật lý, ví dụ: một mảng có kích thước d mỗi chiều dài n sẽ mất n ^ d, hoặc nói chung là với các kích thước chiều dài khác nhau, n1 × n2 × thứ
acelent

6
@Colton ALLen: Tôi không chắc chắn những gì bạn đang đề cập đến. Các định nghĩa về khía cạnh nói "Nói đại khái, nó là số tọa độ cần thiết để xác định một điểm trên đối tượng." Một mảng được khai báo bằng C int a[2][2][2];sẽ là một mảng 3 chiều.
Greg Hewgill

4
"May mắn thay, các chương trình không bị giới hạn bởi các ràng buộc vật lý của thế giới thực" Vậy đó là lý do tại sao tất cả chúng ta có bộ xử lý ở 4,5THz, và không ai quan tâm đến hệ thống phân cấp bộ nhớ, phải không? Đây thực sự là câu trả lời hài hước nhất mà tôi đã đọc ....
Manu343726

24
@ City số lượng kích thước chúng ta đang sống. Đừng troll> :(
Blackhawk

15
@ Manu343726: Tôi cẩn thận nói Chương trình , không phải Máy tính . Đó là một trong những điều tuyệt vời về phần mềm.
Greg Hewgill

49

Bạn không cần phải tưởng tượng trong các kích thước không gian cao, chỉ cần nghĩ về nó như một chiếc lá dương xỉ. Lá dương xỉ

Thân chính là mảng đầu tiên của bạn, với mỗi nhánh là một vật phẩm mà nó đang lưu trữ. Nếu chúng ta nhìn vào một nhánh thì đây là chiều thứ hai của bạn. Nó có cấu trúc tương tự các nhánh nhỏ hơn của nó đại diện cho dữ liệu của nó. Lần lượt chúng có các nhánh nhỏ của riêng chúng tiếp tục cho đến khi chúng ta đến được những chiếc lá nhỏ tượng trưng cho dữ liệu của mảng kích thước lớn nhất hoặc cao nhất bên trong.

Bạn có thể thấy tòa nhà này tăng lên nếu bạn khai báo mỗi cấp với tên riêng của nó. Ở đây tôi đang sử dụng lại từng cấp độ biến để giảm thiểu mã:

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

1
Không trực quan hóa này đại diện chặt chẽ hơn một mảng răng cưa?
Matt Johnson-Pint

2
@MattJohnson Chính thức là có, nhưng ví dụ này cũng giải thích / trực quan hóa các mảng đa chiều.
M.Mimpen

4
+1 đây không chỉ là một hình ảnh trực quan gọn gàng, mà gần với sự thật hơn là giải thích tuyến tính cho nhiều triển khai mảng. Cho dù hầu hết mọi người ở đây có hạn chế thuật ngữ "mảng" đối với bộ nhớ liền kề hay không, " mảng đa chiều " chắc chắn là thuật ngữ được sử dụng để sắp xếp như vậy trong tài liệu cho nhiều ngôn ngữ.
DeveloperInDevelopment

46

Kích thước là bất cứ thứ gì bạn muốn, chiều thứ 4 không nhất thiết phải là thời gian. Nếu bạn nghĩ về ba chiều là một khối, bạn có thể nghĩ 4 chiều là một hàng khối. 5 kích thước, một lưới các hình khối, và như vậy.

Bạn cũng có thể có một bộ sưu tập voxels 3d, với kích thước thứ 4 là màu sắc hoặc mật độ hoặc một số thuộc tính khác.

Khi bạn phân bổ bộ nhớ cho mảng nhiều chiều, nó chỉ đơn giản là phân bổ sản phẩm của từng kích thước tối đa cho loại dữ liệu của bạn. Nếu bạn có một mảng 3d hoặc 'khối' gồm 10 phần tử trong mỗi thứ nguyên, bạn sẽ có 1.000 phần tử được phân bổ. Nếu bạn tạo một mảng 4d với 10 phần tử ở chiều thứ 4, máy tính sẽ chỉ phân bổ 10.000. Bump nó lên đến 5 chiều, và nó sẽ phân bổ 100.000.

Máy tính không quan tâm đến bất kỳ ý nghĩa nào về những gì mỗi chiều đại diện. Để chọn vị trí trong danh sách các phần tử một điểm, chỉ cần nhân một địa chỉ bộ nhớ.


26

Hãy tưởng tượng thực hiện R & D trên một số thiết bị y tế mới, một loạt các cảm biến mà bạn đặt dọc theo cánh tay của bệnh nhân. Bạn có bảy tình nguyện viên xếp hàng để thử nghiệm. Mỗi cảm biến báo cáo các lần đọc tần số thấp, tần số trung bình và tần số cao, mà bạn mất 100 giây một lần trong khoảng một phút.

Làm thế nào để lưu trữ tất cả dữ liệu đó trong bộ nhớ để phân tích và vẽ đồ thị?

Một mảng, rõ ràng. Nó sẽ trông như thế này (sử dụng mã giả chung chung):

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

Đó là một mảng năm chiều, và không có gì khó khăn, bí ẩn hoặc gây trở ngại cho nó. Không có lý do để cố gắng liên kết nó với không gian Euclide 5 chiều. Để có được bất kỳ một giá trị dữ liệu nào, chúng tôi sử dụng một biểu thức như

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

Nó giống như truy vấn cơ sở dữ liệu quan hệ nơi bạn có một bản ghi cho từng giá trị dữ liệu, với năm cột chứa id bệnh nhân, id cảm biến, v.v. và một cột có giá trị. Để có được một điểm dữ liệu, bạn sử dụng năm thuật ngữ trong giá trị WHERE: CHỌN TỪ SensorData WHERE (BNid = 6) và (sensorid = 5) và (arm = "left") và (channel = "midfreq") và (sampleindex = 338 ).

Không có gì thần bí về một bảng cơ sở dữ liệu có năm cột trở lên, phải không?

(Tôi đang sử dụng lập chỉ mục dựa trên 1 mặc dù trong cuộc sống thực, dựa trên 0 phổ biến hơn nhiều.)

Lưu ý rằng tôi là một cậu bé hư do mã hóa số lượng vũ khí. Nếu tôi từng được tài trợ để điều tra những cảm biến này trên con bạch tuộc, tôi sẽ gặp rắc rối!


3
+1 Ví dụ tuyệt vời chứng minh rằng kích thước có thể là bất kỳ dữ liệu nào bạn yêu cầu.
Mike hỗ trợ Monica

20

Một mảng chỉ là một khối của bộ nhớ liên tục. Địa chỉ bộ nhớ là một chiều, bạn có thể tiến hoặc lùi. Vì vậy, giả sử bạn có một mảng với 5 phần tử, 5 khối bộ nhớ sẽ được bảo lưu. Nếu bạn có một mảng 2 chiều với 5 phần tử trong mỗi chiều, 25 khối bộ nhớ sẽ được bảo lưu.


5
Có, hãy ghi nhớ điều này khi bạn thêm nhiều kích thước vào mảng của mình. Sử dụng bộ nhớ có thể không tầm thường.
davidhaskins

18

... hoặc tôi sẽ hỏi nó trên MathSO ...

Vâng, như một vấn đề thực tế, các nhà toán học sẽ không bao giờ (hoặc ít nhất là không thường xuyên) liên kết một chiều thứ tư với bất cứ thứ gì như thời gian. Họ cũng sẽ không liên kết ba cái đầu tiên với bất kỳ không gian nào như: các nhà toán học chỉ đơn giản định nghĩa kích thước là một thuộc tính trừu tượng của, thông thường, một không gian vectơ (thường điều này sẽ được khái quát thành đa tạp hoặc thậm chí là không gian hệ mét ). Và định nghĩa trừu tượng này không quan tâm đến việc không gian vật lý mà chúng ta di chuyển có bao nhiêu chiều. Khái niệm kích thước áp dụng cho các không gian thậm chí không giống với không gian vật lý. Trong thực tế, các nhà toán học (và thực sự là các nhà vật lý) thường sử dụng vô hạn không gian, chẳng hạn như không gian Hilbert của cơ học lượng tử.

Với điều đó đã được làm rõ, hãy nói về mảng - bạn không cần phải hiểu các không gian vectơ, vì định nghĩa trừu tượng thực sự đơn giản hơn nhiều ở đây.

An ( 0 × 1 × 2 × ... × n -1 ) mảng -sized (tức là các khía cạnh n ) chỉ đơn giản là một bộ sưu tập của 01 ⋅ ⋅ ... n -1 số ( hoặc bất cứ loại đối tượng nào cư trú trong mảng). Sự khác biệt duy nhất với mảng một chiều có độ dài đó là bạn có một cách hữu ích đặc biệt để lập chỉ mục các kích thước một cách riêng biệt, cụ thể là

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


Để rõ ràng, bạn chỉ cần một mảng có 3 phần tử để mô tả 3 chiều và một mảng phần tử N mô tả N kích thước. Tuy nhiên, chi tiết mỗi vector là một câu chuyện khác nhau. Thông thường, nó được thực hiện bằng cách hiển thị một hình ảnh ( imshowbằng Python) - nó có thể hiển thị hai kích thước không gian cũng như kích thước màu thứ ba.
Scott

@Scott: Tôi đồng ý khái niệm "chiều của một mảng" là không may vì nó có nghĩa là một cái gì đó không liên quan đến chiều của một không gian có vectơ mà bạn có thể đại diện cho các mảng. (Tuy nhiên, tôi cũng nghĩ rằng việc biểu diễn các vectơ bằng các mảng đơn giản, không bị loại bỏ ở vị trí đầu tiên không phải là một ý tưởng hay.) Một tên tốt hơn có thể là thứ hạng của một mảng, tương tự như các tenxơ .
leftaroundabout

13

Trong lập trình, mảng khá dễ thực hiện, nhưng có thể không hiểu.

Nói chung, mỗi cấp độ của mảng có nghĩa là có nội dung ngấp nhiều lần. Điêu đo co nghia la

  • int x[4]là 4 khối, mỗi khối chứa một int.
  • int x[5][4]là 5 khối, mỗi khối chứa một int[4].
  • int x[3][5][4]là 3 khối, mỗi khối chứa một int[5][4].
  • int x[2][3][5][4]là 2 khối, mỗi khối chứa một int[3][5][4].

Làm thế nào bạn đang đề cập đến họ là tùy thuộc vào bạn, nhưng để hiểu rõ hơn, bạn có một cái gì đó như

  • COLUMN cho người cuối cùng
  • ROW cho cái cuối cùng thứ hai
  • PAGE cho người thứ ba cuối cùng

Đến đây, tôi đọc nó ở đâu đó. Để ở lại đây, chúng tôi cũng có thể xác định

  • BOOK cho lần thứ tư cuối cùng
  • và có thể SHELFcho lần thứ năm cuối cùng. (Hoặc, nếu bạn thích, SHELFROWđể chúng tôi có thể tiếp tục.)

Điều đó nói rằng, tôi chưa bao giờ thấy mảng có nhiều hơn 4 hoặc có thể 5 chiều trong "cuộc sống hoang dã".

Bằng cách này, bạn có thể định nghĩa và tưởng tượng int x[6][2][3][5][4]như một bộ sưu tập gồm 6 "kệ", mỗi cuốn có 2 cuốn sách, mỗi cuốn có 3 trang, mỗi trang có 5 hàng, mỗi hàng có 4 cột.


13

Hãy nghĩ về một mảng một chiều giống như một ngăn kéo:

tủ ngăn kéo

Mỗi ngăn kéo là một chỉ số của mảng. Bạn có thể đặt bất cứ thứ gì bạn muốn vào mỗi ngăn kéo và cho nhiều mục đích, mỗi ngăn kéo sẽ chỉ chứa một mục duy nhất (đó là mảng một chiều).

Cái ngăn kéo này thật kỳ diệu, vì vậy nó không bị giới hạn bởi không gian vật lý. Điều đó có nghĩa là bạn có thể đặt một ngăn kéo khác bên trong mỗi ngăn kéo của ngăn kéo đầu tiên. Rương bên trong của ngăn kéo có thể chứa bất cứ thứ gì bạn muốn. Đó là một mảng hai chiều.

Vì vậy, bạn có thể nói một cái gì đó như "mở ngăn kéo trên cùng của ngăn kéo thứ nhất, lấy ngăn kéo ra khỏi ngăn kéo đó, sau đó mở ngăn kéo dưới cùng của ngăn kéo thứ hai đó". Điều đó sẽ giống như truy cập vào một chỉ mục của mảng 2D: myArray [0] [3];

Và tất nhiên, các ngăn kéo bên trong rương ngoài cùng của ngăn kéo có thể chứa các ngăn kéo. Đó là một mảng ba chiều.

Vì vậy, câu hỏi của bạn là: một mảng bốn chiều là gì? Tất nhiên, đó là một ngăn kéo của các ngăn kéo của các ngăn kéo của các ngăn kéo của các ngăn kéo của các ngăn kéo, tất nhiên!

Đó là tất cả các ngăn kéo xuống.


4
Đó là tủ của tất cả các ngăn kéo xuống, người đàn ông.
Thomas Eding

8
Và trong rương cuối cùng của ngăn kéo? Rùa .
Kevin Workman

Là hơi phạm vi. Có 3 ngăn kéo trong mỗi rương (dựa trên hình), không phải 4 và bạn đang sử dụng chỉ số cơ sở 0, ngăn kéo dưới cùng sẽ là 2 không 3. Vì vậy, thay vào myArray[0][3]đó sẽ là myArray[0][2]. Nhưng nếu không thì giải thích tốt.
Tom Nghe

@TomHeard Rương đầu tiên của ngăn kéo có 3 ngăn kéo, nhưng rương ngăn kéo bên trong ngăn kéo thứ nhất có 4 ngăn kéo. Duh! : p
Kevin Workman

1
Ồ vậy thì tốt rồi. = D
Tom Nghe

5

Hầu hết các khía cạnh của câu hỏi này đã được xem xét, nhưng tôi nghĩ nó sẽ giúp ích nếu bạn xem xét bản chất của một chiều. Không phải tất cả các kích thước là không gian. Một chiều là một bối cảnh để đo lường. Dưới đây là một số ví dụ:

  • Tần suất - màu sắc hoặc cao độ
  • Khối lượng
  • Hóa trị
  • Màu sắc (quark lên, quark xuống, quark lạ, quark quyến rũ, vv)
  • Hướng quay
  • Góc
  • Sự ồn ào
  • Độ nóng (của ớt)

Kích thước "thứ tư" chỉ là thứ tư vì có ba chiều không gian. Không gian và thời gian hiện ra rộng lớn bởi vì, tốt, chúng hiện ra lờ mờ. Rất nhiều trong khuôn mặt của bạn. Nhưng bất kỳ chất lượng có thể định lượng, đo lường được có thể là một chiều nếu bạn đo lường nó.

Ví dụ, đồng thau có ba chiều: kích thước cốc, kích thước ngực và kẽ (Tôi không biết các bạn gái gọi nó là gì nhưng ý tôi là khoảng cách giữa các cốc).


1
"Không phải tất cả các kích thước là không gian." Đối với mảng, tất cả các kích thước không gian.
Rhymoid

2
@Rhymoid: Đối với mảng, không có kích thước nào là không gian vốn có theo cách chúng ta nghĩ về không gian. : P Chúng tôi xác định chúng để đại diện cho bất cứ điều gì chúng tôi muốn.
cHao

@cHao Có lẽ nếu bạn nhìn vào ngữ nghĩa của dữ liệu họ lưu trữ. Nhưng ở khía cạnh đại diện / cú pháp / triển khai của sự vật, tất cả các kích thước mảng vốn là không gian. Đó thực sự là những gì bạn phụ thuộc vào khi sử dụng mảng như một phần của thuật toán.
Rhymoid

@Rhymoid: Đó là quá trình suy nghĩ tương tự dẫn đến câu hỏi này được hỏi ngay từ đầu. Một kích thước là vô số không làm cho nó không gian. Thực hiện, không có không gian. Chỉ có bộ nhớ và bộ nhớ là một chiều theo như một chương trình biết / nhìn thấy / quan tâm.
cHao

@cHao: thực hiện, có không gian, vì cũng có thời gian. Thuật ngữ 'rò rỉ không gian' (thay thế cho 'rò rỉ bộ nhớ', được tìm thấy trong cộng đồng Haskell) không phải là ngẫu nhiên. Việc bộ nhớ được mô tả là một chiều là một di sản từ BCPL.
Rhymoid

4

Trong vật lý, chúng tôi giả định mỗi chiều không gian là vô hạn, điều này khiến cho việc tìm không gian cho các chiều mới khá khó khăn.

Khi xử lý các mảng hữu hạn, thật dễ dàng để tìm không gian.

Hãy tưởng tượng một tờ giấy có lưới in trên đó; bạn có thể viết một số thông tin trong mỗi ô của lưới. Đó là một mảng 2D: hàng và cột.

Đặt một vài tờ giấy trong một thư mục tập tin; đó là một mảng 3D: trang, hàng và cột.

Đặt một vài trong số các thư mục đó trong một hộp tập tin. Mảng 4D: thư mục, trang, hàng, cột.

Sắp xếp các hộp trong một lưới hình chữ nhật trên một pallet gỗ. Mảng 6D: box-row, box-cột, thư mục, trang, hàng, cột.

Chồng nhiều lưới của các hộp lên trên. Mảng 7D: chiều sâu hộp, hàng hộp, cột hộp, thư mục, trang, hàng, cột.

Bắt đầu nhồi nhét pallet vào thùng chứa vận chuyển: mảng 9D. (Giả sử mỗi ngăn xếp cao bằng bên trong của container, vì vậy bạn chỉ có thể có thêm 2 chiều ở đây.)

Xếp chồng lên các container vận chuyển trên boong tàu container: mảng 12D.

Đội tàu container của bạn bây giờ là một mảng 13D.


"Chúng tôi cho rằng mỗi chiều không gian là vô hạn" thực sự không phải là vấn đề lớn nhất ở đây, liên tục là vấn đề "thực" (nghĩa là vô hạn quá mức và chúng tôi cần một ánh xạ đồng nhất để nó có ý nghĩa vật lý).
leftaroundabout

3

Trong hệ tọa độ Descartes, bạn có trục x và y trên một mặt phẳng. Bạn có thể biểu diễn bất kỳ số nào trên mặt phẳng là (x, y).

Trong ba "không gian" (còn được gọi là khối lập phương), bạn có thể có các trục x, y và z. Bạn có thể biểu diễn bất kỳ phần tử nào của khối là (x, y, z).

Trong không gian đa biến, bạn có thể có các trục x, y, z và, w (trong đó trục w là "tưởng tượng"). Bạn có thể biểu diễn bất kỳ phần tử nào của không gian đó dưới dạng (x, y, z, w).

Tất cả các điểm này trong không gian được biểu thị bằng các vectơ. Trong bốn không gian, bạn có thể có hai vectơ, trong đó v1 = (x1, y1, z1, w1) và v2 = (x2, y2, z2, w2). Sau đó, bạn thao tác các vectơ như bạn sẽ số. Chẳng hạn, tổng của hai vectơ, v1 + v2 sẽ là (x1, y1, z1, w1) + (x2, y2, z2, w2). Sau đó, bạn thêm các vectơ này theo thuật ngữ như bạn muốn số, để có được: (x1 + x2, y1 + y2, z1 + z2, w1 + w2).

Chương trình của bạn sẽ xác định các vectơ bằng cách sử dụng các mảng thích hợp và sau đó thực hiện các phép toán số học trên chúng theo thứ tự phù hợp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.