矩陣
利用 matrix 建立矩陣
當陣列是 2 維的狀況就是所謂的矩陣,可以利用 matix 產生矩陣,也可以用之前產生陣列的方法實作。
> matrix(c(1:4), nrow = 2, ncol = 2) # 預設是按照 column 填入資料
[,1] [,2]
[1,] 1 3
[2,] 2 4
> matrix(c(1:4), nrow = 2, ncol = 2, byrow = TRUE) # 可以更改成按照 row 填入資料
[,1] [,2]
[1,] 1 2
[2,] 3 4
透過指標提取資料
矩陣跟陣列一樣,還是可以透過指標選取矩陣的部份元素。
> x <- c(1, 2, 3)
> y <- c(4, 5, 6)
> z = rbind(x, y)
> z
[,1] [,2] [,3]
x 1 2 3
y 4 5 6
> z[,1] # 選取第一行(column、直)
x y
1 4
> z[1,] # 選取第一列(row、橫)
[1] 1 2 3
> z[1,1:2] # 選取第一列第一到二行
[1] 1 2
基本相關函數
- t(x):將矩陣轉置。
- %*%:矩陣相乘。
- diag:產生一個對角矩陣,或回傳矩陣的對角線向量
- det:計算矩陣行列式值,一定是要對稱矩陣。
- solve:傳回矩陣的反矩陣,非常適合解線性方程式。
- eigen:計算矩陣的特徵向量與特徵值。
- rownames:修改或查詢 row 名稱。
- colnames:修改或查詢 column 名稱。
> x <- c(1, 2, 3)
> y <- c(4, 5, 6)
> z <- rbind(x, y)
[,1] [,2] [,3]
x 1 2 3
y 4 5 6
> t(z)
x y
[1,] 1 4
[2,] 2 5
[3,] 3 6
> z %*% z # 矩陣相乘要符合前者 column 維度 = 後者 row 維度,如果沒有會發生錯誤!
錯誤在z %*% z : 非調和引數
> v <- z %*% t(z)
x y
x 14 32
y 32 77
> w <- diag(c(1,2,3)) # 傳入向量回傳一個對角矩陣
[,1] [,2] [,3]
[1,] 1 0 0
[2,] 0 2 0
[3,] 0 0 3
> diag(w) # 傳入矩陣回傳矩陣對角線向量
[1] 1 2 3
> det(v) #一定要對稱矩陣才可以計算。
[1] 54
> solve(v)
x y
x 1.4259259 -0.5925926
y -0.5925926 0.2592593
> b = c(1,1) 解 Ax = b,求出 x 向量 A:變數 v,b:變數 b
> solve(v,b)
x y
0.8333333 -0.3333333
> u = matrix(1:9, nrow = 3, ncol = 3)
> u
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
> eigen(u) # 特徵值
$values
[1] 1.611684e+01 -1.116844e+00 -5.700691e-16
$vectors # 特徵向量
[,1] [,2] [,3]
[1,] -0.4645473 -0.8829060 0.4082483
[2,] -0.5707955 -0.2395204 -0.8164966
[3,] -0.6770438 0.4038651 0.4082483
> rownames(z) # 還沒修改的時候,是 x 與 y,因為當初是利用兩個向量,利用 rbind 組成,所以會利用向量的變數稱名當作 row 名稱。
[1] "x" "y"
> rownames(z) <- c("第一行", "第二行")
> rownames(z)
[1] "第一行" "第二行"
> colnames(z)
NULL
> colnames(z) <- c("第一列", "第二列", "第三列")
> colnames(z)
[1] "第一列" "第二列" "第三列"
> z
第一列 第二列 第三列
第一行 1 2 3
第二行 4 5 6