(Press ?
for help, n
and p
for next and previous slide)
村田 昇
2020.04.24
ベクトルは太字で,要素は下付き添字で表す
a <- c(a1,a2,...,ak) # k次元ベクトルの作成
別の書き方:
同じ長さのベクトル の和および差:
数値の和と差のように扱うことができる
a + b # 同じ長さのベクトル a,b の和 a - b # ベクトルの差
同じ長さのベクトル の成分ごとの積
a * b # ベクトルの成分ごとの積 a / b # 成分ごとの商も計算可
同じ長さのベクトル の内積
a %*% b # ベクトルの内積
行列は大文字で,要素は下付き添字で表す
A <- matrix(c(a11,a21,...,amn),m,n) # m x n 行列の作成
別の書き方:
同じ大きさの行列 の和および差:
ベクトルと同じように記述することができる
A + B # 同じサイズの行列の和 A - B # 行列の差
同じ大きさの行列 の成分ごとの積
A * B # 行列の成分ごとの積 A / B # 成分ごとの商も計算可
\(n\times m\) 型行列 \(A\) と \(m\times l\) 型行列 \(B\) の積
A %*% B # 行列の積
\(n\) 次正方行列 \(A\) の行列式 \(\det(A)\)
det(A) # 行列式
\(n\) 次正方行列 \(A\) のトレース(対角成分の総和)
関数は用意されていないので以下を利用:
diag()
: 行列の対角成分を取り出す(ベクトル)sum()
: ベクトルの総和を計算するsum(diag(A)) # 行列のトレース
適当な2次正方行列 \(A\) で Hamilton-Cayleyの定理
の成立を確認せよ.
ただし \(E_{2}\) は2次単位行列,\(O_{2}\) は2次正方零行列
## 行列を作成 (好きに設定してよい) (A <- matrix(1:4,2,2)-diag(rep(3,2)))
[,1] [,2] [1,] -2 3 [2,] 2 1
## 左辺を計算 A%*%A - sum(diag(A)) * A + det(A) * diag(rep(1,2))
[,1] [,2] [1,] 1.776357e-15 0.000000e+00 [2,] 0.000000e+00 1.776357e-15
30度の回転行列を2回乗ずると60度の回転行列となることを確認せよ.
計算結果は 行列 で表現される
A <- matrix(1:4,2,2); b <- c(5,6) # 行列とベクトルを作成
A %*% b # 行列 x ベクトル = 列ベクトル
[,1] [1,] 23 [2,] 34
b %*% A # ベクトル x 行列 = 行ベクトル
[,1] [,2] [1,] 17 39
連立1次方程式
解を求めるには関数 solve()
を利用する
x <- solve(A, b)
正則な \(n\) 次正方行列 \(A\) の逆行列 \(A^{-1}\)
関数 solve()
を利用して求めることができる
solve(A,B) # AX=B の解Xを求める solve(A) # 逆行列 (Bが単位行列の場合省略できる)
ベクトル \(\boldsymbol{a}\) ,行列 \(A\) に関数 \(\sin\) を適用
sin(a) # 成分ごとに計算される.sin(a)[i]=sin(a[i])
sin(A) # 成分ごとに計算される.sin(A)[i,j]=sin(A[i,j])
適当な3次正方行列 \(A\) と3次元ベクトル \(\boldsymbol{b}\) を作成して \(\boldsymbol{x}\) に関する連立1次方程式
を解け
## 行列とベクトルを作成 (好きに設定してよい) ## rnorm(9) は正規乱数を9つ作成する(第5回で詳しく説明) (A <- matrix(rnorm(9),3,3)+diag(rep(1,3))) (b <- 1:3)
[,1] [,2] [,3] [1,] 0.9259176 0.4112264 1.0078438 [2,] -0.7882785 2.0553422 0.5155167 [3,] -0.8777801 0.7914346 0.8761933 [1] 1 2 3
## 解を計算 (x <- solve(A,b)) A%*%x # 結果の確認(b になるはず)
[1] -1.28469800 -0.07189792 2.20182011 [,1] [1,] 1 [2,] 2 [3,] 3
例題の \(A\) と \(\boldsymbol{b}\) を用いて
A %*% b + b %*% A
を計算するとエラーになるが,何故そうなるか理由を考えよ.
function()
を利用する半径 r から球の体積と表面積を求める関数
myfunc <- function(r){ V <- (4/3) * pi * r^3 # 球の体積 S <- 4 * pi * r^2 # 球の表面積 out <- c(V,S) # 返り値のベクトルを作る names(out) <- c("volume", "area") # 返り値の要素に名前を付ける return(out) # 値を返す } myfunc(1) # 実行
volume area 4.18879 12.56637
if
(条件分岐)for
(繰り返し・回数指定)while
(繰り返し・条件指定)if
文条件Aが 真 のときプログラムXを実行する
if(条件A) プログラムX
上記の if
文に条件Aが 偽 のときプログラムYを実行することを追加する
if(条件A) プログラムX else プログラムY
if
文の例20200724が19で割り切れるか?
if(20200724 %% 19 == 0) {# %% は余りを計算 print("割り切れます") print(20200724 %/% 19) # 商を表示 } else { # {}で囲まれたブロックが1つのプログラム print("割り切れません") print(20200724 %% 19) # 余りを表示 }
[1] "割り切れます" [1] 1063196
for
文
ベクトル V
の要素を 順に 変数 i
に代入して
プログラムXを繰り返し実行する
for(i in V) プログラムX
i
によって実行内容が変わるfor
文の例アルファベットの20,15,11,25,15番目を表示
print(LETTERS) # LETTERS ベクトルの内容を表示 for(i in c(20,15,11,25,15)) { print(LETTERS[i]) # 順番に表示 }
[1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" [14] "N" "O" "P" "Q" "R" "S" "T" "U" "V" "W" "X" "Y" "Z" [1] "T" [1] "O" [1] "K" [1] "Y" [1] "O"
while
文条件Aが 真 である限りプログラムXを繰り返す
while(条件A) プログラムX
repeat
文というものもある)while
文の例20200809を素因数分解する
n <- 20200809 # 分解の対象 p <- 2 # 最初に調べる数 while(n != 1){ # 商が1になるまで計算する for(i in p:n){ # pからnまで順に調べる if(n%%i == 0) { # 余りが0か確認 print(i) # 割り切った数を表示 n <- n/i # 商を計算して分解の対象を更新 p <- i # 最初に調べる数を更新 break # for文を途中で終了 } } }
[1] 3 [1] 31 [1] 281 [1] 773
参考: ヘロンの公式 より
が成り立つ.
area <- function(x,y,z){ s <- (x+y+z)/2 S <- (s*(s-x)*(s-y)*(s-z))^(1/2) ## S <- sqrt(s*(s-x)*(s-y)*(s-z)) # 平方根を求める関数を用いても良い return(S) } area(3,4,5) # 直角三角形で検算 area(12,13,5)
[1] 6 [1] 30
整数 \(n\) の Fibonacci数を求める関数を作成せよ.
is.vector()
が利用できる)