iskeyword
ans = { [1,1] = __FILE__ [2,1] = __LINE__ [3,1] = break [4,1] = case [5,1] = catch [6,1] = classdef [7,1] = continue [8,1] = do [9,1] = else [10,1] = elseif [11,1] = end [12,1] = end_try_catch [13,1] = end_unwind_protect [14,1] = endclassdef [15,1] = endenumeration [16,1] = endevents [17,1] = endfor [18,1] = endfunction [19,1] = endif [20,1] = endmethods [21,1] = endparfor [22,1] = endproperties [23,1] = endswitch [24,1] = endwhile [25,1] = enumeration [26,1] = events [27,1] = for [28,1] = function [29,1] = global [30,1] = if [31,1] = methods [32,1] = otherwise [33,1] = parfor [34,1] = persistent [35,1] = properties [36,1] = return [37,1] = switch [38,1] = try [39,1] = until [40,1] = unwind_protect [41,1] = unwind_protect_cleanup [42,1] = while }
前回の授業資料で行列の成分へのアクセスについて説明しましたが、次のようにすると行列の行や列へのアクセスができます。
A = [1,2,3,4;5,6,7,8;9,10,11,12]
A(2,:) %Aの第2行
A([1,3],:) %Aの第1行と第3行
A(:,3) %Aの第3列
A(:,2:4) %Aの第2列~第4列
A(2,:) = 1 %値の変更も可能
A(:,3) = [10,20,30] %ベクトルの縦・横の違いは気にしなくてよい
A = 1 2 3 4 5 6 7 8 9 10 11 12 ans = 5 6 7 8 ans = 1 2 3 4 9 10 11 12 ans = 3 7 11 ans = 2 3 4 6 7 8 10 11 12 A = 1 2 3 4 1 1 1 1 9 10 11 12 A = 1 2 10 4 1 1 20 1 9 10 30 12
特殊な行列に関して、次のようにすると乱数(一様乱数)から成る行列を扱うことができます。
rand %rand: 区間(0,1)内の一様乱数
rand(3) %rand(n): 区間(0,1)内の一様乱数から成るn次正方行列
rand(2,4) %rand(m,n): 区間(0,1)内の一様乱数から成るm×n行列
randi(10) %randi(max): 1以上max以下の整数の一様乱数
randi(10,3) %randi(max,n): 1以上max以下の整数の一様乱数から成るn次正方行列
randi(10,2,4) %randi(max,m,n): 1以上max以下の整数の一様乱数から成るm×n行列
ans = 0.84652 ans = 0.9173763 0.0065573 0.4998649 0.6635027 0.7213861 0.8741907 0.4344644 0.7115023 0.2587632 ans = 0.81920 0.85213 0.38434 0.94949 0.78090 0.89554 0.17112 0.35693 ans = 6 ans = 8 3 3 2 1 6 5 5 10 ans = 7 1 7 2 2 4 6 9
※前回紹介したzerosとonesも、引数2つの使い方に加えて引数1つの使い方があります。
zeros(3) %zeros(n): 全ての成分が0のn次正方行列
zeros(2,4) %zeros(m,n): 全ての成分が0のm×n行列
ones(3) %ones(n): 全ての成分が1のn次正方行列
ones(2,4) %ones(m,n): 全ての成分が1のm×n行列
ans = 0 0 0 0 0 0 0 0 0 ans = 0 0 0 0 0 0 0 0 ans = 1 1 1 1 1 1 1 1 1 ans = 1 1 1 1 1 1 1 1
a = randi(101)-1 %乱数で0以上100以下の整数を与える
if a >= 60
display("合格")
end
a = 72 合格
([Ctrl]+[Enter]を使うと、セルの移動を伴わずにコードの実行ができます。同じセルを複数回実行する際に便利です。)
条件式で使用できる関係演算子は、次の表の通りです。
関係演算子 | 意味 |
---|---|
== | 等しい |
>= | 以上 |
> | より大きい |
<= | 以下 |
< | より小さい |
~= != (Octaveでは可) |
等しくない |
行列AとBのサイズが異なる場合にはA == B
はエラーになるため、そのような可能性がある場合は代わりにisequal(A,B)
を使います。
条件式で使用できる論理演算子は、次の表の通りです。
論理演算子 | 意味 |
---|---|
&& (&は非推奨) |
かつ |
| | (|は非推奨) |
または |
~(条件式) !(条件式) (Octaveでは可) |
でない |
必要に応じて、演算の優先順位を変えるために半角の括弧を使います。また、次の例には特に注意が必要です。
a = 5
if 1 <= a <= 3 %誤った書き方
display("上")
end
if 1 <= a && a <= 3 %正しい書き方
display("下")
end
a = 5 上
if文ではオプションとして、次のようにelseとelseif(複数も可)を使うことができます。
if 条件式
条件式が真の場合の処理
…
else
条件式が偽の場合の処理
…
end
if 条件式1
条件式1が真の場合の処理
…
elseif 条件式2
条件式1が偽かつ条件式2が真の場合の処理
…
else
条件式1が偽かつ条件式2が偽の場合の処理
…
end
if文を使って、点数(0以上100以下の整数)が与えられたときに次の表に従った評価を表示するコードを書いてください。
点数 | 評価 |
---|---|
90点~100点 | 秀 |
80点~89点 | 優 |
70点~79点 | 良 |
60点~69点 | 可 |
0点~59点 | 不可 |
%演習1のコード
score = randi(101)-1 %乱数で0以上100以下の整数を与える
%ここに、if文を使ったコードを書いてください
score = 15
result = 0; %変数としてsumを使うこともできるが、その場合は関数としてのsumが使えなくなる
for k = 1:10
result = result+k;
end
printf("1から10までの整数の和は%d",result)
1から10までの整数の和は55
for文による繰り返しを途中で強制的に終了したい場合には、if文の中でbreakを使います。
result = 0;
for k = 1:50
result = result+k;
if result >= 100
break
end
end
printf("条件「1からnまでの整数の和が100以上」を満たす最小のnは%d",k)
条件「1からnまでの整数の和が100以上」を満たす最小のnは14
残りの処理をスキップして繰り返しを強制的に次に進めるcontinueも使用可能です。
for k = 1:10
if mod(k,2) == 0 %mod(a,b)はaをbで割った余り
continue
end
printf("%dは奇数\n",k)
end
1は奇数 3は奇数 5は奇数 7は奇数 9は奇数
for文を使って、条件「nの階乗が10000以上」を満たす最小のnとその階乗の値を求めてください。ただし、関数factorialを使用しないこと。
%演習2のコード
%ここに、for文を使ったコードを書いてください
result = 0;
k = 1;
while k <= 10
result = result+k;
k = k+1;
end
printf("1から10までの整数の和は%d",result)
1から10までの整数の和は55
while文がfor文と最も違うのは、繰り返しの回数が不定であることです。場合によっては無限ループ(繰り返しがいつまでも終わらない状態)が発生してしまうため、十分に注意する必要があります。
無限ループに陥ってしまった場合は、画面上の四角ボタンでカーネルの中断を試み、それがダメなら丸い矢印のボタンでカーネルを再起動すればよいです。
条件式としてtrueを使えば意図的に無限ループを発生させることができますが、必ずbreakと併用して処理が有限回の反復で終わるようにしましょう。
a = 0;
while true
a = a+1
if a >= 10
break
end
end
a = 1 a = 2 a = 3 a = 4 a = 5 a = 6 a = 7 a = 8 a = 9 a = 10
while文を使って、条件「nの階乗が10000以上」を満たす最小のnとその階乗の値を求めてください。ただし、関数factorialを使用しないこと。
%演習3のコード
%ここに、while文を使ったコードを書いてください
x = -1
sin(x) %正弦
abs(x) %絶対値
y = 1:10
sum(y) %合計
mean(y) %平均
randi(10,2,4) %引数が複数のこともある
x = -1 ans = -0.84147 ans = 1 y = 1 2 3 4 5 6 7 8 9 10 ans = 55 ans = 5.5000 ans = 4 10 4 8 3 9 7 4
MATLABでは、ユーザー自らが新しい関数を定義することができます。
関数定義の基本的な書き方は、次の通りです。
function 戻り値の変数 = 関数名(引数の変数)
関数の処理(引数の変数を使って戻り値の変数に値を格納する)
…
end
代入の処理の行末にセミコロンを付けないと、関数の呼び出し時に余計な値が表示されるため注意してください。
function value = f(x) %x^2を返す関数
value = x.^2; %xがベクトルや行列の場合にも対応するように「.」で要素ごとの計算を行っている
end
f(3)
f(-5)
f([2,4,6])
f([1,2;3,4])
ans = 9 ans = 25 ans = 4 16 36 ans = 1 4 9 16
引数を複数持つ関数も定義できます。
function value = my_max(x,y) %2つの数の最大値を返す関数
if x > y
value = x;
else
value = y;
end
end
my_max(2,5)
ans = 5
あまり使う機会はないですが、引数や戻り値を持たない関数も定義できます。
function value = one_year %引数なしの関数
value = 365;
end
one_year
ans = 365
function hello(name) %戻り値なしの関数
printf("Hello, %s!",name)
end
hello("World")
Hello, World!
新しく何かしらの関数を定義してください。定義した関数を呼び出す例も付けてください。
%演習4のコード
演習1~演習4に取り組んでください。