要約:
したがって、私が理解しているように(理解は非常に限られていますが)、(通常は)物理的に扱う3つの側面があります。
1番目は線で表されます。
2番目は正方形で表されます。
3番目は立方体で表されます。
4th に到達するまで十分に単純です-私が何を意味するかを知っていると、3Dスペースに描画するのは少し難しいです...一部の人々は 時間との関係 。
質問:
さて、それだけではあまり意味がありませんが、それは私にとっては素晴らしいことです。私の質問はこれについてではなく、MathSOまたはPhysicsSOで質問します。私の質問は次のとおりです:コンピュータはこれを配列でどのように処理しますか?
多くの異なるプログラミング言語で4D、5D、6Dなどの配列を作成できることは知っていますが、それがどのように機能するか知りたいです。
幸いなことに、プログラムは現実世界の物理的な制約によって制限されません。配列は物理空間に格納されないため、配列の次元数は関係ありません。それらは線形メモリにフラット化されます。たとえば、2つの要素を持つ1次元配列は次のようにレイアウトされます。
(0) (1)
2x2次元配列は次のようになります。
(0,0) (0,1) (1,0) (1,1)
3次元の2x2x2配列は次のようになります。
(0,0,0) (0,0,1) (0,1,0) (0,1,1) (1,0,0) (1,0,1) (1,1,0) (1,1,1)
うまくいけば、これがどこに向かっているのかがわかります。 4つの次元は次のとおりです。
(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)
高い空間的次元で想像する必要はありません。それをシダの葉と考えてください。
主な茎は最初の配列で、各ブランチは格納されているアイテムです。ブランチを見ると、これが2番目の次元です。データを表す小さなブランチの同様の構造があります。これらには、独自の小さなブランチがあり、最も内側または最も高い次元の配列のデータを表す小さな葉に到達するまで続きます。
それぞれのレベルを独自の名前で宣言すると、この増加がわかります。ここでは、コードを最小限に抑えるために、各レベル変数を再利用しています。
leaf = 2;
tinyBranch = [leaf, leaf, leaf];
middleBranch = [tinyBranch, tinyBranch, tinyBranch];
bigBranch = [middleBranch, middleBranch, middleBranch];
mainBranch = [bigBranch, bigBranch, bigBranch];
次元はあなたがなりたいものであり、4次元は必ずしも時間である必要はありません。 3つの次元を立方体と考える場合、4つの次元を立方体の行と考えることができます。 5次元、立方体のグリッドなど。
また、ボクセルの3Dコレクションを作成し、4番目の次元を色、密度、またはその他のプロパティにすることもできます。
多次元配列にメモリを割り当てる場合、データ型に最大の各次元の積を割り当てるだけです。各次元に10要素の3D配列または「キューブ」がある場合、1,000要素が割り当てられます。 4次元に10個の要素を持つ4d配列を作成すると、コンピューターは10,000を割り当てます。 5次元までバンプすると、100,000が割り当てられます。
コンピュータは、各次元が何を表すのかについて、いかなる種類の意味も気にしません。要素のリストで単一のポイントがある場所を選択するには、メモリアドレスを選択するだけです。
新しい医療機器、つまり患者の腕に沿って置く一連のセンサーでR&Dを行うことを想像してみてください。テストのために7人のボランティアが並んでいます。各センサーは、低周波数、中周波数、および高周波数の読み取り値を報告します。これらの読み取り値は、100ミリ秒ごとに約1分間かかります。
分析とプロットのためにすべてのデータをメモリに保存する方法は?
明らかに配列です。これは次のようになります(作成された汎用擬似コードを使用)。
npatients = 7
nsensors = 4 // number of sensors on an arm
nchannels = 3
nsamples = 60.0 / 0.1
sensordata = Array[ npatients, nsensors, 2, nchannels, nsamples ]
これは5次元配列であり、トリッキー、ミステリアス、または不可解なことは何もありません。それを5次元ユークリッド空間と関連付けようとする理由はありません。 1つのデータ値を取得するには、次のような式を使用します
x = sensordata[6, 5, 1, 2, 338)
これは、各データ値のレコードがあり、患者ID、センサーIDなどを保持する5つの列と、値を含む列があるリレーショナルデータベースのクエリと同じです。 1つのデータポイントを取得するには、WHEREで5つの用語を使用します。SELECTvalue FROM SensorData WHERE(patientid = 6)and(sensorid = 5)and(arm = "left")and(channel = "midfreq")and(sampleindex = 338 )。
5つ以上の列を持つデータベーステーブルに神秘的なものはありませんか。
(私は1ベースのインデックスを使用していますが、実際には0ベースの方がはるかに一般的です。)
腕の数をハードコーディングしているため、私は悪い子です。タコでこれらのセンサーを調査するための資金を与えられた場合、私は困っています!
配列は、連続したメモリのブロックにすぎません。メモリのアドレス指定は1次元であり、前方または後方に移動できます。したがって、5つの要素を持つ配列があるとすると、5つのメモリブロックが予約されます。各次元に5つの要素を持つ2次元配列がある場合、25のメモリブロックが予約されます。
...または、MathSOで質問します...
まあ、実際のところ、数学者はnever(または、少なくとも通常は)4番目の次元を時間のようなものに関連付けません。また、最初の3つを次のようなスペースに関連付けません。数学者は単にdefineディメンションを、通常は vector spaceの抽象プロパティとして (これは manifolds または even metric space に一般化されます)。そして、この抽象的な定義は、たまたま私たちが移動する物理空間がいくつの次元を持っているかを気にしません。寸法の概念は、物理的な空間にさえ似ていない空間に適用されます。実際、数学者(そして実際の物理学者)は、量子力学のヒルベルト空間のような無限次元空間を非常に頻繁に使用します。
それが明確になったら、配列について話しましょう。抽象的な定義は実際にはここではるかに単純なので、ベクトル空間を理解する必要はありません。
(ℓ ×ℓ1 ×ℓ2 ×...×ℓn-1)サイズの配列(つまり、次元n)は、単にℓ ⋅ℓ1 ⋅...⋅ℓn-1 数値(または、任意のタイプのオブジェクトが配列に入力されます)。その長さの1次元配列との唯一の違いは、個別に次元にインデックスを付ける特定の便利な方法があることです。
i林 =in-1 +ℓn-1 ⋅(in-2 +ℓn-1 ⋅(...ℓ2 ⋅(i1 +ℓ1 ⋅i)...))
1次元配列をチェストのようなものと考えてください。
各引き出しはアレイのインデックスです。各引き出しには何でも入れることができ、多くの目的で、各引き出しには1つのアイテム(1次元配列)のみが含まれます。
このチェストは魔法のようですが、物理的なスペースに制限されません。つまり、最初の引き出しの各引き出しの内側に別の引き出しの胸を置くことができます。引き出しの内側のチェストには、好きなものを入れることができます。これは2次元配列です。
たとえば、「最初のチェストの上部のドロワーを開き、そのチェストを引き出しから引き出し、次にその2番目のチェストの下部のドロワーを開く」のように言うことができます。これは、2D配列のインデックスにアクセスするようなものです。myArray[0] [3];
そしてもちろん、一番外側の引き出しチェストの内側の引き出しチェストには、引き出しチェストを入れることができます。これは3次元配列です。
それで、あなたの質問は:4次元配列とは何ですか?もちろん、チェストチェストチェストチェストチェストチェストドロワーチェストドロワー
引き出しはずっと下にあります。
プログラミングでは、配列の実装は非常に簡単ですが、理解できない場合があります。
一般に、配列の各レベルは、コンテンツがn
- foldであることを意味します。つまり
int x[4]
は4つのブロックで、それぞれにint
が含まれています。int x[5][4]
は5つのブロックで、それぞれにint[4]
が含まれています。int x[3][5][4]
は3つのブロックで、それぞれにint[5][4]
が含まれています。int x[2][3][5][4]
は2つのブロックで、それぞれにint[3][5][4]
が含まれています。それらをどのように参照するかはあなた次第ですが、理解を深めるために、
COLUMN
ROW
は最後から2番目PAGE
ここまでどこかで読んだ。ここに留まるために、
BOOK
は最後から4番目SHELF
かもしれません。 (または、必要に応じて、SHELFROW
を使用して続行できます。)とはいえ、「野生生物」の中で4次元または5次元を超える配列を見たことはありません。
このように、int x[6][2][3][5][4]
を6つの「棚」のコレクションとして定義し、想像することができます。それぞれが2つの本を持ち、それぞれが3つのページを持ち、それぞれが5つの行と4つの列を持っています。
この質問のほとんどの側面はすでに検討されていますが、次元の性質を考慮すると役立つと思います。すべての次元が空間的であるとは限りません。ディメンションは測定のコンテキストです。ここではいくつかの例を示します。
3番目の空間次元があるため、「4番目」の次元は4番目のみです。時空は大きく織り込まれています。非常にあなたの顔に。しかし、定量化可能で測定可能な品質は、それを測定する場合、次元になる可能性があります。
たとえば、ブラジャーには、カップのサイズ、胸のサイズ、インタースティシャルの3つの次元があります(女の子が何と呼ぶかわかりませんが、カップ間の距離を意味します)。
物理学では、各空間次元は無限であると想定しているため、新しい次元の空間を見つけることは非常に困難です。
有限配列を扱う場合、スペースを見つけるのは簡単です。
グリッドが印刷された紙を想像してみてください。グリッドの各セルに情報を書き込むことができます。これは2D配列です:行と列。
それらの紙の何枚かをファイルフォルダに入れます。これは、ページ、行、列の3D配列です。
それらのフォルダのいくつかをファイルボックスに入れます。 4D配列:フォルダー、ページ、行、列。
ボックスを木製パレットの長方形グリッドに配置します。 6D配列:ボックス行、ボックス列、フォルダー、ページ、行、列。
それらの上にボックスのグリッドをさらに積み重ねます。 7D配列:ボックスの深さ、ボックスの行、ボックスの列、フォルダー、ページ、行、列。
9D配列の輸送用コンテナーにパレットを詰め込み始めます。 (各スタックの高さはコンテナーの内側と同じであるため、ここではさらに2つの次元しか取得できません。)
コンテナ船のデッキに輸送用コンテナを積み重ねます:12Dアレイ。
コンテナ船の艦隊は13Dアレイになりました。
デカルト座標系では、平面上にx軸とy軸があります。平面上の任意の数を(x、y)として表すことができます。
3つの「空間」(別名キューブ)では、x、y、z軸を持つことができます。キューブの任意の要素を(x、y、z)として表すことができます。
多変量空間では、x、y、z、およびw軸(w軸は「虚数」)を持つことができます。その空間の任意の要素を(x、y、z、w)として表すことができます。
空間内のこれらの点はすべてベクトルで示されます。 4空間では、2つのベクトルを使用できます。ここで、v1 =(x1、y1、z1、w1)、およびv2 =(x2、y2、z2、w2) 。次に、番号と同じようにこれらのベクトルを操作します。たとえば、2つのベクトルの合計v1 + v2は(x1、y1、z1、w1)+(x2、y2、z2、w2)になります。次に、これらのベクトルを番号と同じように項ごとに追加して、(x1 + x2、y1 + y2、z1 + z2、w1 + w2)を取得します。
プログラムは、適切な配列を使用してベクトルを定義し、適切な順序でそれらに対して算術演算を実行します。