다차원 보간
다차원 보간 (Multi-dimensional Interpolation)
2차원·3차원·n차원 데이터를 보간해야 할 때 Octave가 제공하는 함수들을 소개할게요. 각 함수의 시그니처와 보간 방법, 그리고 차원 처리의 차이를 살펴볼게요.
출처: 문서
본문
Octave에는 비슷한 기능을 가진 세 개의 다차원 보간 함수가 있어요. Delaunay 테셀레이션을 사용하는 방법은 흩어진 데이터 보간 항목에서 설명합니다.
interp2
zi = interp2 (x, y, z, xi, yi)
zi = interp2 (z, xi, yi)
zi = interp2 (z, n)
zi = interp2 (z)
zi = interp2 (…, method)
zi = interp2 (…, method, extrap)
2차원 보간이에요. 수치 참조 데이터 x, y, z를 보간해 좌표 xi, yi에서 zi를 결정해요.
참조 데이터 x, y는 meshgrid가 반환한 것 같은 행렬일 수 있으며, 그 경우 x, y, z의 크기가 같아야 해요. x, y가 격자를 설명하는 벡터라면 length (x) == columns (z)이고 length (y) == rows (z)예요. 어느 경우든 입력 데이터는 엄격히 단조(monotonic)여야 해요.
x, y 없이 참조 데이터 행렬 z만으로 호출하면 2-D 영역 x = 1:columns (z), y = 1:rows (z)를 가정해요. 격자가 규칙적이고 점 사이의 거리가 중요하지 않으면 메모리를 아껴요.
참조 데이터 행렬 z 하나와 세분(refinement) 값 n으로 호출하면, 각 원래 구간이 n번 재귀적으로 세분된 격자에서 보간을 수행해요. 이는 원래 격자의 모든 구간에 대해 2^n-1개의 추가 점을 만듭니다. n이 생략되면 기본값 1이 사용돼요. 예를 들어 n==2인 구간 [0,1]은 [0, 1/4, 1/2, 3/4, 1]의 점을 가진 세분된 구간이 돼요.
보간 방법은 다음 중 하나예요.
"nearest"— 가장 가까운 이웃을 반환해요."linear"(기본값) — 가장 가까운 이웃에서 선형 보간해요."pchip"— 조각별 3차 Hermite 보간 다항식. 매끄러운 1차 도함수를 가진 형태 보존 보간이에요."cubic"— 합성곱 커널 함수를 사용한 3차 보간. 매끄러운 1차 도함수를 가진 3차 방법이에요."spline"— 3차 스플라인 보간. 곡선 전체에 걸쳐 매끄러운 1·2차 도함수를 가져요.
extrap는 스칼라 숫자예요. 끝점 너머의 값을 extrap로 대체해요. extrap를 쓰면 method도 반드시 지정해야 해요. extrap를 생략하고 method가 "spline"이면 "spline"의 외삽 값을 사용해요. 그 외 방법의 기본 외삽 값은 "NA"예요.
See also: interp1, interp3, interpn, meshgrid.
interp3
vi = interp3 (x, y, z, v, xi, yi, zi)
vi = interp3 (v, xi, yi, zi)
vi = interp3 (v, n)
vi = interp3 (v)
vi = interp3 (…, method)
vi = interp3 (…, method, extrapval)
3차원 보간이에요. 수치 참조 데이터 x, y, z, v를 보간해 좌표 xi, yi, zi에서 vi를 결정해요.
참조 데이터 x, y, z는 meshgrid가 반환한 것 같은 행렬일 수 있으며, 그 경우 x, y, z, v의 크기가 같아야 해요. x, y, z가 입방 격자를 설명하는 벡터라면 length (x) == columns (v), length (y) == rows (v), length (z) == size (v, 3)이에요. 어느 경우든 입력 데이터는 엄격히 단조여야 해요.
x, y, z 없이 참조 데이터 행렬 v만으로 호출하면 3-D 영역 x = 1:columns (v), y = 1:rows (v), z = 1:size (v, 3)을 가정해요. 격자가 규칙적이고 점 사이의 거리가 중요하지 않으면 메모리를 아껴요.
참조 데이터 행렬 v 하나와 세분 값 n으로 호출하면 각 원래 구간이 n번 재귀적으로 세분된 3-D 격자에서 보간을 수행해요. 이는 원래 격자의 모든 구간에 대해 2^n-1개의 추가 점을 만듭니다. n이 생략되면 기본값 1이 사용돼요. 예를 들어 n==2인 구간 [0,1]은 [0, 1/4, 1/2, 3/4, 1]의 점을 가진 세분된 구간이 돼요.
보간 방법은 다음 중 하나예요.
"nearest"— 가장 가까운 이웃을 반환해요."linear"(기본값) — 가장 가까운 이웃에서 선형 보간해요."cubic"— 조각별 3차 Hermite 보간 다항식. 매끄러운 1차 도함수를 가진 형태 보존 보간이에요(아직 구현되지 않음)."spline"— 3차 스플라인 보간. 곡선 전체에 걸쳐 매끄러운 1·2차 도함수를 가져요.
extrapval은 스칼라 숫자예요. 끝점 너머의 값을 extrapval로 대체해요. extrapval을 쓰면 method도 반드시 지정해야 해요. extrapval을 생략하고 method가 "spline"이면 "spline"의 외삽 값을 사용해요. 그 외 방법의 기본 외삽 값은 "NA"예요.
See also: interp1, interp2, interpn, meshgrid.
interpn
vi = interpn (x1, x2, …, v, y1, y2, …)
vi = interpn (v, y1, y2, …)
vi = interpn (v, m)
vi = interpn (v)
vi = interpn (…, method)
vi = interpn (…, method, extrapval)
n이 최소 2인 n차원 보간을 수행해요.
n차원 수치 배열 v의 각 원소는 매개변수 x1, x2, …, xn이 주는 위치에서의 값을 나타내요. 매개변수 x1, x2, …, xn은 "ndgrid" 형식의 배열 v와 같은 크기의 n차원 배열이거나 벡터예요.
매개변수 y1, y2, …, yn은 배열 vi가 보간되는 지점을 나타내요. 같은 길이와 방향의 벡터면 흩어진 점의 좌표로 해석돼요. 방향이나 길이가 다른 벡터면 "ndgrid" 형식의 격자를 만드는 데 사용돼요. 같은 크기의 n차원 배열일 수도 있어요.
x1, …, xn이 생략되면 x1 = 1 : size (v, 1) 등으로 가정해요. m이 지정되면 보간이 각 보간 점 사이의 중간 지점에 점을 추가해요. 이 과정을 m번 수행해요. v만 지정되면 m은 1로 가정돼요.
보간 방법은 다음 중 하나예요.
"nearest"— 가장 가까운 이웃을 반환해요."linear"(기본값) — 가장 가까운 이웃에서 선형 보간해요."pchip"— 조각별 3차 Hermite 보간 다항식(아직 구현되지 않음)."cubic"— 3차 보간("pchip"과 같음, 아직 구현되지 않음)."spline"— 3차 스플라인 보간. 곡선 전체에 걸쳐 매끄러운 1·2차 도함수를 가져요.
기본 방법은 "linear"예요.
extrapval은 스칼라 숫자예요. 끝점 너머의 값을 extrapval로 대체해요. extrapval을 쓰면 method도 반드시 지정해야 해요. extrapval을 생략하고 method가 "spline"이면 "spline"의 외삽 값을 사용해요. 그 외 방법의 기본 외삽 값은 NA예요.
See also: interp1, interp2, interp3, spline, ndgrid.
차원 처리 차이
interpn과 다른 두 다차원 보간 함수 사이의 중요한 차이는 차원을 다루는 방식이에요. interp2와 interp3에서 y축은 행렬의 열로, x축은 배열의 행으로 간주돼요. Octave는 열 주요(column-major) 순서로 배열을 인덱싱하므로 모든 배열의 첫 번째 차원은 열이 돼요. 그래서 interpn은 사실상 'x'와 'y' 차원을 뒤집어요. 다음 예시를 봐요.
x = y = z = -1:1;
f = @(x,y,z) x.^2 - y - z.^2;
[xx, yy, zz] = meshgrid (x, y, z);
v = f (xx,yy,zz);
xi = yi = zi = -1:0.1:1;
[xxi, yyi, zzi] = meshgrid (xi, yi, zi);
vi = interp3 (x, y, z, v, xxi, yyi, zzi, "spline");
[xxi, yyi, zzi] = ndgrid (xi, yi, zi);
vi2 = interpn (x, y, z, v, xxi, yyi, zzi, "spline");
mesh (zi, yi, squeeze (vi2(1,:,:)));
여기서 vi와 vi2는 동일해요. 차원의 역전은 각각 meshgrid와 ndgrid 함수에서 처리됩니다. 이 코드의 결과는 Figure 29.4에서 볼 수 있어요.
더 알아보기
- 1차원 보간은
interp1이 있는 1차원 보간 항목을 참고하세요. - 흩어진 데이터 보간도 함께 보면 좋아요.