Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

scatteredInterpolant

2 次元または 3 次元の散布データの内挿

説明

scatteredInterpolant を使用して、散布データの 2 次元または 3 次元データ セットの内挿を実行します。scatteredInterpolant は指定したデータ セットの内挿 F を返します。F をクエリ点の集合 (2 次元の (xq,yq) など) で評価して、内挿値 vq = F(xq,yq) を生成できます。

griddedInterpolant を使用して、グリッド データによる内挿を実行します。

作成

説明

F = scatteredInterpolant は、空の散布データの内挿オブジェクトを作成します。

F = scatteredInterpolant(x,y,v) は、v = F(x,y) 形式の表面を近似する内挿を作成します。x ベクトルと y ベクトルは、サンプル点の (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 を最後の 2 つの入力引数として一緒に渡してください。

  • Method は、'nearest''linear''natural' のいずれかです。

  • ExtrapolationMethod は、'nearest''linear''none' のいずれかです。

入力引数

すべて展開する

サンプル点。v と同じ行数をもつ列ベクトルとして指定します。サンプル点は一意である必要があります。ただし、サンプル点に重複がある場合、scatteredInterpolant は警告を表示し、重複する点を 1 つに統合します。

データ型: double

サンプル点の配列。nm 列の行列として指定します。ここで、m は点数で、n は点が存在する空間の次元です。P の各行には、サンプル点の座標 (x, y) または (x, y, z) が含まれています。サンプル点は一意である必要があります。ただし、サンプル点に重複がある場合、scatteredInterpolant は警告を表示し、重複する点を 1 つに統合します。

データ型: double

サンプル点での関数値。ベクトルまたは行列として指定します。2 次元データの場合は、v = F(x,y) です。3 次元データの場合は、v = F(x,y,z) です。

  • 単一の値セットを使用して内挿するには、行数がサンプル点の数と同じであるベクトルとして v を指定します。

  • 複数の値セットを使用して内挿するには、行数がサンプル点の数と同じである行列として v を指定します。v の各列は、サンプル点における異なる関数の値を表します。たとえば、x および y が 10 個の要素をもつ列ベクトルである場合は、v を 10 行 4 列の行列として指定し、4 つの異なる値セットを使用して内挿できます。

scatteredInterpolantvNaN 値を無視しないため、それらのサンプル点近傍の内挿結果も NaN になります。

この引数は scatteredInterpolant オブジェクトの Values プロパティを設定します。

データ型: double

内挿法。次のいずれかのオプションとして指定します。

メソッド説明連続性
'linear' (既定)

線形内挿

C0
'nearest'

最近傍点による内挿

不連続
'natural'

自然な近傍内挿

C1 (サンプル点を除く)

外挿法。次のオプションのいずれかとして指定します。

外挿法説明
'linear'

境界勾配に基づく線形外挿。Method'linear' または 'natural' の場合は既定です。

'nearest'

最近傍による外挿。この方法では、最近傍の値を評価します。Method'nearest' の場合の既定です。

'none'

外挿なし。Points の凸包外側のクエリは NaN を返します。

プロパティ

すべて展開する

サンプル点。行列として指定します。行列のサイズは m2 列または m3 列で、m 個の点を 2 次元または 3 次元空間で表します。Points の各行には、一意のサンプル点の座標 (x, y) または (x, y, z) が含まれています。Points の行は、Values の関数値に対応します。

データ型: double

サンプル点での関数値。ベクトルまたは行列として指定します。このプロパティは入力引数vによって設定されます。

データ型: double

内挿法。'linear''nearest' または 'natural' として指定します。これらのメソッドの説明については、Method を参照してください。

外挿法。'nearest''linear' または 'none' として指定します。これらのメソッドの説明については、ExtrapolationMethod を参照してください。

データ型: double

使用法

説明

scatteredInterpolant を使用して、内挿 F を作成します。その後、次の構文のいずれかを使用して、特定の点で F を評価できます。

Vq = F(Pq) は行列 Pq のクエリ点で F を評価します。Pq の各行は、クエリ点の座標を含んでいます。

Vq = F(Xq,Yq)Vq = F(Xq,Yq,Zq) は、等しいサイズの 2 つまたは 3 つの配列としてクエリ点を指定します。F はクエリ点を列ベクトルとして扱います (たとえば、Xq(:))。

  • FValues プロパティがサンプル点における 1 つの値セットを表す列ベクトルである場合、Vq はクエリ点と同じサイズです。

  • FValues プロパティがサンプル点における複数の値セットを表す行列である場合、Vq は行列であり、各列はクエリ点における異なる値セットを表します。

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 object. The axes object with title Linear Interpolation, xlabel x, ylabel y contains 2 objects of type line. One or more of the lines displays its values using only markers 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 object. The axes object 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 を使用しようとすると、警告がスローされ、V の対応する値が平均化されて単一の一意の点が生成されます。ただし、groupsummary を使用すると、内挿を作成する前に重複する点を削除できます。これは、平均化以外の方法を使用して重複する点を結合する場合に特に便利です。

groupsummary を使用して、重複するサンプル点を削除し、重複するサンプル点の位置における V の最大値を保持します。サンプル点の行列をグループ化変数として指定し、対応する値をデータとして指定します。

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

グループ化変数には列が 3 つあるため、groupsummary は一意のグループ P_unique を cell 配列として返します。cell 配列を変換して行列に戻します。

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 object. The axes object with title Nearest Neighbor contains 2 objects of type line, surface. One or more of the lines displays its values using only markers 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 object. The axes object with title Linear contains 2 objects of type line, surface. One or more of the lines displays its values using only markers 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 object. The axes object with title Natural Neighbor contains 2 objects of type line, surface. One or more of the lines displays its values using only markers These objects represent Sample Points, Interpolated Surface.

厳密解をプロットします。

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 object. The axes object with title Exact Solution contains 2 objects of type line, surface. One or more of the lines displays its values using only markers 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

同じクエリ点で複数のデータ セットを内挿します。

サンプル点ベクトル x および y で表された 50 個の散布点をもつサンプル データ セットを作成します。

rng("default")
x = -3 + 6*rand(50,1);
y = -3 + 6*rand(50,1);

複数のデータ セットを内挿するには、各列がサンプル点における異なる関数の値を表す行列を作成します。

s1 = sin(x).^4 .* cos(y);
s2 = sin(x) + cos(y);
s3 = x + y;
s4 = x.^2 + y;
v = [s1 s2 s3 s4];

v の各値セットに対して内挿を実行する位置を示すクエリ点ベクトルを作成します。

xq = -3:0.1:3;
yq = -3:0.1:3;

内挿 F を作成します。

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

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

クエリ位置で内挿を評価します。Vq の各ページには、v の対応するデータ セットに対して内挿された値が含まれます。

Vq = F({xq,yq});
size(Vq)
ans = 1×3

    61    61     4

各データ セットの内挿された値をプロットします。

tiledlayout(2,2)
nexttile
plot3(x,y,v(:,1),'mo')
hold on
mesh(xq,yq,Vq(:,:,1)')
title("sin(x).^4 .* cos(y)")

nexttile
plot3(x,y,v(:,2),'mo')
hold on
mesh(xq,yq,Vq(:,:,2)')
title("sin(x) + cos(y)")

nexttile
plot3(x,y,v(:,3),'mo')
hold on
mesh(xq,yq,Vq(:,:,3)')
title("x + y")

nexttile
plot3(x,y,v(:,4),'mo')
hold on
mesh(xq,yq,Vq(:,:,4)')
title("x.^2 + y")

lg = legend("Sample Points","Interpolated Surface");
lg.Layout.Tile = "north";

Figure contains 4 axes objects. Axes object 1 with title sin(x). toThePowerOf 4 baseline blank .* blank cos(y) contains 2 objects of type line, surface. One or more of the lines displays its values using only markers Axes object 2 with title sin(x) + cos(y) contains 2 objects of type line, surface. One or more of the lines displays its values using only markers Axes object 3 with title x + y contains 2 objects of type line, surface. One or more of the lines displays its values using only markers Axes object 4 with title x. Squared baseline blank + blank y contains 2 objects of type line, surface. One or more of the lines displays its values using only markers These objects represent Sample Points, Interpolated Surface.

詳細

すべて展開する

ヒント

  • scatteredInterpolant オブジェクト F を多数のクエリ点の組で評価する方が、関数 griddata または griddatan を使用して内挿を個別に計算するより速く処理できます。以下に例を示します。

    % 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)
    
  • 内挿のサンプル値または内挿法を変更する場合、内挿オブジェクト F のプロパティを更新する方が、新しい scatteredInterpolant オブジェクトを作成するよりも効率的です。Values または Method を更新する場合、基になる入力データの Delaunay 三角形分割は変更されないため、新しい結果を迅速に計算できます。

  • scatteredInterpolant による散布データの内挿ではデータの Delaunay 三角形分割を使用するため、内挿はサンプル点 xyz または P のスケーリング問題の影響を受けやすいことがあります。スケーリング問題が起きた場合は、normalize を使用してデータを再スケーリングし、結果を改善することができます。詳細については、大きさが異なるデータの正規化を参照してください。

アルゴリズム

scatteredInterpolant は散布サンプル点の Delaunay 三角形分割を使用して内挿を実行します[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 で導入

すべて展開する