Main Content

이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

scatteredInterpolant

2차원 또는 3차원 산점 데이터 보간하기

설명

scatteredInterpolant를 사용하여 2차원 또는 3차원 산점 데이터의 데이터 세트에 보간을 수행합니다. scatteredInterpolant는 지정된 데이터 세트에 대해 보간 함수 F를 반환합니다. 2차원에서는 (xq,yq)와 같은 일련의 쿼리 점에서 F를 실행하여 보간된 값 vq = F(xq,yq)를 생성할 수 있습니다.

griddedInterpolant를 사용하여, 그리딩된 데이터에 대해 보간을 수행합니다.

생성

설명

F = scatteredInterpolant는 빈 산점 데이터 보간 객체를 만듭니다.

예제

F = scatteredInterpolant(x,y,v)v = F(x,y) 형식의 곡면에 맞는 보간 함수를 만듭니다. 벡터 xy는 샘플 점의 (x,y) 좌표를 지정합니다. v는 점 (x,y)에 연결된 샘플 값을 포함하는 벡터입니다.

예제

F = scatteredInterpolant(x,y,z,v)는 v = F(x,y,z) 형식의 3차원 보간 함수를 만듭니다.

예제

F = scatteredInterpolant(P,v)는 샘플 점의 좌표를 배열로 지정합니다. P의 행에는 v에 있는 값에 대한 (x, y) 좌표 또는 (x, y, z) 좌표가 포함되어 있습니다.

예제

F = scatteredInterpolant(___,Method)는 보간 방법을 'nearest', 'linear' 또는 'natural'로 지정합니다. 처음 3개 구문 중 하나에 마지막 입력 인수로 Method를 지정하십시오.

예제

F = scatteredInterpolant(___,Method,ExtrapolationMethod)는 보간 방법과 외삽 방법을 모두 지정합니다. 처음 3개 구문 중 하나에 마지막 두 입력 인수로 MethodExtrapolationMethod를 전달합니다.

  • Method'nearest', 'linear' 또는 'natural'일 수 있습니다.

  • ExtrapolationMethod'nearest', 'linear' 또는 'none'일 수 있습니다.

입력 인수

모두 확장

샘플 점으로, v와 같은 크기의 벡터로 지정됩니다. 샘플 점은 고유해야 합니다. 그러나 샘플 점에 중복된 점이 있으면 scatteredInterpolant는 경고를 표시하고 중복된 점을 단일 점으로 병합합니다.

데이터형: double

샘플 점 배열로, m×n 행렬로 지정됩니다. 여기서 m은 점의 개수이고 n은 점이 있는 공간의 차원입니다. P의 각 행에는 샘플 점의 (x, y) 좌표 또는 (x, y, z) 좌표가 포함되어 있습니다. 샘플 점은 고유해야 합니다. 그러나 샘플 점에 중복된 점이 있으면 scatteredInterpolant는 경고를 표시하고 중복된 점을 단일 점으로 병합합니다.

데이터형: double

샘플 값으로, 샘플 점에서의 함수 값 v = F(x,y,z)를 정의하는 벡터로 지정됩니다.

데이터형: double

보간 방법으로, 다음과 같은 옵션 중 하나로 지정됩니다.

Method설명연속성
'linear'(디폴트 값)

선형 보간

C0
'nearest'

최근접이웃 보간

불연속
'natural'

자연 이웃 보간

샘플 점을 제외한 곳에서 C1

외삽 방법으로, 다음과 같은 옵션 중 하나로 지정됩니다.

ExtrapolationMethod설명
'linear'

경계 기울기를 기반으로 한 선형 외삽. Method'linear' 또는 'natural'인 경우 디폴트 값입니다.

'nearest'

최근접이웃 외삽. 이 방법의 실행 결과는 경계에 있는 최근접이웃의 값입니다. Method'nearest'인 경우 디폴트 값입니다.

'none'

외삽이 없음. Points의 볼록 껍질 외부에서 쿼리를 하면 NaN이 반환됩니다.

속성

모두 확장

샘플 점으로, 행렬로 지정됩니다. 행렬의 크기는 2차원 또는 3차원 공간의 m개 점을 나타내는 m×2 또는 m×3입니다. Points의 각 행에는 고유한 샘플 점의 (x, y) 좌표 또는 (x, y, z) 좌표가 포함되어 있습니다. Points의 행은 Values에 있는 함수 값에 대응합니다.

데이터형: double

샘플 점에서의 함수 값으로, Points에서의 각 점에 대한 값으로 구성된 벡터로 지정됩니다.

데이터형: double

보간 방법으로, 'linear','nearest' 또는 'natural'로 지정됩니다. 이러한 방법에 대한 설명은 Method를 참조하십시오.

외삽 방법으로, 'nearest', 'linear' 또는 'none'으로 지정됩니다. 이러한 방법에 대한 설명은 ExtrapolationMethod를 참조하십시오.

데이터형: double

사용

scatteredInterpolant를 사용하여 보간 함수 F를 생성합니다. 그런 다음, 다음 구문 중 하나를 사용하여 특정 지점에서 F를 계산할 수 있습니다.

Vq = F(Pq)
Vq = F(Xq,Yq)
Vq = F(Xq,Yq,Zq)
Vq = F({xq,yq})
Vq = F({xq,yq,zq})

  • Vq = F(Pq)는 행렬 Pq의 쿼리 점을 지정합니다. Pq의 각 행은 쿼리 점의 좌표를 포함합니다.

  • Vq = F(Xq,Yq)Vq = F(Xq,Yq,Zq)는 쿼리 점을 크기가 동일한 두 개 또는 세 개의 행렬로 지정합니다.

  • Vq = F({xq,yq})Vq = F({xq,yq,zq})는 쿼리 점을 그리드 벡터로 지정합니다. 대량의 점에 대한 그리드를 쿼리하는 경우에는 이 구문을 사용하여 메모리를 절약할 수 있습니다.

예제

모두 축소

일부 샘플 점을 정의하고 샘플 점이 있는 위치에서 삼각 함수 값을 계산합니다. 이러한 샘플 점은 보간 함수에 대한 샘플 값이 됩니다.

t = linspace(3/4*pi,2*pi,50)';
x = [3*cos(t); 2*cos(t); 0.7*cos(t)];
y = [3*sin(t); 2*sin(t); 0.7*sin(t)];
v = repelem([-0.5; 1.5; 2],length(t));

보간 함수를 만듭니다.

F = scatteredInterpolant(x,y,v);

쿼리 위치 (xq,yq)에서 보간 함수를 실행합니다.

tq = linspace(3/4*pi+0.2,2*pi-0.2,40)';
xq = [2.8*cos(tq); 1.7*cos(tq); cos(tq)];
yq = [2.8*sin(tq); 1.7*sin(tq); sin(tq)];
vq = F(xq,yq);

결과를 플로팅합니다.

plot3(x,y,v,'.',xq,yq,vq,'.'), grid on
title('Linear Interpolation')
xlabel('x'), ylabel('y'), zlabel('Values')
legend('Sample data','Interpolated query data','Location','Best')

Figure contains an axes. The axes with title Linear Interpolation contains 2 objects of type line. These objects represent Sample data, Interpolated query data.

샘플 산점 세트의 보간 함수를 만든 다음, 3차원 쿼리 점 세트에서 실행합니다.

임의의 점 200개를 정의하고 삼각 함수를 샘플링합니다. 이러한 샘플 점은 보간 함수에 대한 샘플 값이 됩니다.

rng default;
P = -2.5 + 5*rand([200 3]);
v = sin(P(:,1).^2 + P(:,2).^2 + P(:,3).^2)./(P(:,1).^2+P(:,2).^2+P(:,3).^2);

보간 함수를 만듭니다.

F = scatteredInterpolant(P,v);

쿼리 위치 (xq,yq,zq)에서 보간 함수를 실행합니다.

[xq,yq,zq] = meshgrid(-2:0.25:2);
vq = F(xq,yq,zq);

결과를 슬라이스로 플로팅합니다.

xslice = [-.5,1,2]; 
yslice = [0,2]; 
zslice = [-2,0];
slice(xq,yq,zq,vq,xslice,yslice,zslice)

Figure contains an axes. The axes contains 7 objects of type surface.

샘플 점의 값을 변경하려면 Values 속성의 요소를 바꾸십시오. 원래 삼각분할은 변경되지 않기 때문에 새 보간 함수를 실행할 때 결과를 즉시 얻을 수 있습니다.

임의의 점 50개를 만들고 지수 함수를 샘플링합니다. 이러한 샘플 점은 보간 함수에 대한 샘플 값이 됩니다.

rng('default')
x = -2.5 + 5*rand([50 1]);
y = -2.5 + 5*rand([50 1]);
v = x.*exp(-x.^2-y.^2);

보간 함수를 만듭니다.

F = scatteredInterpolant(x,y,v)
F = 
  scatteredInterpolant with properties:

                 Points: [50x2 double]
                 Values: [50x1 double]
                 Method: 'linear'
    ExtrapolationMethod: 'linear'

(1.40,1.90)에서 보간 함수를 실행합니다.

F(1.40,1.90)
ans = 0.0069

보간 함수 샘플 값을 변경하고 같은 점에서 보간 함수를 다시 실행합니다.

vnew = x.^2 + y.^2;
F.Values = vnew;
F(1.40,1.90)
ans = 5.6491

scatteredInterpolant를 호출하기 전에 groupsummary를 사용하여 중복된 샘플 점을 제거하고 샘플 점이 결합되는 방식을 제어합니다.

샘플 점 위치로 구성된 200×3 행렬을 만듭니다. 마지막 5개 행에 중복된 점을 추가합니다.

P = -2.5 + 5*rand(200,3);
P(197:200,:) = repmat(P(196,:),4,1);

샘플 점에서 난수 값으로 구성된 벡터를 만듭니다.

V = rand(size(P,1),1);

중복된 샘플 점으로 scatteredInterpolant를 사용하려고 시도하면 scatteredInterpolant는 경고를 발생시키고 V의 대응하는 값들의 평균을 구하여 하나의 고유 점을 생성합니다. 하지만, 보간 함수를 만들기 전에 groupsummary를 사용하여 중복된 점을 제거할 수 있습니다. 이는 평균이 아닌 다른 방법으로 중복 점을 결합하려는 경우에 특히 유용합니다.

groupsummary를 사용하여 중복된 샘플 점을 제거하고, 중복된 샘플 점 위치에서 V의 최댓값을 유지합니다. 샘플 점 행렬을 그룹화 변수로 지정하고 대응되는 값들을 데이터로 지정합니다.

[V_unique,P_unique] = groupsummary(V,P,@max);

그룹화 변수에는 3개의 열이 있으므로 groupsummary는 고유 그룹 P_unique를 셀형 배열로 반환합니다. 셀형 배열을 다시 행렬로 변환합니다.

P_unique = [P_unique{:}];

보간 함수를 만듭니다. 이제 샘플 점들이 고유하므로 scatteredInterpolant는 경고를 발생시키지 않습니다.

I = scatteredInterpolant(P_unique,V_unique);

scatteredInterpolant가 제공하는 여러 보간 알고리즘의 결과를 비교합니다.

산점 50개로 이루어진 샘플 데이터 세트를 만듭니다. 보간 방법 간의 차이점이 명확하게 드러나도록 점 개수를 인위적으로 적게 했습니다.

x = -3 + 6*rand(50,1);
y = -3 + 6*rand(50,1);
v = sin(x).^4 .* cos(y);

보간 함수와 쿼리 점 그리드를 만듭니다.

F = scatteredInterpolant(x,y,v);
[xq,yq] = meshgrid(-3:0.1:3);

'nearest', 'linear', 'natural' 방법을 사용하여 결과를 플로팅합니다. 보간 방법이 변경될 때마다 보간 함수를 다시 쿼리해야 업데이트된 결과를 얻을 수 있습니다.

F.Method = 'nearest';
vq1 = F(xq,yq);
plot3(x,y,v,'mo')
hold on
mesh(xq,yq,vq1)
title('Nearest Neighbor')
legend('Sample Points','Interpolated Surface','Location','NorthWest')

Figure contains an axes. The axes with title Nearest Neighbor contains 2 objects of type line, surface. These objects represent Sample Points, Interpolated Surface.

F.Method = 'linear';
vq2 = F(xq,yq);
figure
plot3(x,y,v,'mo')
hold on
mesh(xq,yq,vq2)
title('Linear')
legend('Sample Points','Interpolated Surface','Location','NorthWest')

Figure contains an axes. The axes with title Linear contains 2 objects of type line, surface. These objects represent Sample Points, Interpolated Surface.

F.Method = 'natural';
vq3 = F(xq,yq);
figure
plot3(x,y,v,'mo')
hold on
mesh(xq,yq,vq3)
title('Natural Neighbor')
legend('Sample Points','Interpolated Surface','Location','NorthWest')

Figure contains an axes. The axes with title Natural Neighbor contains 2 objects of type line, surface. These objects represent Sample Points, Interpolated Surface.

엄밀해(Exact Solution)를 플로팅합니다.

figure
plot3(x,y,v,'mo')
hold on
mesh(xq,yq,sin(xq).^4 .* cos(yq))
title('Exact Solution')
legend('Sample Points','Exact Surface','Location','NorthWest')

Figure contains an axes. The axes with title Exact Solution contains 2 objects of type line, surface. These objects represent Sample Points, Exact Surface.

최근접이웃 외삽을 사용하여 볼록 껍질 외부에 있는 단일 점에서 보간 함수를 쿼리합니다.

임의의 점 200개로 구성된 행렬을 정의하고 지수 함수를 샘플링합니다. 이러한 샘플 점은 보간 함수에 대한 샘플 값이 됩니다.

rng('default')
P = -2.5 + 5*rand([200 2]);
x = P(:,1);
y = P(:,2);
v = x.*exp(-x.^2-y.^2);

보간 함수를 만들고 선형 보간과 최근접이웃 외삽을 지정합니다.

F = scatteredInterpolant(P,v,'linear','nearest')
F = 
  scatteredInterpolant with properties:

                 Points: [200x2 double]
                 Values: [200x1 double]
                 Method: 'linear'
    ExtrapolationMethod: 'nearest'

볼록 껍질 외부에서 보간 함수를 실행합니다.

vq = F(3.0,-1.5)
vq = 0.0029

외삽을 비활성화하고 동일한 점에서 F를 계산합니다.

F.ExtrapolationMethod = 'none';
vq = F(3.0,-1.5)
vq = NaN

세부 정보

모두 확장

  • 함수 griddata 또는 griddatan을 사용하여 보간을 따로따로 계산하는 것보다 여러 쿼리 점에서 scatteredInterpolant 객체 F를 실행하는 편이 더 빠릅니다. 예를 들면 다음과 같습니다.

    % Fast to create interpolant F and evaluate multiple times
    F = scatteredInterpolant(X,Y,V)
    v1 = F(Xq1,Yq1)
    v2 = F(Xq2,Yq2)
    
    % Slower to compute interpolations separately using griddata
    v1 = griddata(X,Y,V,Xq1,Yq1)
    v2 = griddata(X,Y,V,Xq2,Yq2)
    
  • 보간 샘플 값 또는 보간 방법을 변경하려면 새로운 scatteredInterpolant 객체를 만드는 것보다 보간 객체 F의 속성을 업데이트하는 편이 더 효율적입니다. Values 또는 Method를 업데이트할 경우 입력 데이터의 기본 들로네 삼각분할은 변경되지 않으므로 새 결과를 신속히 계산할 수 있습니다.

  • scatteredInterpolant를 통한 산점 데이터 보간은 데이터의 들로네 삼각분할을 사용하기 때문에, 샘플 점 x, y, z 또는 P의 스케일링 문제에 민감할 수 있습니다. 이 경우 normalize를 사용하여 데이터를 다시 스케일링하고 결과를 개선할 수 있습니다. 자세한 내용은 크기가 서로 다른 데이터를 정규화하기 항목을 참조하십시오.

알고리즘

scatteredInterpolant는 샘플 산점의 들로네 삼각분할을 사용하여 보간을 수행합니다 [1].

참고 문헌

[1] Amidror, Isaac. “Scattered data interpolation methods for electronic imaging systems: a survey.” Journal of Electronic Imaging. Vol. 11, No. 2, April 2002, pp. 157–176.

R2013a에 개발됨