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

 채택된 답변

Hernia Baby
Hernia Baby 2021년 9월 3일

3 개 추천

まずは 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

GeekField
GeekField 2021년 9월 4일
丁寧に教えていただきありがとうございました。
思った通りの補間を行うことができました。
今回、列における補間をご教授いただきましたが、20*30の行列における補間方法がございましたら併せて教えていただけたら幸いです。
よろしくお願いいたします。
Hernia Baby
Hernia Baby 2021년 9월 6일
読み込みは同様の処理なので省略します
まずはデータ生成
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
Hernia Baby
Hernia Baby 2021년 9월 7일
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 2021년 9월 9일
ご丁寧に解説いただきありがとうございます。
当方プログラミングそのものが始めたばかりであり、
If  や For 構文も使い方は多少分かっているつもりではございますが、実際に活用するとなると『?』となってしまいます。
解説してくださった元のCSVファイルをお見せいただくことは可能でしょうか?
私のCSVと照らし併せながら活用させていただきたいと思います。
よろしくお願いいたします。
Hernia Baby
Hernia Baby 2021년 9월 11일
コメント遅れました。ごめんなさい。
このコメント内で使っているデータは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形式でほしい場合は別途考えますのでコメントお願いします

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

도움말 센터File Exchange에서 内挿에 대해 자세히 알아보기

제품

릴리스

R2021a

질문:

2021년 9월 3일

댓글:

2021년 9월 11일

Community Treasure Hunt

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

Start Hunting!