2次元座標でスプライ​ン補間した結果を3次​元座標で表現すること​は可能でしょうか?

24 visualizzazioni (ultimi 30 giorni)
克仁
克仁 il 7 Ott 2022
Commentato: Hernia Baby il 8 Nov 2022
二次元(xy座標)の離散データをsplineで補間した際
その結果を”Z=0の補完したデータ”として扱い、他のデータをZ=1の場合…、また他のデータをZ=2の場合…、といった風に複数の補間した曲線を三次元(xyz座標)で表現することは可能でしょうか?また、x軸方向からも行い(y軸を縦方向と考えた場合)、メッシュ状に表現することは可能でしょうか?
x = [-2 -1.5 -1 -0.5 0 0.5 1 1.5 2];
y = [1.83 10.5 36.7 77.8 100 77.8 36.7 10.5 1.83];
cs = spline(x,[0 y 0]);
xx = linspace(-2,2,101);
plot(x,y,'o',xx,ppval(cs,xx),'-');
これだと二次元で表示されるので、それをZ=0などの数値を与えて三次元的に表現できないでしょうか
教えていただけると幸いです。
  2 Commenti
Hernia Baby
Hernia Baby il 11 Ott 2022
> ”Z=0の補完したデータ”として扱い、他のデータをZ=1の場合…、また他のデータをZ=2の場合…、
ここの詳細教えてください。
x(:,ii) = [-2 -1.5 -1 -0.5 0 0.5 1 1.5 2]';
y(:,ii) = [1.83 10.5 36.7 77.8 100 77.8 36.7 10.5 1.83]';
cs = spline(x,[0 y 0]);
xx = linspace(-2,2,101);
z(:,ii) = ppval(cs,xx);
上記のながれで ii が @克仁さんのいう Z に対応してますか?
そうすると x と y は行列になりますが、これらはベクトルでしょうか?
克仁
克仁 il 17 Ott 2022
Modificato: 克仁 il 18 Ott 2022
表現が拙く申し訳ございません。
私がやりたいことといたしまして、平面から離散的にデータが取れる状態にあり(点データの位置、つまりxy座標とその場所のスカラー量、こいつをz成分としたい)、それらのデータをスプライン補間して3次元的に表現したいと考えています。例えば、y=0上にあるxとzのデータをスプライン補間、y=1、y=2…という風に行い、また今度はx方向を固定し同じことを行い、結果的にgriddataに出て来る例のように表示したいと考えています。
MATLABの例で上がっているものでgriddataが一番やりたい形なのですが、補間方法にスプライン補間がなく、また例として挙がっているものは点データがランダムであることからあまり参考にできずにいます。
plot3を使うのか、など考えましたが詰まっています。
MATLAB自体最近使い始めたので、行列とベクトルの違いに確信は持てませんが、たぶんベクトルだと思います。最初に書いたコードはsplineの例で出てきたコードのx、yの中をいじっただけです。xyの中身はそれぞれの値に対する座標として認識していました。
これで私のやりたいことが伝わっていると幸いです。返信遅れて申し訳ございません。

Accedi per commentare.

Risposta accettata

克仁
克仁 il 8 Nov 2022
Modificato: 克仁 il 8 Nov 2022
最低限やりたいことはできたのでコードの共有をします。スプライン補間を三次元的に表現したものとなります。
%z=-2でのデータ
x = [-2 -1 0 1 2];
y = [0.03 0.67 1.83 0.67 0.03];
xx = -2:.25:2;
yy = spline(x,y,xx);
x9= xx;
y9= -2*ones(1,17);
z9= yy;
plot3(x9,y9,z9,'-','Color','b','MarkerSize',10,...
'MarkerFaceColor','#D9FFFF')
hold on
%z=-1でのデータ
x = [-2 -1 0 1 2];
y = [0.67 13.53 36.78 13.53 0.67];
xx = -2:.25:2;
yy = spline(x,y,xx);
x8= xx;
y8= -1*ones(1,17);
z8= yy;
plot3(x8,y8,z8,'-','Color','b','MarkerSize',10,...
'MarkerFaceColor','#D9FFFF')
hold on
%z=0でのデー
x = [-2 -1 0 1 2];
y = [1.83 36.78 100 36.78 1.83];
xx = -2:.25:2;
yy = spline(x,y,xx);
x0=xx;
y0=zeros(1,size(xx,2));
z0=yy;
plot3(x0,y0,z0,'-','Color','b','MarkerSize',10,...
'MarkerFaceColor','#D9FFFF')
hold on
%z=1でのデータ
x = [-2 -1 0 1 2];
y = [0.67 13.53 36.78 13.53 0.67];
xx = -2:.25:2;
yy = spline(x,y,xx);
x1=xx;
y1=ones(1,17);
z1=yy;
plot3(x1,y1,z1,'-','Color','b','MarkerSize',10,...
'MarkerFaceColor','#D9FFFF')
hold on
%z=2でのデータ
x = [-2 -1 0 1 2];
y = [0.03 0.67 1.83 0.67 0.03];
xx = -2:.25:2;
yy = spline(x,y,xx);
x2=xx;
y2=2*ones(1,17);
z2=yy;
plot3(x2,y2,z2,'-','Color','b','MarkerSize',10,...
'MarkerFaceColor','#D9FFFF')
  2 Commenti
Hernia Baby
Hernia Baby il 8 Nov 2022
すみません、回答できてませんでしたね…
cell型を利用すればコンパクトに行えます
データを作成します
x = [-2 -1 0 1 2];
xx = -2:.25:2;
y{1} = [0.03 0.67 1.83 0.67 0.03];
y{2} = [0.67 13.53 36.78 13.53 0.67];
y{3} = [1.83 36.78 100 36.78 1.83];
y{4} = [0.67 13.53 36.78 13.53 0.67];
y{5} = [0.03 0.67 1.83 0.67 0.03];
yを補間します
yy = cellfun(@(Y) spline(x,Y,xx),y,'UniformOutput',false);
データをまとめます
x1 = xx;
y1 = num2cell((-2:2)'.*ones(1,17), 2);
z1 = yy';
図示します。
figure
hold on
cellfun(@(Y,Z) plot3(x1,Y,Z,'-',...
'Color','b','MarkerSize',10,...
'MarkerFaceColor','#D9FFFF'),y1,z1,'UniformOutput',false);
hold off
view(3)
Hernia Baby
Hernia Baby il 8 Nov 2022
もしくは interp2 を使ってもいいかもしれませんね
[X,Y] = meshgrid(-2:2);
Z = [0.03 0.67 1.83 0.67 0.03
0.67 13.53 36.78 13.53 0.67
1.83 36.78 100 36.78 1.83
0.67 13.53 36.78 13.53 0.67
0.03 0.67 1.83 0.67 0.03];
xだけ細かくします
[X1,Y1] = meshgrid(-2:.25:2,-2:2);
補間します
Z1 = interp2(X,Y,Z,X1,Y1,'spline');
図示します
figure
hold on
for ii = 1:height(X1)
plot3(X1(ii,:),Y1(ii,:),Z1(ii,:) ...
,'-','Color','b','MarkerSize',10 ...
,'MarkerFaceColor','#D9FFFF')
end
hold off
view(3)

Accedi per commentare.

Più risposte (0)

Categorie

Scopri di più su 内挿 in Help Center e File Exchange

Prodotti


Release

R2022b

Community Treasure Hunt

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

Start Hunting!