MATLABでの1行完結のIF文の書き方

このQ&Aのポイント
  • MATLABでの1行完結のIF文の書き方について教えてください。
  • if文の条件を複数記述する際にエラーが発生してしまう場合についてのアドバイスをお願いします。
  • 回答者に質問者が実施したテストデータの情報を伝え、条件書き換えの方法を教えてもらいたい旨を伝えています。
回答を見る
  • ベストアンサー

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 にしてもやはりエラーになりました。 条件を複数記述する書き方が間違っているのでしょうか。 いろいろ試したもののうまくいかず困っています。 アドバイスをいただけましたら助かります。 宜しくお願い致します。

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

  • ベストアンサー
  • Kules
  • ベストアンサー率47% (292/619)
回答No.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; 参考になれば幸いです。

rosafilipes
質問者

お礼

Kules様 ヒントをたくさん教えてくださいまして、ありがとうございました! 本当に助かりました。 デバック用に複数行に分けて書くこと、 条件を2つ記述する時は行列のサイズが揃っているか、片方がスカラーである必要があること、 さらに、書き変えコードまで書いてくださって、 ここ数日、ネット検索や本や人に聞いて行き詰っていた状態に 明快に打開策が示されてすっきりしました。 本当にありがとうございます。 さっそくご教示の点を踏まえて書きなおしてみます。

関連するQ&A

  • 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 よろしくお願いします

  • if文の中のif文・・・について

    質問させていただきます。 if文の中のif文の記述の仕方について質問があります。 例えば if ( x > 0 ){ a = b+c; if ( a > 1) d = e+f; ・・・1 if ( a < 1) d = e-f; ・・・2 if ( a = 1 ) d = 1-g; ・・・3 } h = d + i; aが1より大きい場合は、1の処理を、aが1より小さい場合は2の処理を、aが1と同じであった場合、3の処理をして最終的に、h = d + i;の式の d に代入して h を求めたいと思っているのですが、うまくゆきません。 if文の中のif文の記述はどのようにすればよいのでしょうか? よろしければご教示よろしくお願いします。

  • 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文を一つにまとめるにはどうすればいいですか?

  • if文について

    Excel 2007 VBAを使用しています。 ↓のクリックイベントを実行するとif文のところで不具合があります。 商品シートのC列には、状況が保存されています。 該当した年月、"受取済み"、"注文中"以外の行データをリストさせます。 商品シートのJ列、W列には、該当した年月、"受取済み"、"注文中"以外の行データが存在するのですが、まったく検出してくれません。 対処方法を教えてくれませんか? ------------------------------------------- Option Explicit Private Sub CB1_Click() '変数を定義 Dim i As Long Dim maxRow As Long Dim inSheet As Worksheet Dim outSheet As Worksheet '入出力先のシートをオブジェクト変数へ格納 Set inSheet = Worksheets("商品") Set outSheet = Worksheets("結果") 'テキストボックスの内容を判定 If (Me.TextBox21.Value = "") Or (Not IsDate(Me.TextBox21.Value)) Then MsgBox "日付が入力されていません" Exit Sub End If '最終行番号を取得 maxRow = Me.Cells(Rows.Count, "A").End(xlUp).Row '商品シートの最終行番号で分岐処理 If maxRow > 3 Then '出力先を削除してヘッダーをコピー outSheet.Cells.Delete inSheet.Range("A3").EntireRow.Copy outSheet.Range("A1") Application.CutCopyMode = False Else '4行目以降にデータが入力されていなければメッセージで終了 MsgBox "該当データがありません" Exit Sub End If '4行目から最終行まで繰り返し For i = 4 To maxRow 'J列が日付であれば処理 If IsDate(inSheet.Cells(i, "J").Value) Then '--------機能しない箇所(開始) If Year(inSheet.Cells(i, "J").Value) <= Year(Me.TextBox21.Value) And _ Month(inSheet.Cells(i, "J").Value) <= Month(Me.TextBox21.Value) And _ CStr(inSheet.Cells(i, "W").Value) <> "受取済み" And CStr(inSheet.Cells(i, "W").Value) <> "注文中" Then '--------機能しない箇所(終了) inSheet.Rows(i).Copy outSheet.Rows(cnt + 2) End If End If Next i End Sub

  • matlabでファイルをn行目から変数に読み込む方法

    matlabでファイルをn行目から読み込む方法がわかりません。 具体的にはファイルの上9行に説明文が入っていて、10行目からtab区切りでn×m行列のデータが入っているファイルがあって、その中のn×m行列のデータを変数に代入したいのですが、その方法がわかりません。 loadで読み込もうとしたのですが上手くできません。もし読み込む方法があるのなら誰か教えてください。

  • if文が通りません

    $dataという変数の中に"----"という値が入っているのですが下記のif文が通りません。 if($data == "----"){ echo "成功"; } echoで"----"の値が出力されるのは確認済みです。 スペースも入っていません。 ちなみにif文の前に$data = "----";と書いて値を代入するとうまくいきます。

    • ベストアンサー
    • PHP
  • if文からcase文への置き換え

    ピクチャボックスをクリックしたら、チェック ボックスがチェックされるメソッドを作りたいと 思っています。 Private Sub PictureBox_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click,PictureBox2.Click 'ここから If sender Is PictureBox1 Then If Me.CheckBox1.Checked = False Then Me.CheckBox1.Checked = True Else Me.CheckBox1.Checked = False End If ElseIf sender Is PictureBox2 Then If Me.CheckBox2.Checked = False Then Me.CheckBox2.Checked = True Else Me.CheckBox2.Checked = False End If End If 'ここまで End Sub 上記のif文をCase文に置き換えたくて、 'ここから Select Case sender Case PictureBox1 If Me.CheckBox1.Checked = False Then Me.CheckBox1.Checked = True Else Me.CheckBox1.Checked = False End If Case PictureBox2 If Me.CheckBox2.Checked = False Then Me.CheckBox2.Checked = True Else Me.CheckBox2.Checked = False End If End Select 'ここまで 上記のように書き換えたのですが、エラーが出てしまいます(ビルドは通るのですが)。 Case文の使い方が間違っているんだとは思いますが、どこがどう 間違っているのがよくわかりません。 ご教授いただけないでしょうか?

  • IF構文の使い方

    皆さんにはいつもお世話になっております。 エクセルVBAでご教授していただきたいことがあります。 1行目は空白行で、B2~CW51がデータがあるセルです。 A列は空白列で、B列(B2以降)にデータがある場合は、ListBox3の文字列を同行のcell(i , "A")に代入したいのですが。 下記のように、if構文を使ってみたのですが、うまくいきません。 Sub テスト_Click() Dim i As Integer With ActiveSheet For i = 2 To 51 If .Cells(i, "B") = "" Then .Cells(i, "A") = "" Else Cells(i, "A") = ListBox3.Value Exit For End If Next End With End Sub よろしくお願いいたします。

  • MATLABのデータ抽出についておたずねしたいことがあります。

    MATLABのデータ抽出についておたずねしたいことがあります。 MATLAB初心者ですが、以下のようなプログラムを現在書いています。 f = input('file name? ---> ','s'); m = csvread(f,66,2,[66,2,1089,3]); time=(0:0.002:2.046); t=reshape(time,1024,1); current=m(:,1)*1000; voltage=m(:,2)*10; m2=[t current voltage]; a=m2(1,2); b=m2(2:40,2); if a>max(b); g=a; end for I=2:1024; for J=1:1024; for K=39+I; if K>1024; K=1024; end c=m2(I,2); d=m2(J:I-1,2); e=m2(I+1:K,2); if c>max(e)&&c>max(d); g=c; else end end end end plotyy(t,current,t,voltage) ylim([0,700]) ifの条件を満たしたときに、m2の2列目の値だけでなく条件を満たしたその行の3列全てのデータを抽出し、条件を満たした行だけの新たな行列を作りたいのですが、どのような命令を書けばよいでしょうか。 お手数をおかけしますが、ご教授よろしくお願いいたします。

  • MATLABのアップグレード問題

    MATLAB初心者です。 MATLAB6.1(おそらく)で開発されたコードがMATLAB7.01で動きません。 アドバイスを頂ければと思います。 1: out = {}; 2: for i=1:length(files), 3: out = [out, helper([d '/' files{i}], pat(2:end))]; 4: end 上記のコードの3行目で「Conversion to cell from char is not possible.」エラーが発生します。 MATLAB6.1から6.5のアップグレード問題で、空のセル配列の連結が原因のようです。 そこで下記のように修正しました。 1: out = {}; 2: for i=1:length(files), 3: if i==1 out = helper([d '/' files{i}], pat(2:end)); 4: else out = [out, helper([d '/' files{i}], pat(2:end))]; 5: end 6: end 1回目のループの場合は連結せず、2回目以降は連結するように修正しています。 このように修正しても意図通り動いていません。 修正方法は間違っていますか。

専門家に質問してみよう