1Dデータ構造を2Dグリッドとして扱う


48

2Dイメージを1D配列として表すネイティブクラスを使用しています。たとえば、1つのピクセルを変更する場合は、x,y座標からインデックスを取得する方法が必要になります。

したがって、次のarray1dような1D配列があるとします。

array1d = [ a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y ]

プログラムのコンテキストでarray1dは、2Dグリッドを表します。

a b c d e
f g h i j
k l m n o
p q r s t
u v w x y

そして、次のarray1dような操作を実行します。

  • x,y座標で値を取得します(この例で1,2は、になりますl
  • 使用して、任意のサブグリッドを取得するx,y,width,height1,2,2,2与えます[l, m, q, r]
  • 任意のx,y座標(など)に値を設定します

これらをどのように行うのですか?


(CSに流出)のMatlab、したがっておそらく数学型において、(1X12 2×6、または3×4に2×6にそれをすること)、「整形」として知られている他につのマトリックスに変換するmathworks.com/help/matlab/ ref / reshape.html

@MichaelT:OPはグリッドを再形成していません。5x5を他の何かに変更することについては言及していません(とにかく意味がありません)。:)
IAbstract

その質問@IAbstract だったリビジョン1けれども。

回答:


86

2D / 1D-マッピングは非常に簡単です。xとy、および2D配列サイズwidth(x方向の場合)およびheight(y方向の場合)を指定するとi、1D空間(ゼロベース)の対応するインデックスを次のように計算できます。

i = x + width*y;

そして逆の操作は

x = i % width;    // % is the "modulo operator", the remainder of i / width;
y = i / width;    // where "/" is an integer division

これを3次元以上に簡単に拡張できます。たとえば、寸法が「幅」、「高さ」、「深さ」の3Dマトリックスの場合:

i = x + width*y + width*height*z;

そして逆:

x = i % width;
y = (i / width)%height;
z = i / (width*height);

@awashburnはそれを行う従来の方法であり、静的2D配列用のコンパイラーに組み込まれています
ラチェットフリーク

@mtoast:私はそうは思わない、ただの基本的な整数計算です。
ドックブラウン

この例は3Dには不適切です。計算の単語の深さは高さでなければなりません。
ジグガンジャー

@jiggunjer:修正のおかげで、それに応じて私の答えが変わりました。
Doc Brown

1
@makakas:それは読者に任せた演習です;-)。ヒント:正しい場所でオフセットとして下限を追加/減算する必要があります。ただし、これを試す前に、2つの配列のうち、1D配列か2D配列かを明確にしてください。
ドックブラウン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.