Octaveコマンドまとめ3 -for, while, if, 関数-

#前回まで
前回までに,octaveにおける基本操作,データプロットを中心にまとめました.

[Octaveコマンドまとめ1 -基本操作(主にベクトル)-](https://qiita.com/mmm5mmm/items/73f6d8a8d2edd7488c68)
[Octaveコマンドまとめ2 -データプロット-](https://qiita.com/mmm5mmm/items/b69e0ed144c94433388a)

今回はif文, for文, while文, 関数についてまとめます.
前回までと同じく, 内容はAndrew Ng 先生の『Octave/Matlab Tutorial』のまとめです.

##条件式
octaveでのif文の使い方は以下の通りです.
３つ以上の分岐 は　**elseif** により可能です.
(octaveでは**end;**があるため, if内の字下げはしなくても大丈夫です. )

```matlab:if.m

>> a = 2;
>> if a == 1,
      disp('The value is one');
   elseif a == 2,
      disp('The value is two');
   else
      disp('The value is neither one nor two');
   end;

>>
The value is two
```

##ループ
###for文


for文は, 配列の中身を順番に取り出してループします.
下記は,『**1 : 10** で **1  2 ... 9  10** の配列を生成し,その中身を順番に**i**に入れループする』例です.
(octaveでは**end;**があるため, for内の字下げはしなくても大丈夫です. )

```matlab:roop.m
>> for i = 1:10,
      v(i) = 2*i;
   end;

>> v %結果表示
v =
    2    4    6    8   10   12   14   16   18   20

```

###while
**while**を用いたループもあります.
while文は, 条件を満たす限りずっとループします. 
下記は, 『**i** が5以下ならばループする』例です. v配列の最初の５つを100に置き換えします.
(while内も字下げしなくても大丈夫です. )

```matlab:roop.m
>> for i = 1:10, % 配列生成
      v(i) = 2*i;
   end;

>> i=1;
>> while i <= 5,
      v(i) = 100;
      i =i+1;
   end;

>> v %結果表示
v =
   100   100   100   100   100    12    14    16    18    20
```

## if文によるループ抜け出し

if文を用いると, while文のループを抜け出せます.
下記は **i** が6になったらループを抜ける例です.

```matlab:roop_if.m
>> for i = 1:10, % 配列生成
      v(i) = 2*i;
   end;

>> i = 1;
>> while true,
      v(i) = 999;
      i = i+1;
   if i ==6,
      break;
   end; % if文
   end; % while文

>> v
v =
   999   999   999   999   999    12    14    16    18    20
```

##関数

octaveは**function**で関数を定義することができます.
今回は **関数名.m**のファイルを作成し, そこに関数を定義します.

以下は, squareCube関数を定義しています.

```matlab:squareCube.m
function [y1 , y2] = squareCube(x)
   y1 = x^2;
   y2 = x^3;
```
一行目は 関数が**y1 , y2**の値を返すこと, 関数名は**squareCube**であること, 引数は **x**であることを示しています.
二行目以降が関数の中身で, 関数が返す値 **y1 , y2**を定義します.

作成した関数は, 引数を与えて以下のように使用できます.

```matlab:function.m
>> [a,b] = squareCube(5);
a = 25
b = 125
```

関数を定義したファイルがあるディレクトリでしか 関数は引用できません.
そんなときは, コマンドプロンプトで**addpath('パス名')** により検索パスを追加できます (関数を定義したファイルとは別のディレクトリにいても関数を引用できるようになります).

**machine learning**のプログラミング課題では, 関数の中身をコーディングするのが主ですので意味をしっかり知っておくと良さげです.

##最後に便利かもしれないことを少し

・よくわからないものは **help**コマンドで調べましょう. 

```matlab:
>> help eye
'eye' is a built-in function from the file libinterp/corefcn/data.cc

 -- eye (N)
 -- eye (M, N)
 -- eye ([M N])
 -- eye (..., CLASS)
     Return an identity matrix.

     If invoked with a single scalar argument N, return a square NxN
     identity matrix.
                           %(以下省略)        
```

・**who** で変数一覧, **whos** で詳細付き変数一覧を見ることができます.

```matlab:
>> who
Variables in the current scope:
A  a  b

>> whos
Variables in the current scope:

   Attr Name        Size                     Bytes  Class
   ==== ====        ====                     =====  =====
        A           3x3                         72  double
        a           1x1                          8  double
        b           1x10                        24  double

Total is 20 elements using 104 bytes
```

・**clear** で変数をすべて消すことができます. 変数を指定すると, その変数のみ消すことができます.

```matlab:

>> who
Variables in the current scope:
A a b

>> clear a
>> who
Variables in the current scope:
A  b

>> clear
>> who
>>
```

・**デバッグには, machine learning授業概要の参考資料の中にある [Test cases] が非常に便利です(これほんとめっちゃ使えます).**

まとめは以上になります.
[こちら](https://octave.org/doc/interpreter/)でOctaveのヘルプを見ることができますので, 英語が得意な方はぜひ.