이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

그리딩된 데이터 보간하기

그리딩된 데이터 표현

그리드 표현

이 예제에서는 meshgridndgrid를 사용하여 2차원 그리드를 만드는 방법을 보여줍니다.

MATLAB®에서, 그리딩된 데이터는 그리드에 정렬된 데이터를 의미합니다. MATLAB에서 데이터를 행렬로 저장하는 방식을 생각해 보면 정렬된 데이터를 이해하는 데 도움이 될 수 있습니다.

데이터를 정의합니다.

A = gallery('uniformdata',[3 5],0)
A = 3×5

    0.9501    0.4860    0.4565    0.4447    0.9218
    0.2311    0.8913    0.0185    0.6154    0.7382
    0.6068    0.7621    0.8214    0.7919    0.1763

MATLAB은 이 데이터를 행렬로 저장합니다. A를 행렬의 인덱스별로 정렬된 요소에 대한 위치의 집합으로 생각할 수 있습니다. A의 선형 인덱스는 다음과 같습니다.

[147101325811143691215]

행렬의 요소는 인덱싱, 즉 행렬에서 해당 위치에 있는 요소를 찾는 방식으로 가져올 수 있습니다. A의 i번째 요소는 A(i)로 가져옵니다.

A의 7번째 요소를 가져옵니다.

A(7)
ans = 0.4565

mxn 행렬에서, i번째 요소에 인접한 열 요소는 i를 1씩 오프셋하여 찾을 수 있습니다. i번째 요소에 인접한 행 요소를 찾으려면 i를 m만큼 오프셋하십시오.

i-1i-mii+mi+1

A(7)에 인접한 열 요소를 가져옵니다.

A(6),A(8)
ans = 0.7621
ans = 0.0185

MATLAB은 데이터 그리드를 만들 때 이와 유사한 방식을 사용합니다. 그리드는 단순히 특정 기하학적 특성을 충족하는 점의 집합이 아닙니다. 정확히 말해, 그리딩된 데이터 세트는 그리드에 있는 점들 사이의 정렬된 관계를 기반으로 합니다. 그리드 구조체에서 쉽게 확인할 수 있는 인접 여부에 대한 정보는 여러 응용 사례와 특히 그리드 기반 보간에 매우 유용합니다.

MATLAB은 다음 두 가지의 그리드 생성 함수를 제공합니다.

  • meshgrid는 카테시안 축에 정렬된 2차원 그리드와 3차원 그리드를 만듭니다. 2차원 그리드를 만들기 위한 구문은 [X,Y] = meshgrid(xgv, ygv)입니다. 여기서 xgv는 길이가 m인 벡터이고 ygv는 길이가 n인 벡터입니다. meshgridxgv를 복제하여 nxm 행렬 X를 생성하고, ygv를 복제하여 또 다른 nxm 행렬 Y를 생성합니다. XY는 그리드 점의 좌표를 나타냅니다. X의 행은 가로 X축에 정렬되고, Y의 열은 음의 Y축에 정렬됩니다.

  • ndgrid는 배열 공간에 정렬된 N차원 그리드를 만듭니다. 배열 공간에서 좌표축은 행, 열, 페이지 등입니다. 호출하는 구문은 [X1, X2, X3,...,Xn] = ndgrid(x1gv, x2gv, x3gv,...,xngv)입니다. 여기서 x1gv,x2gv,x3gv,...,xngv는 각 차원의 그리드를 포괄하는 벡터입니다. X1,X2,X3,...,Xn은 다변수 함수의 실행과 다차원 보간에 사용할 수 있는 출력 배열입니다.

meshgrid를 사용하여 두 벡터 xgvygv에서 2차원 축 정렬 그리드를 만듭니다.

xgv = [1 2 3];
ygv = [1 2 3 4 5];
[X,Y] = meshgrid(xgv, ygv)
X = 5×3

     1     2     3
     1     2     3
     1     2     3
     1     2     3
     1     2     3

Y = 5×3

     1     1     1
     2     2     2
     3     3     3
     4     4     4
     5     5     5

이제, ndgrid를 사용하여 동일한 두 벡터 xgvygv에서 2차원 공간 정렬 그리드를 만듭니다.

[X1,X2] = ndgrid(xgv,ygv)
X1 = 3×5

     1     1     1     1     1
     2     2     2     2     2
     3     3     3     3     3

X2 = 3×5

     1     2     3     4     5
     1     2     3     4     5
     1     2     3     4     5

ndgridX1meshgridX의 전치임을 알 수 있습니다. X2Y의 경우도 마찬가지입니다.

주어진 입력값의 집합에 대해 meshgrid 함수와 ndgrid 함수는 정확히 동일한 좌표를 갖는 그리드를 생성합니다. 두 함수 출력값의 유일한 차이점은 좌표 배열의 형식입니다. 두 출력값을 모두 플로팅하고 서로 같음을 확인합니다.

figure()
[X1_ndgrid,X2_ndgrid] = ndgrid(1:3,1:5);
Z = zeros(3,5);
mesh(X1_ndgrid,X2_ndgrid,Z,'EdgeColor','black')
axis equal;

% Set the axis labeling and title
h1 = gca;
h1.XTick = [1 2 3];
h1.YTick = [1 2 3 4 5];
xlabel('ndgrid Output')

figure()
[X_meshgrid,Y_meshgrid] = meshgrid(1:3, 1:5);
mesh(X_meshgrid,Y_meshgrid,Z','EdgeColor','black')
axis equal;

% Set the axis labeling and title
h2 = gca;
h2.XTick = [1 2 3];
h2.YTick = [1 2 3 4 5];
xlabel('meshgrid Output')

그리드를 어떻게 사용하려는지에 따라 둘 중 한 형식을 선호할 수 있습니다. MATLAB의 함수 중에는 meshgrid 형식의 데이터를 필요로 하는 함수도 있고, ndgrid 형식의 데이터를 필요로 하는 함수도 있습니다.

그리드 형식 간에 변환하기.  2차원 그리드 출력값을 meshgrid 형식에서 ndgrid 형식으로 변환하려면 다음과 같이 좌표 행렬을 전치하십시오.

[X_meshgrid,Y_meshgrid] = meshgrid(1:3, 1:5);
[X1_ndgrid,X2_ndgrid] = ndgrid(1:3,1:5);

isequal(X_meshgrid',X1_ndgrid)
ans =
     1
isequal(Y_meshgrid',X2_ndgrid)
ans =
     1
permute 함수를 사용할 수도 있습니다.
isequal(permute(X_meshgrid,[2 1]),X1_ndgrid)
ans =
     1
3차원 meshgridndgrid로 변환하려면 좌표 배열의 각 페이지를 전치하십시오. 배열 my_array가 지정된 경우 permute(my_array, [2 1 3])은 행과 열을 서로 바꿔, 결과적으로 모든 페이지가 전치되도록 합니다.
[X_meshgrid,Y_meshgrid,Z_meshgrid] = meshgrid(1:3, 1:5, [1 2]);
[X1_ndgrid,X2_ndgrid,X3_ndgrid] = ndgrid(1:3,1:5, [1 2]);

isequal(permute(X_meshgrid,[2 1 3]),X1_ndgrid)
ans =
     1

isequal(permute(Y_meshgrid,[2 1 3]),X2_ndgrid)
ans =
     1

isequal(permute(Z_meshgrid,[2 1 3]),X3_ndgrid)
ans =
     1

그리드 벡터.  그리드 함수에 전달하는 입력값을 그리드 벡터라고 합니다. 그리드 벡터는 암묵적으로 그리드를 정의합니다. 두 개의 벡터 x1gv = (1:3)x2gv = (1:5)가 있다고 가정해 보겠습니다. 다음과 같이 이러한 벡터를 x1 방향의 좌표의 집합과 x2 방향의 좌표의 집합으로 생각해 볼 수 있습니다.

각 화살표는 위치를 가리킵니다. 이러한 두 벡터를 사용하여 그리드 점 집합을 정의할 수 있습니다. 여기서 한 좌표의 집합은 x1gv에 의해 지정되고 다른 좌표의 집합은 x2gv에 의해 지정됩니다. 그리드 벡터를 복제할 경우 이들은 전체 그리드를 구성하는 두 개의 좌표 배열을 형성합니다.

단조적(Monotonic) 그리드와 비단조적(Nonmonotonic) 그리드.  입력 그리드 벡터는 단조적이거나 비단조적일 수 있습니다. 단조 벡터는 해당 차원에서 증가하거나 감소하는 값을 포함합니다. 반대로, 비단조 벡터는 오르내리는 값을 포함합니다. [2 4 6 8 3 1]과 같이 입력 그리드 벡터가 비단조적이면 ndgrid는 다음을 출력합니다.

[X1,X2] = ndgrid([2 4 6 3 1])
X1 =
     2     2     2     2     2
     4     4     4     4     4
     6     6     6     6     6
     3     3     3     3     3
     1     1     1     1     1

X2 =
     2     4     6     3     1
     2     4     6     3     1
     2     4     6     3     1
     2     4     6     3     1
     2     4     6     3     1
그리드를 다른 MATLAB® 함수에 전달하려는 경우 그리드 벡터는 단조적이어야 합니다.

균일 그리드(Uniform Grid)와 비균일 그리드(Nonuniform Grid).  균일 그리드는 지정된 차원의 모든 인접한 점이 동일한 간격을 갖는 그리드를 말합니다. 예를 들어, [X1, X2] = ndgrid([1 3 5 9],[11 13 15])는 각 차원의 점 사이 간격이 2씩인 균일 그리드입니다.

균일 그리드의 간격이 모든 차원에서 같을 필요는 없습니다. 예를 들어, [X1, X2] = ndgrid([1 2 3 4],[11 13 15])X1X2의 간격이 서로 다를지라도 균일 그리드로 간주됩니다.

간격이 어떤 한 차원에서 달라지는 그리드는 비균일 그리드라고 합니다. 예를 들어, [X1, X2] = ndgrid([1 5 6 9],[11 13 15])의 경우 첫 번째 차원에서 간격이 서로 다르므로 비균일 그리드를 생성합니다.

균일균일비균일

그리드의 표현 유형

MATLAB에서는 그리드를 전체 그리드, 간소 그리드, 디폴트 그리드의 세 가지 표현 중 하나로 나타낼 수 있습니다. 간소 그리드와 디폴트 그리드는 주로 간편하고 효율성을 높일 목적으로 사용됩니다.

전체 그리드.  전체 그리드는 점이 명시적으로 정의된 그리드입니다. ndgridmeshgrid의 출력값은 전체 그리드를 정의합니다.

간소 그리드.  그리드의 모든 점을 명시적으로 정의하면 메모리가 많이 소모됩니다. 간소 그리드 표현은 전체 그리드의 메모리 오버헤드를 없앨 수 있는 한 방법입니다. 간소 그리드 표현에서는 전체 그리드 대신 그리드 벡터만 저장합니다. (griddedInterpolant 클래스가 간소 그리드 표현을 사용하는 방법에 대한 자세한 내용은 griddedInterpolant 클래스를 사용한 보간 항목을 참조하십시오.)

디폴트 그리드.  많은 경우에, 데이터를 분석할 때는 그리드의 점 사이 거리와 점의 값에 모두 주의를 기울입니다. 예를 들어, 지리적 영역에서 특정 지점의 강우량을 나타내는 데이터 세트가 있을 수 있습니다. 이 경우에는 각 그리드 점의 값과, 점과 이웃 점 사이의 거리에 신경을 쓰게 됩니다. 반면, 지정된 점의 값에만 신경 쓰고 상대 거리는 신경 쓰지 않을 수도 있습니다. 예를 들어, 점 사이 거리가 완전히 균일한 MRI 검사의 입력 데이터로 작업할 수 있습니다. 이때는 점의 값에는 주의를 기울이겠지만, 완전히 균일한 그리드임은 확신할 수 있을 것입니다. 이런 경우에는 디폴트 그리드 표현이 유용합니다. 디폴트 그리드 표현에서는 그리드 점의 값을 명시적으로 저장하고 그리드 점 좌표를 암묵적으로 생성합니다.

그리드 근사 기법

경우에 따라 데이터의 그리드를 근사해야 할 수 있습니다. 적절한 그리드 벡터 세트를 선택하여 표준 MATLAB 그리드로 근사 그리드를 그리면 가장 이상적입니다. 예를 들어, 점이 곡선을 따라 놓이는 그리드가 있을 수 있습니다. 데이터가 경도와 위도를 기반으로 할 경우 아래와 같은 데이터 세트가 생길 수 있습니다.

이 경우 입력 데이터를 직접 그리드에 표현할 수는 없지만, 다음과 같이 적절한 간격의 직선으로 그리드 선을 근사할 수 있습니다.

디폴트 그리드를 사용할 수도 있습니다.

퇴화된 그리드(Degenerate Grid).  퇴화된 그리드는 그리드에서 하나 이상의 차원이 한원소집합(Singleton)인 특수한 그리드를 말합니다. 한원소집합 차원은 다음 예제의 7:7과 같이 안쪽에 있거나,

[X1,X2,X3] = ndgrid(1:2:10,7:7,1:3:15);
또는, 다음과 같이 뒤쪽에 있을 수 있습니다.
[X1,X2,X3] = ndgrid(1:2:10,1:3:15,7:7);
대규모 데이터 세트의 일부만 사용하려는 경우 퇴화된 그리드를 만들 수 있습니다. 예를 들어, 3차원 MRI 검사의 일부만 분석하려 할 수 있습니다. 이 경우, 다음 그림에서 점으로 표시된 슬라이스와 같이, 다차원 그리드에서 특정 데이터 슬라이스만 필요할 것입니다.

다음 예제에서와 같이, 인덱싱을 사용하여 원하는 데이터를 추출할 경우 결과로 생기는 그리드는 X3 차원에서 퇴화된 그리드가 됩니다.

[X1,X2,X3] = ndgrid(1:3);

X1_slice = X1(:,:,2)
X1_slice =
     1     1     1
     2     2     2
     3     3     3

X2_slice = X2(:,:,2)
X2_slice =
     1     2     3
     1     2     3
     1     2     3

X3_slice = X3(:,:,2)
X3_slice =
     2     2     2
     2     2     2
     2     2     2

데이터 그리딩(Data Gridding)의 개념을 이해하는 것은 MATLAB이 그리드를 기반으로 하여 보간을 어떻게 수행하는지 이해하는 데 매우 중요합니다.

그리드 기반 보간

그리드 기반 보간에서, 보간할 데이터는 정렬된 그리드로 표시됩니다. 예를 들어, 사각형의 평평한 곡면 위에 세로 방향은 위에서 아래로, 가로 방향은 왼쪽에서 오른쪽으로 1cm 간격으로 온도 측정값을 배열할 경우 이는 2차원에 그리딩된 데이터로 간주됩니다. 그리드 기반 보간은 그리드 점 사이에 있는 임의 위치의 온도를 근사할 수 있는 효율적인 방법을 제공합니다.

그리드 기반 보간 사용 시 이점

그리드 기반 보간을 수행하면 계산 관련 오버헤드를 크게 줄일 수 있습니다. 그리딩된 구조에서는 MATLAB이 쿼리 점과 그 인접한 점을 매우 빠르게 찾을 수 있기 때문입니다. 이 동작 방식을 이해하기 위해 1차원 그리드에 다음과 같은 점이 있다고 가정해 보겠습니다.

인접한 점을 연결하는 선은 그리드의 을 나타냅니다. 첫 번째 셀은 x = 1x = 3 사이에 있으며, 두 번째 셀은 x = 3x = 5 사이에 있는 식입니다. 각 숫자는 그리드의 좌표를 나타냅니다. x = 6에서 그리드를 쿼리하려는 경우, 6은 그리드에 명시적으로 정의되어 있지 않으므로 보간을 사용해야 합니다. 이 그리드는 간격이 2로 균일하므로, 한 번의 정수 나눗셈(6/2 = 3)으로 쿼리 점의 위치를 좁힐 수 있습니다. 이 나눗셈 결과는 쿼리 점이 그리드의 세 번째 셀에 있음을 알려 줍니다. 2차원 그리드에서 셀을 찾으려면 각 차원에서 이 작업을 한 번씩 수행해야 합니다. 이 작업을 빠른 룩업(Fast Lookup)이라고 하며, MATLAB은 데이터가 균일 그리드에 정렬된 경우에만 이 기법을 사용합니다.

이 빠른 룩업에서는 쿼리 점 Xq가 포함된 셀을 효율적으로 찾습니다. 다음과 같이 이진 검색(Binary Search)이 진행됩니다.

  1. 중앙에 있는 그리드 점을 찾습니다.

  2. Xq를 그리드의 중앙에 있는 점과 비교합니다.

  3. Xq가 중앙에 있는 점보다 작으면, 중앙 점보다 큰 모든 그리드 점을 검색에서 제거합니다. 마찬가지로, Xq가 중앙에 있는 점보다 크면, 중앙 점보다 작은 모든 그리드 점을 제거합니다. 참고로, 이 방법을 통해, 검색해야 할 점의 수가 반으로 줄었습니다.

  4. 남은 그리드 점들의 중앙 점을 찾은 다음, 2단계부터 반복합니다. 쿼리의 양쪽에 그리드 점이 하나씩 남을 때까지 반복합니다. 이 두 개의 점이 Xq가 속하는 셀의 경계를 표시합니다.

다음 예제를 통해 이진 검색의 강력한 기능을 살펴보겠습니다. 전자 신용 카드 승인이 등장하기 전에, 사기성 신용 카드 구매를 가려내기 위해 판매자들이 할 수 있었던 유일한 방법은 각 고객의 신용 카드에 있는 고객 번호를 "요주의" 고객 번호 목록과 비교하는 것이었습니다. 이 목록은 수만 개의 카드 번호가 오름차순으로 정렬되어 있는 제본 소책자였습니다. 한 번의 판매를 위해 10,000개의 고객 번호가 있는 목록을 모두 검색하려면 몇 번이나 비교를 해야 할까요? n개 항목이 정렬된 목록의 경우 최대 비교 횟수는 이 목록을 반으로 나눌 수 있는 횟수, 즉 log2(n) 값에 불과합니다. 따라서 신용 카드를 검색하는 데 log2(10e3), 즉 약 13회의 비교밖에 필요하지 않습니다. 순차적 검색을 수행하는 데 필요한 비교 횟수를 고려해 보면 이 횟수는 매우 인상적입니다.

이와 대조적으로, 산점 데이터 세트와 관련된 문제를 살펴보겠습니다.

x = rand(20,1);
y = rand(20,1);
scatter(x,y)

쿼리 점에 근접해 있는 점을 찾기 위해서는 많은 연산이 필요합니다. 데이터 근삿값을 그리드로 구할 수 있는 경우, 그리드 기반 보간을 사용하면 계산 시간과 메모리 사용량이 크게 줄어듭니다.

데이터가 산점 데이터인 경우 산점 데이터 보간하기에 설명되어 있는 툴을 사용할 수 있습니다.

보간과 피팅 비교

MATLAB이 제공하는 보간 방식은 샘플 데이터 점들을 통과하는 보간 함수를 만드는 것입니다. 샘플 위치에서 보간 함수를 쿼리하려고 하면 해당 샘플 데이터 점의 값이 반환됩니다. 이와 반대로, 곡선 피팅과 곡면 피팅 알고리즘은 샘플 데이터 점들을 반드시 통과하지는 않습니다.

보간 방법

그리드 기반 보간에는 여러 가지 보간 방법이 존재합니다. 보간 방법을 선택할 때는 보간 방법에 따라 메모리 사용량이 더 많거나 계산 시간이 더 길어질 수 있다는 것에 유의하십시오. 그러나, 원하는 매끄러운 결과를 얻으려면 이러한 리소스 요구 사항을 절충해야 할 수 있습니다. 다음 표에는 각 보간 방법의 장단점과 요구 사항이 간략히 설명되어 있습니다.

방법설명연속성메모리 사용량과 성능요구 사항
최근접이웃쿼리 점에서 보간된 값은 가장 근접한 샘플 그리드 점에서의 값입니다. 불연속
  • 적당한 메모리 요구 사항

  • 계산 시간이 가장 빠름

  • 각 차원별로 2개의 그리드 점이 필요합니다.

다음 이웃 보간쿼리 점에서 보간된 값은 그다음 샘플 그리드 점에서의 값입니다.불연속

메모리 요구 사항과 계산 시간은 최근접이웃 보간과 동일합니다.

  • 1차원 보간에만 사용할 수 있습니다.

  • 최소 2개의 그리드 점이 필요합니다.

이전 이웃 보간쿼리 점에서 보간된 값은 이전 샘플 그리드 점에서의 값입니다.불연속

메모리 요구 사항과 계산 시간은 최근접이웃 보간과 동일합니다.

  • 1차원 보간에만 사용할 수 있습니다.

  • 최소 2개의 그리드 점이 필요합니다.

선형 보간(Linear)쿼리 점에서 보간된 값은 각 차원의 인접 그리드 점에서 값이 선형 보간된 것입니다. C0
  • 최근접이웃 보간보다 더 많은 메모리가 필요합니다.

  • 최근접이웃 보간보다 계산 시간이 더 많이 필요합니다.

  • 각 차원별로 최소 2개의 그리드 점이 필요합니다.

Pchip 보간쿼리 점에서 보간된 값은 인접 그리드 점에서 값이 형태 보존 조각별 3차 보간된 것입니다.C1
  • 선형 보간보다 더 많은 메모리가 필요합니다.

  • 선형 보간보다 계산 시간이 더 많이 필요합니다.

  • 1차원 보간에만 사용할 수 있습니다.

  • 최소 4개의 그리드 점이 필요합니다.

3차 보간(Cubic)쿼리 점에서 보간된 값은 각 차원의 인접 그리드 점에서 값이 3차 보간된 것입니다.C1
  • 선형 보간보다 더 많은 메모리가 필요합니다.

  • 선형 보간보다 계산 시간이 더 많이 필요합니다.

  • 각 차원의 간격이 동일해야 하는 것은 아니지만 그리드는 간격이 균일해야 합니다.

  • 각 차원별로 최소 4개의 점이 필요합니다.

수정된 아키마 보간(Modified Akima)쿼리 점에서 보간된 값은 각 차원의 인접 그리드 점 값을 사용하여 계산된, 차수가 최대 3인 다항식의 조각별 함수를 기반으로 합니다. 아키마 수식이 오버슈트를 방지하도록 수정되었습니다.C1
  • 메모리 요구 사항은 스플라인 보간과 유사합니다.

  • 3차 보간보다 계산 시간이 더 많이 필요하지만, 일반적으로 스플라인 보간보다는 더 적게 필요합니다.

  • 각 차원별로 최소 2개의 그리드 점이 필요합니다.

스플라인 보간(Spline)쿼리 점에서 보간된 값은 각 차원의 인접 그리드 점에서 값이 3차 보간된 것입니다.C2
  • 3차 보간보다 더 많은 메모리가 필요합니다.

  • 3차 보간보다 계산 시간이 더 많이 필요합니다.

  • 각 차원에 4개의 점이 필요합니다.

다음 그림은 1차원 데이터에 대한 각각의 보간 방법을 시각적으로 비교해서 보여줍니다.

보간 방법 비교

MATLAB은 다음과 같이 여러 가지 방법으로 그리드 기반 보간을 지원합니다.

  • interp 함수군: interp1, interp2, interp3, interpn.

  • griddedInterpolant 클래스.

interp 함수군과 griddedInterpolant는 모두 N차원 그리드 기반 보간을 지원합니다. 그러나 griddedInterpolant 클래스를 사용하면 interp 함수들을 사용할 때보다 메모리 및 성능상의 이점이 더 큽니다. 더욱이 griddedInterpolant 클래스는 데이터가 그리드에 표현되는 차원 수에 상관없이 작업할 수 있도록 일관된 단일 인터페이스를 제공합니다.

interp 함수군을 사용한 보간

interp1 함수

이 예제에서는 interp1 함수와 'pchip' 방법을 사용하여 샘플 값 세트를 보간하는 방법을 보여줍니다.

함수 interp1은 1차원 보간을 수행합니다. 이 함수의 가장 일반적인 형식은 다음과 같습니다.

Vq = interp1(X,V,Xq,method)

여기서 X는 좌표의 벡터이고 V는 이러한 좌표의 값을 포함하는 벡터입니다. Xq는 보간할 쿼리 점을 포함하는 벡터이고 method는 4가지 보간 방법 'nearest', 'linear', 'pchip', 'spline' 중 하나를 선택적으로 지정합니다.

1차원 그리드 점 집합 X와, 그에 대응하는 샘플 값 V를 만듭니다.

X = [1 2 3 4 5];
V = [12 16 31 10 6];

0.1 간격을 사용하여 더 촘촘한 간격으로 보간합니다.

Xq = (1:0.1:5);
Vq = interp1(X,V,Xq,'pchip');

샘플 값과 보간된 값을 플로팅합니다.

plot(X,V,'o');
hold on
plot(Xq,Vq,'-');
legend('samples','pchip');
hold off

interp1을 사용한 1차원 외삽

이 예제에서는 'extrap' 옵션을 사용하여 샘플 점의 영역 너머로 보간하는 방법을 보여줍니다.

샘플 점과 값을 정의합니다.

X = [1 2 3 4 5];
V = [12 16 31 10 6];

X의 영역을 벗어나는 쿼리 점 Xq를 지정합니다.

Xq = (0:0.1:6);
Vq = interp1(X,V,Xq,'pchip','extrap');

결과를 플로팅합니다.

figure
plot(X,V,'o');
hold on
plot(Xq,Vq,'-');
legend('samples','pchip');
hold off

또 다른 접근 방법으로, 외삽 영역의 동작을 더 자세히 제어하기 위해 점을 추가할 수 있습니다. 예를 들어, 반복된 값으로 영역을 확장하여 곡선이 외삽 영역에서 평평하게 유지되도록 제한할 수 있습니다.

X = [0 1 2 3 4 5 6];
V = [12 12 16 31 10 6 6];

X의 영역을 더 많이 벗어나는 쿼리 점 Xq를 지정합니다.

Xq = (-1:0.1:7);

'pchip'을 사용하여 보간합니다. 'extrap' 옵션은 'pchip', 'makima', 'spline' 방법에서 디폴트이기 때문에 생략할 수 있습니다.

Vq = interp1(X,V,Xq,'pchip');

결과를 플로팅합니다.

figure
plot(X,V,'o');
hold on
plot(Xq,Vq,'-');
legend('samples','pchip');
hold off

interp2 함수

이 예제에서는 interp2 함수를 사용하여 성기게 샘플링된 peaks 함수를 더 촘촘한 그리드에서 보간하는 방법을 보여줍니다.

interp2 함수와 interp3 함수는 각각 2차원 보간과 3차원 보간을 수행하며, 그리드를 meshgrid 형식으로 보간합니다. interp2를 호출하는 구문은 다음과 같은 일반적인 형식을 사용합니다.

Vq = interp2(X,Y,V,Xq,Yq,method)

여기서 XYmeshgrid 형식의 그리드를 정의하는 좌표의 배열이고 V는 그리드 점의 값을 포함하는 배열입니다. XqYq는 보간할 쿼리 점의 좌표를 포함하는 배열입니다. method는 4가지 보간 방법 'nearest', 'linear', 'cubic', 'spline' 중 하나를 선택적으로 지정합니다.

XY로 구성된 그리드 점은 단조 증가해야 하며 meshgrid 형식을 따라야 합니다.

성긴 그리드와 그에 대응하는 샘플 값을 만듭니다.

[X,Y] = meshgrid(-3:1:3);
V = peaks(X,Y);

샘플 값을 플로팅합니다.

surf(X,Y,V)
title('Sample Grid');

보간을 위해 더 촘촘한 그리드를 생성합니다.

[Xq,Yq] = meshgrid(-3:0.25:3);

interp2를 사용하여 쿼리 점에서 보간합니다.

Vq = interp2(X,Y,V,Xq,Yq,'linear');

결과를 플로팅합니다.

surf(Xq,Yq,Vq);
title('Refined Grid');

interp3 함수

이 예제에서는 interp3을 사용하여 단일 쿼리 점에서 3차원 함수를 보간하고 이를 해석적 표현에 의해 생성된 값과 비교하는 방법을 보여줍니다.

interp3은 두 개의 추가 인수를 사용한다는 점을 제외하고 interp2와 같은 방식으로 동작합니다. 두 개의 추가 인수 중 하나는 샘플 그리드에서의 3차원용이고 다른 하나는 쿼리 점에서의 3차원용입니다.

Vq = interp3(X,Y,Z,V,Xq,Yq,Zq,method).

interp2의 경우와 마찬가지로, interp3에 제공한 그리드 점은 단조 증가해야 하며 meshgrid 형식을 따라야 합니다.

X, Y, Z 입력값을 생성하는 함수를 정의합니다.

generatedvalues = @(X,Y,Z)(X.^2 + Y.^3 + Z.^4);

샘플 데이터를 만듭니다.

[X,Y,Z] = meshgrid((-5:.25:5));
V = generatedvalues(X,Y,Z);

특정 쿼리 점에서 보간합니다.

Vq = interp3(X,Y,Z,V,2.35,1.76,0.23,'cubic')
Vq = 10.9765

Vq를 해석적 표현에 의해 생성된 값과 비교합니다.

V_actual = generatedvalues(2.35,1.76,0.23)
V_actual = 10.9771

interpn 함수

이 예제에서는 interpn 함수와 'cubic' 방법을 사용하여 성기게 샘플링된 함수를 더 촘촘한 그리드에서 보간하는 방법을 보여줍니다.

함수 interpnndgrid 형식의 그리드에 대해 n차원 보간을 수행합니다. 이 함수의 가장 일반적인 형식은 다음과 같습니다.

Vq = interpn(X1,X2,X3,...Xn,V,Y1,Y2,Y3,...,Yn,method)

여기서 X1,X2,X3,...,Xnndgrid 형식의 그리드를 정의하는 좌표의 배열이고 V는 그리드 점의 값을 포함하는 배열입니다. Y1,Y2,Y3,...,Yn은 보간할 쿼리 점의 좌표를 포함하는 배열입니다. method는 4가지 보간 방법 'nearest', 'linear', 'cubic', 'spline' 중 하나를 선택적으로 지정합니다.

X1,X2,X3,...Xn으로 구성된 그리드 점은 단조 증가해야 하며 ndgrid 형식을 따라야 합니다.

일련의 그리드 점과, 그에 대응하는 샘플 값을 만듭니다.

[X1,X2] = ndgrid((-5:1:5));
R = sqrt(X1.^2 + X2.^2)+ eps;
V = sin(R)./(R);

샘플 값을 플로팅합니다.

mesh(X1,X2,V)
title('Sample Grid');

보간을 위해 더 촘촘한 그리드를 만듭니다.

[Y1,Y2] = ndgrid((-5:.5:5));

이 촘촘한 그리드에서 보간하고 결과를 플로팅합니다.

Vq = interpn(X1,X2,V,Y1,Y2,'cubic');
mesh(Y1,Y2,Vq)
title('Refined Grid');

interpn에는 샘플 그리드보다 정수 배만큼 더 촘촘한 그리드에서 보간할 수 있는 대체 구문 Vq = interpn(V,ntimes,method)가 있습니다. 위 코드에서 Y1Y2는 각 샘플 사이에 한 개의 추가 점이 포함된 그리드에서 보간 함수를 쿼리했습니다. 다음 코드는 ntimes=1을 사용하여 동일한 결과를 얻을 수 있는 방법을 보여줍니다.

ntimes=1을 사용하여 미세한 그리드에 대해 보간합니다.

Vq = interpn(V,1,'cubic');

결과를 플로팅합니다.

mesh(Vq)
title('Refined Grid with NTIMES');

플롯이 위 예제와 다르게 스케일링되었음을 알 수 있습니다. 이는 mesh를 호출하고 플로팅할 값만 전달했기 때문입니다. mesh 함수는 Vq의 차원을 기반으로 하는 디폴트 그리드를 사용했습니다. 출력값은 두 경우에서 모두 동일합니다.

비균일 쿼리 점 그리드를 제공할 수도 있습니다. 이는 그리드의 특정 영역에서 더 높은 해상도로 보간 함수를 쿼리하려는 경우에 유용할 수 있습니다. 다음 코드는 이를 수행할 수 있는 방법을 보여줍니다.

편향 그리드에서 보간합니다.

[Y1, Y2] = ndgrid([-5 -4 -3 -2.5 -2 -1.5 -1.25 -1 -0.75 -0.5 -0.20 0]);
Vq = interpn(X1,X2,V,Y1,Y2,'cubic');

결과를 플로팅합니다.

mesh(Y1,Y2,Vq);
title('Biased Grid');

griddedInterpolant 클래스를 사용한 보간

interpn 함수와 마찬가지로, griddedInterpolant 클래스는 n차원에서 그리드 기반 보간을 수행할 수 있는 단일 인터페이스를 제공합니다. griddedInterpolant는 다음과 같은 추가 이점도 제공합니다.

  • 보간 함수에 대한 반복된 쿼리로 성능을 크게 향상시킵니다.

  • 샘플 점을 간소 그리드로 저장하므로 성능을 추가적으로 향상시키고 메모리 사용량을 줄입니다.

griddedInterpolantndgrid 형식을 따르는 샘플 점을 인수로 받습니다. meshgrid 데이터로 griddedInterpolant를 만들려면 데이터를 ndgrid 형식으로 변환해야 합니다. 2차원과 3차원 meshgrids를 변환하는 방법에 대한 설명을 보려면 meshgrid 데이터를 ndgrid 형식으로 변환하기 항목을 참조하십시오.

griddedInterpolant 클래스는 interpn에서도 지원되는 보간 방법 nearest, linear, pchip, cubic, makima, spline을 지원합니다. 그러나 griddedInterpolant는 더 적은 오버헤드로 더 뛰어난 성능을 제공합니다.

보간 함수 생성하기

interpolant는 보간을 수행하는 함수입니다. griddedInterpolant 생성자를 호출하고 샘플 데이터, 즉 그리드와 이에 대응하는 샘플 값을 전달하여 보간 함수를 만듭니다. 사용자가 디폴트 "선형" 보간 방법을 재정의하고자 한다면 원하는 대로 지정할 수도 있습니다. 호출하는 구문의 형식은 다음과 같습니다.

  • 1차원 보간의 경우, 점 집합 x와 대응값을 포함하는, 동일한 길이의 벡터 v를 전달할 수 있습니다.

    F = griddedInterpolant(x,v)

  • 더 높은 차원의 경우 전체 그리드를 제공할 수 있습니다. X1,X2,...,Xn은 그리드를 n개의 n차원 배열로 된 세트로 지정합니다. 이러한 배열은 ndgrid 형식을 따르며 샘플 배열 V와 크기가 동일합니다.

     F = griddedInterpolant(X1,X2,...,Xn,V)

  • 인접한 샘플 점 간의 거리가 균일한 것이 확실한 경우 샘플 점 V만 전달하여 griddedInterpolant가 디폴트 그리드를 만들도록 할 수 있습니다.

     F = griddedInterpolant(V)

  • 샘플 데이터의 좌표를 간소 그리드로 지정할 수도 있습니다. 간소 그리드는 일련의 벡터로 표현됩니다. 그런 다음 이러한 벡터는 중괄호로 묶여 셀형 배열로 패키징됩니다(예: {x1g,x2g,...,xng}). 여기서 벡터 x1g,x2g,...,xng는 각 차원의 그리드 좌표를 정의합니다.

     F = griddedInterpolant({x1g,x2g,...,xng},V)

  • 위에 열거된 호출하는 구문에서는 보간 방법을 최종 입력 인수로 지정할 수도 있습니다. 다음 예제에서는 최근접이웃 보간을 지정합니다.

     F = griddedInterpolant({x1g,x2g,x3g},V,'nearest')

보간 함수 쿼리

griddedInterpolantF는 함수를 호출하는 것과 같은 방식으로 실행됩니다. 쿼리 점은 산점 데이터이거나 그리딩된 데이터일 수 있으며, 다음 방법 중 하나를 사용하여 이러한 데이터를 F에 전달할 수 있습니다.

  • n차원에 m개의 산점 데이터를 포함하는 mxn 행렬 Xq를 지정할 수 있습니다. 보간된 값 Vq는 mx1 벡터로 반환됩니다.

      Vq = F(Xq)

  • 쿼리 점을 길이가 m인 n개의 열 벡터 x1q,x2q,...,xnq로 지정할 수도 있습니다. 이러한 벡터는 n차원의 m개 점을 나타냅니다. 보간된 값 Vq는 mx1 벡터로 반환됩니다.

     Vq = F(x1q,x2q,...,xnq)

  • 쿼리 점을 전체 그리드를 나타내는 n개의 n차원 배열로 지정할 수 있습니다. 배열 X1q,X2q,...,Xnq는 모두 크기가 동일하며 ndgrid 형식을 따릅니다. 보간된 값 Vq도 크기가 동일합니다.

    Vq = F(X1q,X2q,...,Xnq)

  • 쿼리 점을 간소 그리드로 지정할 수도 있습니다. x1gq,x2gq,...,xngq는 각 차원의 그리드 점을 정의하는 벡터입니다.

    Vq = F({x1gq,x2gq,...,xngq})

    예를 들어, 2차원의 경우는 다음과 같습니다.

    Vq = F({(0:0.2:10),(-5:0.5:5)});

meshgrid 데이터를 ndgrid 형식으로 변환하기

griddedInterpolant 클래스는 ndgrid 형식의 샘플 데이터를 인수로 받습니다. meshgrid 데이터로 griddedInterpolant를 만들려면 먼저 데이터를 ndgrid 형식으로 변환해야 합니다.

다음 예제에서는 2차원 meshgrid 데이터를 ndgrid 형식으로 변환하기 위한 단계를 간략히 설명합니다. 먼저, 다음과 같이 meshgrid와 이에 대응하는 샘플 값을 만들어 보겠습니다.

[X,Y] = meshgrid(-2:.1:2,-1:.1:1);
V=0.75*Y.^3-3*Y-2*X.^2;

X, Y, Vndgrid 형식으로 변환하려면 다음 단계를 따르십시오.

  1. 그리드의 각 배열뿐 아니라 샘플 데이터를 전치합니다.

    X=X';
    Y=Y';
    V=V';
  2. 이제 보간 함수를 생성합니다.

    F = griddedInterpolant(X,Y,V);

3차원 meshgrid를 변환할 경우에는 permute 함수를 사용합니다. 다시, 다음과 같이 meshgrid와 이에 대응하는 샘플 값을 만들어 보겠습니다.

[X,Y,Z] = meshgrid(-5:5,-3:3,-10:10);
V = X.^3 + Y.^2 + Z;

X, Y, Z, Vndgrid 형식으로 변환하려면 다음 단계를 따르십시오.

  1. permute 함수를 사용하여 각 배열의 행과 열을 서로 바꿉니다. 그러면 결과적으로 모든 페이지가 전치됩니다.

    P = [2 1 3];
    X = permute(X,P);
    Y = permute(Y,P);
    Z = permute(Z,P);
    V = permute(V,P);

  2. 이제 보간 함수를 생성합니다.

    F = griddedInterpolant(X,Y,Z,V);

1차원에 griddedInterpolant 사용하기

이 예제에서는 griddedInterpolant를 3차 보간 방법과 함께 사용하여 1차원 보간 함수를 만들고 플로팅하는 방법을 보여줍니다.

성긴 그리드와 샘플 값을 만듭니다.

X = [1 2 3 4 5];
V = [12 6 15 9 6];

3차 보간 방법(Cubic)을 사용하여 griddedInterpolant를 생성합니다.

F = griddedInterpolant(X,V,'cubic')
F = 
  griddedInterpolant with properties:

            GridVectors: {[1 2 3 4 5]}
                 Values: [12 6 15 9 6]
                 Method: 'cubic'
    ExtrapolationMethod: 'cubic'

GridVectors 속성은 샘플 값 V의 좌표를 지정하는 간소 그리드를 포함합니다. Method 속성은 보간 방법을 지정합니다. 여기서는 F를 만들 때 'cubic'을 지정했습니다. 만약 Method 인수를 생략하면 디폴트 보간 방법 linearF에 할당됩니다.

struct의 필드에 액세스하는 것과 같은 방법으로 F의 속성에 액세스할 수 있습니다.

F.GridVectors;          % Displays the grid vectors as a cell array
F.Values;               % Displays the sample values
F.Method;               % Displays the interpolation method

0.1 간격을 사용하여 더 촘촘한 간격으로 보간합니다.

Xq = (1:0.1:5);
Vq = F(Xq);

결과를 플로팅합니다.

plot(X,V,'o');
hold on
plot(Xq,Vq,'-');
legend('samples','Cubic Interpolation');

2차원에 griddedInterpolant 사용하기

이 예제에서는 griddedInterpolant를 사용하여 2차원 보간 함수를 만들고 플로팅하는 방법을 보여줍니다.

2차원 이상에서는 샘플 좌표를 ndgrid, 간소 그리드, 디폴트 그리드 중 하나로 지정할 수 있습니다. 이 예제에서는 ndgrid를 제공할 것입니다.

성긴 그리드와 샘플 값을 만듭니다.

[X,Y] = ndgrid(-1:.3:1,-2:.3:2);
V = 0.75*Y.^3 - 3*Y - 2*X.^2;

griddedInterpolant를 생성합니다.

F = griddedInterpolant(X,Y,V,'spline');

0.1 간격을 사용하여 더 촘촘한 간격으로 보간합니다.

[Xq,Yq] = ndgrid(-1:.1:1,-2:.1:2);
Vq = F(Xq,Yq);

결과를 플로팅합니다.

figure()
surf(X,Y,V);
view(65,60)
title('Sample Data');

figure()
surf(Xq,Yq,Vq);
view(65,60)
title('Refined with Spline');

3차원에 griddedInterpolant 사용하기

이 예제에서는 3차원 보간 함수를 만들고, 슬라이스 평면에서 값을 구하여 이 평면에 값을 플로팅할 수 있는 방법을 보여줍니다.

전체 그리드와 샘플 값을 만듭니다.

[X,Y,Z] = ndgrid((-5:2:5));
V = X.^3 + Y.^2 + Z.^2;

griddedInterpolant를 생성합니다.

F = griddedInterpolant(X,Y,Z,V,'cubic');

이미 전체 그리드를 만들어 샘플 값을 생성했기 때문에 griddedInterpolant에 값을 전달할 때 어떠한 것도 손실되지 않았습니다. 그러나 실제로는 샘플 데이터를 디스크에서 MATLAB으로 불러오는 것이 일반적입니다. 이러한 경우 간소 그리드가 매우 유용할 수 있습니다. 메모리 측면에서 훨씬 더 경제적인 형식으로 전체 그리드를 지정할 수 있기 때문입니다. V를 전체 그리드에서 계산하는 대신 MATLAB으로 불러왔다면 작업 공간의 메모리를 절약하기 위해 간소 그리드를 만들었을 수 있습니다. 예를 들면 다음과 같습니다.

gv = {(-5:2:5),(-5:2:5),(-5:2:5)};
F = griddedInterpolant(gv,V,'cubic');

이제, 0.25 간격을 사용하여 Z = 2 평면 상에 보간해 보겠습니다.

[Xq,Yq,Zq] = ndgrid((-5:.25:5),(-5:.25:5),2:2);
Vq = F(Xq,Yq,Zq);

결과를 플로팅합니다.

surf(Xq,Yq,Vq);
title('Refined with Linear Interpolation');

4차원에 griddedInterpolant 사용하기

이 예제에서는 4차원 보간 함수를 만들고 단일 점에서의 보간 값을 구합니다.

  1. 성긴 그리드와 샘플 값을 만듭니다.

    [X1,X2,X3,X4] = ndgrid((-5:2:5));
    V = X1.^3 + X2.^2 + X3.^2 +X4;

  2. griddedInterpolant를 생성합니다.

    F = griddedInterpolant(X1,X2,X3,X4,V,'linear');

  3. 단일 점에서 griddedInterpolant를 쿼리합니다.

    Vq = F([-3.2 2.1 4.7 -1.3])

    MATLAB에서 다음이 출력됩니다.

    ans =
    
      -10.1000

.

griddedInterpolant를 사용할 수 있는 다른 방법

쿼리 점이 정렬된 방식에 따라 특정 실행 구문을 선호할 수 있습니다. 예를 들어, 다음과 같은 보간 함수를 만들어 보겠습니다.

[X,Y] = ndgrid(-1:.25:1,-2:.25:2);
V = 0.75*Y.^3-3*Y-2*X.^2;
F = griddedInterpolant(X,Y,V);

다음과 같이 전체 그리드를 사용하여 F를 쿼리하여 그리드 점의 값을 제공합니다.

[Xq,Yq] = ndgrid(-1:.1:0,-2:.1:0);
Vq = F(Xq,Yq);

간소 그리드 형식을 사용하여 동일한 그리드를 보간할 수도 있습니다.

gvq = {-1:.1:0,-2:.1:0};
Vq = F(gvq);

또는 단일 점을 쿼리할 수 있습니다.

Vq =  F(.315,.738)

이 경우 다음 값이 반환됩니다.

Vq =

   -2.1308

또는 다음과 같이 산점 데이터 세트를 쿼리할 수도 있습니다.

rng('default')
Vq = F(rand(3,2))

이 경우 다음 값이 반환됩니다.

Vq =

   -3.4919
   -3.3557
   -0.3515

또한 FValues를 검토할 수도 있습니다.

 F.Values(1,3)

이 경우 다음 값이 반환됩니다.

 ans =

   -0.0313

또는 다음과 같이 Values 배열을 바꿀 수 있습니다.

F.Values = 2*V;

실행 중에 F의 속성을 편집할 수 있습니다. 예를 들어, 다음과 같이 보간 방법을 바꿀 수 있습니다.

 F.Method = 'cubic';

FGridVectors를 바꿀 수도 있습니다. 먼저, 다음과 같이 GridVectors를 검토해 보겠습니다.

gv = F.GridVectors;
gv{1}
gv는 셀형 배열이며, gv{1}은 첫 번째 그리드 벡터를 표시합니다.
ans =

   -1.0000   -0.7500   -0.5000   -0.2500    0    0.2500    0.5000    0.7500    1.0000

이제, 새로운 셀형 배열 new_gv를 만들어 FGridVectors를 바꿉니다.

new_gv = {(0:0.3:1),(0:0.3:1)};
F.GridVectors = new_gv;