- ベストアンサー
MATLABでの1行完結のIF文の書き方
- MATLABでの1行完結のIF文の書き方について教えてください。
- if文の条件を複数記述する際にエラーが発生してしまう場合についてのアドバイスをお願いします。
- 回答者に質問者が実施したテストデータの情報を伝え、条件書き換えの方法を教えてもらいたい旨を伝えています。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
プログラムの全容がわからないので断言はできませんが、 少なくともif文を1行で書いているから起こったエラーではないと思われます。 いくつかコメントを。 1.C言語などではループ変数としてiをよく使うかと思われますが、 Matlabの場合iは虚数単位を表すので、いざという時混乱しないように 単独のiは使わない方がよいです。(私は主にkを使っています。) 2.Matlabのmファイルを実行し、エラーが発生するとそのエラーが起きた行が 表示されると思います。1行でいろいろ書いてると結局どこでエラーが起きているのかわからないと思うので、 デバッグをしている時は(最終的には1行で書くところでも)複数行に分けて書いておいた方がいいです。 (私もものすごく複雑な行列の多項式演算などを書いてエラーが出た時は、 各演算を分割して別々の変数として確保し、どの計算がエラーを引き起こしているのか チェックするようにしています) 3.if (i==1);の書き方には問題ないので、i=8の時はそもそもif文の中身は 実行されないはずです。それ以外のところに問題があると思われます。 あと質問なのですが、 1. test1 ===> 100*100 logical test2 ===> 200*200 double というのは、 test1…100行100列のlogicalの行列 test2…200行200列のdoubleの行列 ということでしょうか? だとすると、条件を2つ記述する時は行列のサイズが揃っているか、片方が スカラーである必要があるため、(~test1 | test2>10) でエラーが出ると思います。 2. 変数dataは予め行列のサイズは決められているのでしょうか? 行列のサイズが決まっていない時は、find(~test1 | test2>10)から決まるインデックスの最大値分だけの 行ベクトルが確保されます。(すなわち、100行100列とかにはどうやったってなりません) また、行列サイズを確保していてもそれがtest1やtest2より小さかった場合そこでエラーが出ます。 とりあえず次のように書き換えて実行すればどこでエラーが出ているかわかると思います。 if (i==1); F1=~test1; F2=test2>10; F3=F1|F2; data(F3)=-9; end; 参考になれば幸いです。
お礼
Kules様 ヒントをたくさん教えてくださいまして、ありがとうございました! 本当に助かりました。 デバック用に複数行に分けて書くこと、 条件を2つ記述する時は行列のサイズが揃っているか、片方がスカラーである必要があること、 さらに、書き変えコードまで書いてくださって、 ここ数日、ネット検索や本や人に聞いて行き詰っていた状態に 明快に打開策が示されてすっきりしました。 本当にありがとうございます。 さっそくご教示の点を踏まえて書きなおしてみます。