質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
MATLAB

MATLABはMathWorksで開発された数値計算や数値の視覚化のための高水準の対話型プログラミング環境です。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Q&A

1回答

2148閲覧

surf関数のエラーについて

kaeruuuun

総合スコア19

MATLAB

MATLABはMathWorksで開発された数値計算や数値の視覚化のための高水準の対話型プログラミング環境です。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

0グッド

0クリップ

投稿2021/06/09 00:20

編集2021/06/10 02:59

surfという関数を使ってpaという値の実部をプロットしたいのですが,このようなエラーが出ます.
paには1×81complex doubleという値が入っているので行列が入っているはずなのになぜこのようなエラーが出るのでしょうか.

matlab

1エラー: surf (71) 2Z はスカラーでもベクトルでもなく、行列でなければなりません。 3 4エラー: kadai08 (24) 5 surf(real(pa))

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jbpb0

2021/06/09 13:57 編集

> paには1×81complex doubleという値が入っているので行列が入っているはず 行か列かどちらかの長さが1の場合は、matlabではベクトルです https://jp.mathworks.com/help/matlab/learn_matlab/matrices-and-arrays.html そのエラーメッセージでの行列の意味は、2次元の配列で、行と列の長さがどちらも2以上のものです
guest

回答1

0

paには1×81complex doubleという値が入っている

surf
の「入力引数」の「Z — z 座標」
「Z は少なくとも 2 行 2 列でなければなりません。」

投稿2021/06/09 22:51

編集2021/06/09 22:53
jbpb0

総合スコア7653

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kaeruuuun

2021/06/10 02:20 編集

コメントありがとうございます.調べたらそのように出てきたのですが,考えていることを少し書きます. まずp=exp(-1i.*ky.*y).*exp(-1i.*kx.*x);のxとyそれぞれを変化させた値を計算しておきます.ここには1×81のcomplexdoubleが入っていて,それをforの中でpa=p*exp(1i*omega*t);としてtを変化させてかけて行ってsurf(real(pa))としたらエラーが出たという状況です. 当然paの中身も1×81のcomplexdoubleになっているのですが,これを実行しようとした場合,今1行になっているものを2行にしないといけないということでしょうか.ちなみに2行以上にする方法はありますか.
jbpb0

2021/06/10 02:36 編集

「p」はどんな形してるのですか? 行と列の、どちらかが「x」で、もう片方が「y」に対応する、2次元ですか? 【追記】 > ここには1×81のcomplexdoubleが入っていて は「p」のことですか? そうなら、81とx, yはどのような関係なのですか?
kaeruuuun

2021/06/10 02:33

私がやりたいことが曖昧になっているので,説明します. まずp(x,y)=e^(-j*k_x*x)*e^(-j*k_x*x)を求めたいです.k_x,k_yは一定の値でこの時x = 0: 0.05: 4, , y = 0: 0.05: 4として値を動かしてp(x,y)を求めたいのですが,今回は変数分離をする必要があるということだったので, x=0:0.05:4; px=exp(-1i.*kx.*x); y=0:0.05:4; py=exp(-1i.*ky.*y); p=px(x).*py(y); このような式でpを求めると1×81のcomplexdoubleになってpa=p*exp(1i*omega*t);をしても1×81のcomplexdoubleになり,surfがうまく使えないという状況です.
kaeruuuun

2021/06/10 02:35

>「p」はどんな形してるのですか? p(x,y)=e^(-j*k_x*x)*e^(-j*k_x*x) これで伝わりますでしょうか?
jbpb0

2021/06/10 02:46 編集

surf()で表示させたいのは、どういうものなのでしょうか? surf()で表示できるのは、2次元データです たとえば、x, yに対して一つのzが決まる場合に、そのzを下記画像のようにx, y座標に対して表示させることができます https://jp.mathworks.com/help/matlab/creating_plots/changedirectionofcolortransitionsexample_01_ja_JP.png 上記のx, y, zに相当するのは、質問者さんの場合はそれぞれどれになるのでしょうか?
kaeruuuun

2021/06/10 02:44 編集

2次元の平面波の疎密を画像化したいです.
kaeruuuun

2021/06/10 02:45

xがpxでy がpyでzがpaです.
jbpb0

2021/06/10 02:56 編集

> xがpxでy がpyでzがpaです. px, pyは分かるけど、paが分からない 正確に言うと、tをsurfにどのように関連付けるのかが、分からない 時刻t=0のときに、p(x, y)が決まるので、それをsurf()で表示させることができます 時刻t=Δtのときに、別のp(x, y)が決まるので、それもsurf()で表示させることができます さらに時刻t=2Δtのときに、さらに別のp(x, y)が決まるので、それもsurf()で表示させることができます そのようにして、いろんなtに対してそれぞれ決まるp(x, y)をそれぞれ別個にsurf()で表示させることはできます やりたいことは、上記とは違うのですか?
ozwk

2021/06/10 02:55

x,yがそれぞれ1x81行列でしたら、zは81x81行列である必要があります。 p = px' * py
kaeruuuun

2021/06/10 03:00 編集

>x,yがそれぞれ1x81行列でしたら、zは81x81行列である必要があります。 p = px' * py 転置したらできました.転置しないと1x81行列は計算できないからですか?
ozwk

2021/06/10 03:00

線形代数を勉強してください
kaeruuuun

2021/06/10 03:01

わかりました. ありがとうございます.
jbpb0

2021/06/10 03:39 編集

この質問のエラーの話ではないですが、 > forの中でpa=p*exp(1i*omega*t);としてtを変化させてかけて行って が、 for t=0:0.01:0.1 pa=p*exp(1i*omega*t); end みたいなことなら、その結果paに代入されるのは一番最後のt(上記例だとt=0.1)の結果だけで、それ以外のtでの計算結果は全然反映されませんので、上記のforループ無くして t=0.1 pa=p*exp(1i*omega*t); とすればいいような もし、一番最後のt以外の計算結果も保存して、それぞれsurf()で表示させたいなら、コードをそのように変えないといけません (ループの毎回で同じpaに代入するのではなく、違うところに代入して、上書きされないようにする) 元のコード見てないので、勘違いしてたらごめんなさい
kaeruuuun

2021/06/10 05:06 編集

わかりました.参考にさせていただきます.ありがとうございます.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問