データが正方行列では​ない場合の3Dグラフ​の作成について

卒業研究で急遽matlabを使用することとなったため、matlabの知識に関してとても疎いです。
76×3行列の3Dグラフ(surfなど)の作成方法について教えていただきたいです。
1列ずつ3つのデータに分けて、それをそれぞれ正方行列に変換してからsurf関数を使うのかと考えているのですがどうも上手くいきません。

4 commentaires

michio
michio le 29 Oct 2019
方向性は良い気がしますが、データやコードがないとコメントは難しいです。できれば、
  • これが試したコードです
  • ここでこんなエラーがでます
  • 実行はできるがこの表示が意図と違う
などの追加情報を纏めてくれると助かります。偽データでもよいので、データまでつけてすぐに作業できると特に嬉しいです。。
rei shimizu
rei shimizu le 29 Oct 2019
お返事ありがとうございます。
1枚目が元データで、コード上はAという名前にしてdouble型でインポートしました。
2枚目はネットの情報をほぼそのままコピペしたコードなため、このコードで自分が望む結果になるのかも想像できていません。
ほかに足りない情報などありましたら教えていただけると助かります。
Kazuya
Kazuya le 29 Oct 2019
できればデータはファイル(csv, Excel, mat など) の添付で、コードとエラーメッセージはコメント蘭にコピペで投稿頂けると助かります。
実際にMATLABで試してみた方が速いのですが、画像から情報を吸い出すのは多少手間でして。
rei shimizu
rei shimizu le 30 Oct 2019
kazuyaさんお返事ありがとうございます。
元データはこちらになります。
コードとエラーメッセージについては、大学のパソコンでmatlabを使用しているためすぐに投稿できないかもしれないです。
協力していただいてるのに申し訳ございません。

Connectez-vous pour commenter.

 Réponse acceptée

michio
michio le 29 Oct 2019

1 vote

matlab質問2.PNG のコードの中で、
x = A(:,1);
y = A(:,1);
z = A(:,1);
となっているところ、
x = A(:,1);
y = A(:,2);
z = A(:,3);
に変えるとよいように思います。
適当なダミーデータで実行してみると、
x = rand(100,1);
y = rand(100,1);
z = sin(2*pi*x)+cos(2*pi*y);
xlin = linspace(min(x),max(x),76);
ylin = linspace(min(y),max(y),76);
[X,Y] = meshgrid(xlin,ylin);
Z = griddata(x,y,z,X,Y,'cubic');
surf(X,Y,Z)
untitled.png
こんな感じです。griddata に 'cubic' と入れているのは、データの補間方法を指定しています。何も指定しなければ 'linear' ということで、線形補間を行います。

7 commentaires

rei shimizu
rei shimizu le 30 Oct 2019
michioさんお返事ありがとうございます。
早速大学に行って試したいと思います。
図々しいお願いですが、また不明な点があったら質問させていただいてもよろしいでしょうか?
michio
michio le 30 Oct 2019
その為の MATLAB Answers ですので、もちろんです。もし周りもに困っている人がいたら利用されるように勧めてくださいね。質問される際にはこちらも参考にして頂けると幸いです。
rei shimizu
rei shimizu le 30 Oct 2019
ありがとうございます。
試しにやってみたところ3Dグラフの作成に成功しました。
x6 = A6(:,1);
y6 = A6(:,2);
z6 = A6(:,3);
xlin6 = linspace(min(x6),max(x6),76);
ylin6 = linspace(min(y6),max(y6),76);
[X6,Y6] = meshgrid(xlin6,ylin6);
Z6 = griddata(x6,y6,z6,X6,Y6,'cubic');
surf(X6,Y6,Z6)
自動車6.PNG
しかし、griddataについてMathWorksさんのドキュメンテーションを読みましたが、理解が足りなかったためわからない点が1つできました。
以下の画像のようにZ6の中身にNaNの文字がいくつか出てしまうのですがこれは正常なのでしょうか?
matlab質問3.PNG
michio
michio le 30 Oct 2019
もともとデータ点が存在しない範囲(=外挿部分)は NaN を返す仕様になっています。
x6 = A6(:,1);
y6 = A6(:,2);
z6 = A6(:,3);
xlin6 = linspace(min(x6),max(x6),76);
ylin6 = linspace(min(y6),max(y6),76);
[X6,Y6] = meshgrid(xlin6,ylin6);
Z6 = griddata(x6,y6,z6,X6,Y6,'v4');
surf(X6,Y6,Z6)
と 'v4' を使うと外挿部分もデータを返すので、こちらを使っても良いかもしれません。
rei shimizu
rei shimizu le 30 Oct 2019
v4を使って進めていきたいと思います。
michioさん、どの質問にも丁寧に答えていただきありがとうございました!
本当に助かりました!
rei shimizu
rei shimizu le 30 Oct 2019
度々申し訳ございません。
以下の図のように、座標のデータを表示させてみると、元データには存在しないx座標、y座標、z座標の数値の組み合わせが表示されました。
これはもともとこのような仕様なのでしょうか?
念のため元データも添付しておきます。
matlab質問4.png
michio
michio le 31 Oct 2019
そうですね。。
xlin6 = linspace(min(x6),max(x6),76);
ylin6 = linspace(min(y6),max(y6),76);
[X6,Y6] = meshgrid(xlin6,ylin6);
の部分、xlin6, ylin6 それぞれ個別にみるとデータに存在するデータ点ですが、2次元で見るとデータに含まれない部分も出てくると思います。'v4' 以外の手法だと、その存在しない部分が NaN で返されているはずです。

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

Tags

Community Treasure Hunt

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

Start Hunting!