matlabで複数条件のif文を行列計算で行うには?

このQ&Aのポイント
  • matlabで複数条件のif文を行列計算で行う方法について教えてください。
  • matlabのforループを利用して複数条件のif文を行列計算で実行する方法を教えてください。
  • matlabでの複数条件のif文の行列計算についてわからない点があります。具体的にどのように書けば良いのか教えていただけますか?
回答を見る
  • ベストアンサー

matlabで複数条件のif文を行列計算で行うには?

matlabで複数条件のif文を行列計算で行うには? matlabではfor文などは行列計算で回したほうが高速化できると聞きました。 for文でのやりかたはわかったのですが、複数条件でのif文ではどのように書けばよいのでしょうか? 自分のプログラムは以下のようなものです for i=1:100 for j=1:100 theta_kari=atan(abs(B(j,i))/abs(A(j,i))); if A(j,i)>=0&&B(j,i)>=0 theta(j,i)=theta_kari; elseif A(j,i)<0&&B(j,i)>=0 theta(j,i)=theta_kari+(pi/2); elseif A(j,i)<0&&B(j,i)<0 theta(j,i)=theta_kari+pi; elseif A(j,i)>=0&&B(j,i)<0 theta(j,i)=theta_kari+(pi/2*3); end end end よろしくお願いします

質問者が選んだベストアンサー

  • ベストアンサー
  • rabbit_cat
  • ベストアンサー率40% (829/2062)
回答No.1

matlab的に一番速いのは theta = atan(abs(B./abs(A)) + (A<0 & B>=0)*pi/2 + (A<0 & B<0)*pi + (A>=0 & B>=0)*(pi/2*3); ですかね。

yoyoyo1028
質問者

お礼

ありがとうございます! forで回すのに比べて圧倒的に早く、すっきりした形になりました!!

関連するQ&A

  • MATLABでの行列の全要素の和

    MATLABでの行列の全要素の和を計算するのに下の例のようにfor文を使うのとsum関数を使うのとで結果が違います。何故ですか? 計算結果の差をとってみると極々微小な差が生じてしまいます(e-10位)。 シミュレーションの中でこのような処理を行っているのでより正確な方が知りたいです。 例 A=rand(10); plus=0; sum=0; for i=1:10  for j=1:10   plus=plus+A(i,j);  end end sum=sum(A(:));

  • matlabのfor文について

    matlabについて基本的な質問があります. たとえば a1 = 11 a2 = 32 a3 = 53 a4 = 63 for i = 1:length(a1) ○○○ end for i = 1:length(a2)  ○○○ end for i = 1:length(a3)  ○○○ end for i = 1:length(a4)  ○○○ end の時に,for文を一つにまとめるにはどうすればいいですか?

  • MATLABの計算過程での質問です。

    はじめまして。 MATLABのコードでどうしてもわからないことがあり質問させていただきます。 問題はerrorの計算で起こります。 error=Σ[((F_n+1)-(F_n))/(F_n+1)] ループ内の計算がiter=1以降に進まなくなりました。 いろいろ編集してみましたが、どうしてもerrorのところがうまく働きません。 良かったらアドバイスよろしくお願いします。 tol=tolerance N=number of maximum iterationです ---------------------------------------------------------------- tol=0.01; N=100; A=zeros(26,26); f0=zeros(26,26); A(11:26,1)=100; A(26,1:16)=100; f=A; iter=1;f0=0 n=1; for n=1:N for i=2:26-1 for j=2:26-1 f(i,j)=(1/4)*(A(i+1,j)+A(i-1,j)+A(i,j+1)+A(i,j-1)) error(i,j)= sum(abs((f(i,j)-f0(i,j))./f(i,j))); end end if error <=tol break; else A=f; f0=f; iter=iter+1 end end

  • matlab制御文での値の格納?

    現在matlabを使用してfor文で1から3000まで繰り返し、sigmaを求めるというプログラムを作っているのですが、うまくいきません。これだとn=3000のsigmaの値しかでてきません。sigmaにfor文で繰り返し求めたすべての値を格納したいです。初心者で低レベルな質問ですみません。どなたか教えていただけませんか。 sigma=0; for n=1:3000, if n <=300 dsig=1; elseif n <= 950 dsig=-1; elseif n <= 1700 dsig=1; elseif n <= 2550 dsig=-1; elseif n <= 3000 dsig=1; end sigma =sigma + dsig; end

  • MATLABでの、1行完結のIF文の書き方について教えてください。

    MATLABでの、1行完結のIF文の書き方について教えてください。 if (i==1);data(~test1 | test2>10) = -9; end の一文で、iが "8" になったときにのみ、ここでエラーが発生してしまいます。 この文の意味は 「test1ではない または test2が10より大きい 場合、dataに-9を代入する」 だと理解しています。 test1は、test1=(test0<100); という一文の結果が入っています。実際には test1 ===> 100*100 logical (100より大きいので、FALSE) test2 ===> 200*200 double が入ります。 if (i==1);data(test0>100 | test2>10) = -9; end と書き直して、両方 double にしてもやはりエラーになりました。 条件を複数記述する書き方が間違っているのでしょうか。 いろいろ試したもののうまくいかず困っています。 アドバイスをいただけましたら助かります。 宜しくお願い致します。

  • MATLABの計算精度

    いま,  A=[0.803, -0.803, 1.2124, 0.803, -0.803, -0.803, 1.2124, 0.803]; とします. このとき,次の2通りの演算をします. (i) a=0; for I=1:8  if( A(I)>=0 )   a=a+A(I)*0.25;  else   a=a+A(I)*0.75;  end end (ii) Bi=[0.25, 0.75, 0.25, 0.25, 0.75, 0.75, 0.25, 0.25]; b=sum(Bi.*A); (i)と(ii)によって得られる和の値をMATLABのコマンド上で表示すると, 同じ値として表示されるのですが,a-b と計算すると,0 ではなく, 8.04e-15のようになります.(現環境ではMATLABが使えないので,確認できませんが,もっと大きいデータでやったとき場合には,上記のように誤差が生じました). 困っているのは,現在組んでいるプログラムでは計算した値の正負によって 異なった計算をする必要があり,計算精度が非常に重要になってきます. そのため計算結果が例えば +1.4e-15となるか -6.4e-16 となるかによってその後の計算結果が大きく変わってしまいます. MATLABでは,上記(i)(ii)のような誤差が生じるためか,+1.4e-15となってほしいところが,なぜか -6.4e-16となってしまいうまくプログラムが動きません. MATLABでは,for文によって和をとるのではなく,一回でまとめて計算しなければ誤差が生じるのでしょうか? また,MATLABで計算精度を変更できないのでしょうか? (formatコマンドによって,「format short g」「format double g」としましたが有効な小数点が増減するだけで結果は同じでした.) よりよい精度で計算するにはどうしたらよいのでしょうか? 回答よろしくお願いします.

  • MATLAB 行列の抽出

    私はMATLAB初心者なのですが,行列の抽出ができなくて困っております. やりたいこととしては,for文を用いて行列x_r(41×3行列)がode45によって次々と求められるので,そのつどそのつど(i=1のときから1=10のときまで)でx_r(1)の値を新しい行列pに保存していきたいのですが上手くいきません.わかる方がいらっしゃいましたらご教授お願いします. for i=1:10 [t,x_r]=ode45('...',[0.01],x_r); ..... p(:,i)=x_r(:,1); …(1) ..... end 上の(1)のように行列pにi=1~10までのときのそれぞれのx(i)(41×1行列)の値を保存しようとしましたがうまくいきません. p=(x(1)_i=1,x(1)_i=2,x(1)_i=3,・・・・,x(1)_i=10) (41×10行列)(やりたいことのイメージ) エラーメッセージは「添字による代入の次元が一致しません。」と出ています.

  • 行列の計算について。

    こんにちは。 JAVAで行列の計算をするプログラムを作っていますが、なかなかうまくいきません。 自分で考えたのはfor文を使った物です。行列数を入力するとその数だけの行列を作る、という物なのですが、どうもうまくいきません。 「2」を入力すると、 │1 2││5 6│ │   ││   │ │3 4││7 8│ こんな2行2列の行列の計算をする、というものです。 for (int i =0; i < 2; i++){ for (int j = 0; j<2; j++){ for (int k = 0; k<2; k++){ C[i][j]=C[i][j]+a[i][k]*b[k][j]; } } } 上のようなプログラムを考えました。 JAVAには行列の計算をする専用の関数(クラス?)などあるのでしょうか? また、ソースなど教えていただけると、とても助かります。 CからJAVAに急に移ったので、つまづくことが非常に多いです。 よろしくお願いします。

    • ベストアンサー
    • Java
  • if文の判定条件に配列

    2次元配列(ここではa[M][N]とします)の値が全て0の時にだけある文章を実行したいのですが、 if(for(i=0; i<M; i++){ for(j=0; j<N; j++) map[i][j] == 0; }){ (実行したい文) } という文をコンパイルしたところエラーが出てしまいました。 if文の判定条件中にfor文は使えないのでしょうか? 使えないのであれば、別の書き方を教えて戴けると嬉しいです。よろしくお願いします。

  • matlabにおける行列の格納

    matlabにおける質問です。 (matlabもとよりプラグラミング初心者です。) 例えばx=[1 2 3;3 4 5]となっているとき for i=1:10 y(1)=i*x end のように、しても、y(1)とxの次元が合わないというエラーが 出ると思います 行列を、このように「i番目」といった添え字のついた変数に 代入するには、どうしたらよいのでしょうか。 初心者のため大変初歩的なことですが、どなたかご教授ください。 とても焦っております。。。

専門家に質問してみよう