数値の補間方法について

ある行に数値が20点入ります。
しかし、未知数の箇所が20点内にところどころで9点あり、その未知数を求めたいのです。
直線補間とスプライン補間の両方を行いたいのですが、それぞれどのような構文を記載すればよいでしょうか?
直線補間は全体が直線上に数値が並ぶのではなく、既知と既知の間をそれぞれ線形補間を行いたいです。
スプライン補間については未知数を挟む既知だけでは計算ができないと思うので、ある程度周辺の値を利用して補間を行いたいです。
また、CSVファイル内の行の指定から教えていただけると幸いです。
同様に、列についても教えていただきたいです。
よろしくお願いいたします。

 Risposta accettata

Hernia Baby
Hernia Baby il 3 Set 2021

3 voti

まずは csvread で表を読み込みます
A = csvread('test.csv');
x = A(:,2);
y = A(:,3);
interp1 で 0 ~ 20まで 20点分の内挿を行います
y1が線形補間、y2がスプライン補間です
x1 = linspace(0,20,20)';
y1 = interp1(x, y, x1);
y2 = interp1(x, y, x1,'spline');
プロットします
figure
hold on
plot(x,y,'o')
plot(x1,y1,':.')
plot(x1,y2,'--')

5 Commenti

GeekField
GeekField il 4 Set 2021
丁寧に教えていただきありがとうございました。
思った通りの補間を行うことができました。
今回、列における補間をご教授いただきましたが、20*30の行列における補間方法がございましたら併せて教えていただけたら幸いです。
よろしくお願いいたします。
読み込みは同様の処理なので省略します
まずはデータ生成
t = 1:9;
Fs = 20;
f = 1:15;
for i = t
for j = f
A(i,j) = sin(2*pi/Fs.*i.*j);
end
end
ここで補間します
まずは縦方向に補間し、次に横方向へ補間します
横方向の補間は、転置して補間し転置することにしました
B = interp1(t,A,linspace(1,9,20),'spline');
B = interp1(f,B',linspace(1,15,30),'spline')';
図示します
figure
hold on
c = jet(30);
for i = 1:30
plot([1:20], B(:,i),':','Color',c(i,:));
end
2Dで一気にやりたいってときは
meshgridinterp2 を使ってみてください
t = 1:9;
Fs = 20;
f = 1:15;
for i = t
for j = f
A(i,j) = sin(2*pi/Fs.*i.*j);
end
end
ここで f, t をそれぞれグリッドにします
[F,T] = meshgrid(f,t);
surf(F,T,A,'EdgeColor',"interp");
view([0 90])
点数を増やし、グリッドにします
それを interp2 で補間します
t1 = linspace(1,9,20);
f1 = linspace(1,15,30);
[F1,T1] = meshgrid(f1,t1);
B = interp2(F,T,A,F1,T1,"spline");
surf(F1,T1,B,'EdgeColor',"interp");
view([0 90])
GeekField
GeekField il 9 Set 2021
ご丁寧に解説いただきありがとうございます。
当方プログラミングそのものが始めたばかりであり、
If  や For 構文も使い方は多少分かっているつもりではございますが、実際に活用するとなると『?』となってしまいます。
解説してくださった元のCSVファイルをお見せいただくことは可能でしょうか?
私のCSVと照らし併せながら活用させていただきたいと思います。
よろしくお願いいたします。
コメント遅れました。ごめんなさい。
このコメント内で使っているデータはcsvファイルを読み込んでいません。
以下の行で作っています。
これは i 番目の行に j = 1~15 番目の数字をA(i, j )に入れてます
そして j の処理が終わったら i + 1で同様の処理をさせてます
t = 1:9;
Fs = 20;
f = 1:15;
for i = t
for j = f
A(i,j) = sin(2*pi/Fs.*i.*j);
end
end
これはワークスペース内の変数をクリックすると構成を見ることができます
以下のように「;」つけずに変数を直打ちしても出るっちゃ出ますが、変数を見たほうが便利です
A
A = 9×15
0.3090 0.5878 0.8090 0.9511 1.0000 0.9511 0.8090 0.5878 0.3090 0.0000 -0.3090 -0.5878 -0.8090 -0.9511 -1.0000 0.5878 0.9511 0.9511 0.5878 0.0000 -0.5878 -0.9511 -0.9511 -0.5878 -0.0000 0.5878 0.9511 0.9511 0.5878 0.0000 0.8090 0.9511 0.3090 -0.5878 -1.0000 -0.5878 0.3090 0.9511 0.8090 0.0000 -0.8090 -0.9511 -0.3090 0.5878 1.0000 0.9511 0.5878 -0.5878 -0.9511 -0.0000 0.9511 0.5878 -0.5878 -0.9511 -0.0000 0.9511 0.5878 -0.5878 -0.9511 -0.0000 1.0000 0.0000 -1.0000 -0.0000 1.0000 0.0000 -1.0000 -0.0000 1.0000 0.0000 -1.0000 -0.0000 1.0000 0.0000 -1.0000 0.9511 -0.5878 -0.5878 0.9511 0.0000 -0.9511 0.5878 0.5878 -0.9511 -0.0000 0.9511 -0.5878 -0.5878 0.9511 0.0000 0.8090 -0.9511 0.3090 0.5878 -1.0000 0.5878 0.3090 -0.9511 0.8090 0.0000 -0.8090 0.9511 -0.3090 -0.5878 1.0000 0.5878 -0.9511 0.9511 -0.5878 -0.0000 0.5878 -0.9511 0.9511 -0.5878 -0.0000 0.5878 -0.9511 0.9511 -0.5878 -0.0000 0.3090 -0.5878 0.8090 -0.9511 1.0000 -0.9511 0.8090 -0.5878 0.3090 0.0000 -0.3090 0.5878 -0.8090 0.9511 -1.0000
csv形式でほしい場合は別途考えますのでコメントお願いします

Accedi per commentare.

Più risposte (0)

Categorie

Scopri di più su 内挿 in Centro assistenza e File Exchange

Prodotti

Release

R2021a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!