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

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

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

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

MacOS(OSX)

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

Q&A

解決済

1回答

3468閲覧

左辺と右辺の要素数が異なるため、代入を実行できません。

kaeruuuun

総合スコア19

MATLAB

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

MacOS(OSX)

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

0グッド

0クリップ

投稿2021/06/15 07:31

イメージ説明

このような式をmatlabで書いていて

matlab

1f=1000;%対象とする周波数 2c=340;%音速 3dist=0.04;%評価音場の観測点間隔 4rs=1.5; %スピーカアレーの半径 5k=2*pi*f/c; %波数 6L=64; %スピーカの数 7dr=zeros(1,L); %L個のスピーカ駆動信号 8phi_s=(0:L-1)/L*2*pi; %スピーカ角度 9N=fix((L-1)/2); %展開次数の最大値 10phi_t=pi/3; %平面波の到来方向 11for s=1:L 12 for n=-N:N 13 dr(s)=dr(s)+((1i^(n+1)*exp(-1i*n*phi_t))/(besselh(n,2,k*rs))*exp(1i*n*phi_s)); 14 end 15 dr(s)=dr(s)*2/pi; 16end

のように書いてみたのですが,

matlab

1左辺と右辺の要素数が異なるため、代入を実行できません。 2dr(s)=dr(s)+((1i*exp(-1i*n*phi_t))/(besselh(n,2,k*rs))*exp(1i*n*phi_s));

のようなエラーが出て困っています.

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

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

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

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

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

guest

回答1

0

ベストアンサー

「for s=1:L」以降の代わりに

matlab

1s=1; 2n=-N; 3size(dr(s)) 4size(((1i^(n+1)*exp(-1i*n*phi_t))/(besselh(n,2,k*rs))*exp(1i*n*phi_s)))

を実行して、サイズを確認してください
二つの「size()」の結果が一致しないとダメです

投稿2021/06/15 07:56

jbpb0

総合スコア7653

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

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

kaeruuuun

2021/06/15 08:03

ご回答ありがとうございます. s=1; n=-N; size(dr(s)) size(((1i^(n+1)*exp(-1i*n*phi_t))/(besselh(n,2,k*rs))*exp(1i*n*phi_s))) ans = 1 1 ans = 1 64 >> for s=1:L以降ということなのでこのようにしてみましたが,これだとsが1のままだと思います.
jbpb0

2021/06/15 08:06

「for s=1:L」は、 s=1で計算 s=2で計算 ... s=Lで計算 をするという意味です だから、ループの1回目はs=1で計算されます
kaeruuuun

2021/06/15 08:11

そうでした.そもそもこの1回目を計算するところからでした. 私が求めたいのは1×64の行列なので,dr(s)が1行1列になってしまっているということですね
kaeruuuun

2021/06/15 08:20

左辺を1×64の行列にできますか?
jbpb0

2021/06/15 08:24

size(dr)
kaeruuuun

2021/06/15 08:34

drは1×64の行列です.という結果が表示されました.
jbpb0

2021/06/15 08:43

> drは1×64の行列 size(((1i^(n+1)*exp(-1i*n*phi_t))/(besselh(n,2,k*rs))*exp(1i*n*phi_s))) と同じですよね
kaeruuuun

2021/06/15 08:45

なぜdr(s)は1×1なのかがわかりません.
jbpb0

2021/06/15 08:46

s=1のとき、dr(s)=dr(1)
kaeruuuun

2021/06/15 08:48

であれば,s=1の時は右辺も1×1にならないといけないのですか?
kaeruuuun

2021/06/15 08:49

このままだと行列のサイズが違うので計算できないですよね?
kaeruuuun

2021/06/15 08:51

dr=zeros(1,L);と定義しているのでdrは1×64の行列になると思います.
jbpb0

2021/06/15 09:09 編集

> dr=zeros(1,L);と定義しているのでdrは1×64の行列になる そうです なので、 %for s=1:L for n=-N:N dr=dr+((1i^(n+1)*exp(-1i*n*phi_t))/(besselh(n,2,k*rs))*exp(1i*n*phi_s)); end dr=dr*2/pi; %end でいいのでは?? いちいちdrを分解しなくて、64個を一括で計算すれば
kaeruuuun

2021/06/15 09:00

>そうです なので、 %for s=1:L for n=-N:N dr=dr+((1i^(n+1)*exp(-1i*n*phi_t))/(besselh(n,2,k*rs))*exp(1i*n*phi_s)); end dr=dr*2/pi; %end でいいのでは?? いちいちdrを分解しなくて それはそうなのですが,このようなスタイルで与えられていたのでsを使ってできないかと考えていましたがsを使うと無理なのでしょうか.
jbpb0

2021/06/15 09:09

size(((1i^(n+1)*exp(-1i*n*phi_t))/(besselh(n,2,k*rs))*exp(1i*n*phi_s(s))))
kaeruuuun

2021/06/15 09:12 編集

やってみます
kaeruuuun

2021/06/15 09:14

ans = 1 1 のような結果でした.
kaeruuuun

2021/06/15 09:14

なのでこれだとdr(s)に代入できます.
kaeruuuun

2021/06/15 09:17

>ただし、matlabでは、なるべくfor...使わないでベクトルや配列を一括計算する方がいいです 計算量の問題ですか? >size(((1i^(n+1)*exp(-1i*n*phi_t))/(besselh(n,2,k*rs))*exp(1i*n*phi_s(s)))) なぜこのphi_s(s)にしたら1行1列になったのか頭が追いついていません.
jbpb0

2021/06/15 09:21

> 計算量の問題ですか? 上記参考Webページ見てください > なぜこのphi_s(s)にしたら1行1列になったのか size(phi_s) size(phi_s(s))
kaeruuuun

2021/06/15 09:26

一つ一つsizeを用いてその中身が何行何列か確認したら,phi_sでエラーが出ていることがわかりました. ありがとうございます.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問