1D 데이터 구조를 2D 그리드로 취급


48

2D 이미지를 1D 배열로 나타내는 기본 클래스로 작업하고 있습니다. 예를 들어 한 픽셀을 변경하려면 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,height( 1,2,2,2줄 것이다 [l, m, q, r])
  • 모든 x,y좌표 등에서 값을 설정하십시오 .

우리는 이것을 어떻게합니까?


Matlab에서 수학 유형 (CS로 유출 됨)에서 한 행렬을 다른 행렬로 변환하기 위해 (1x12를 2x6로 또는 2x6을 3x4로 변환) mathworks.com/help/matlab/ ref / reshape.html

@MichaelT : OP가 그리드를 재구성하지 않습니다. 5x5를 다른 것으로 바꾸는 것에 대한 언급은 없습니다 (어쨌든 의미가 없습니다). :)
IAbstract 12

@IAbstract 그 질문이 있었다 에서 개정 한 것처럼.

답변:


86

2D / 1D-매핑은 매우 간단합니다. x 및 y, 2D 배열 크기 width(x 방향) 및 height(y 방향)가 주어지면 i1D 공간 (0부터 시작)에 따라 해당 인덱스 를 계산할 수 있습니다.

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 배열 용 컴파일러에 내장되어 있습니다.
ratchet freak

@ mtoast : 나는 기본적인 정수 수학이라고 생각하지 않습니다.
Doc Brown

이 예는 3D에 적합하지 않습니다. 계산에서 단어 깊이는 높이 여야합니다.
jiggunjer

@ jiggunjer : 수정 주셔서 감사합니다, 그에 따라 내 대답을 변경했습니다.
Doc Brown

1
@makakas : 그것은 독자에게 맡겨진 운동이다 ;-). 힌트 : 올바른 위치에서 하한을 오프셋으로 더하거나 빼야합니다. 그러나 이것을 시도하기 전에 두 배열 중 1D 또는 2D 배열 중 어느 것을 의미하는지 명확히하십시오.
Doc Brown
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.