用過Matlab的同學(xué)轉(zhuǎn)用R會覺得R的矩陣運(yùn)算真的有點(diǎn)蛋疼,但是學(xué)了統(tǒng)計(jì)酿傍,一直不用R也不是回事烙懦,所以索性放下Matlab,了解并使用一下R的矩陣運(yùn)算赤炒。
創(chuàng)建一個(gè)向量
x = c(1:12)
x
## [1] 1 2 3 4 5 6 7 8 9 10 11 12
創(chuàng)建一個(gè)矩陣
R中的矩陣輸入是內(nèi)容和格式分開的氯析,不像matlab直接可以輸入,需要把向量變?yōu)榫仃嚒?/p>
A = matrix(x, nrow = 3, ncol = 4, byrow = T, dimnames = NULL) #注意R中輸入的矩陣默認(rèn)是先排列莺褒,后排行掩缓,與matlab不同。
A
## [,1] [,2] [,3] [,4]
## [1,] 1 2 3 4
## [2,] 5 6 7 8
## [3,] 9 10 11 12
args(matrix)
## function (data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL)
## NULL
data 項(xiàng)為必要的矩陣元素遵岩,nrow 為行數(shù)你辣,ncol 為列數(shù),注意 nrow 與 ncol 的乘積應(yīng)為矩陣元素個(gè)數(shù)尘执,byrow 項(xiàng)控制排列元素時(shí)是否按行進(jìn)行舍哄,dimnames 給定行和列的名稱。
矩陣轉(zhuǎn)置
t(A)
## [,1] [,2] [,3]
## [1,] 1 5 9
## [2,] 2 6 10
## [3,] 3 7 11
## [4,] 4 8 12
矩陣加減和數(shù)乘
使用“+”誊锭、“-”表悬、“*”,如:
A = B = matrix(1:12, nrow = 3, ncol = 4)
A + B
## [,1] [,2] [,3] [,4]
## [1,] 2 8 14 20
## [2,] 4 10 16 22
## [3,] 6 12 18 24
A - B
## [,1] [,2] [,3] [,4]
## [1,] 0 0 0 0
## [2,] 0 0 0 0
## [3,] 0 0 0 0
2 * A
## [,1] [,2] [,3] [,4]
## [1,] 2 8 14 20
## [2,] 4 10 16 22
## [3,] 6 12 18 24
矩陣乘法
使用“%*%”
A = matrix(1:12, nrow = 3, ncol = 4)
B = matrix(1:12, nrow = 4, ncol = 3)
A %*% B #真不知道怎么發(fā)明的這個(gè)符號……
## [,1] [,2] [,3]
## [1,] 70 158 246
## [2,] 80 184 288
## [3,] 90 210 330
A = B = matrix(1:12, nrow = 4, ncol = 3)
crossprod(A, B) #得到A'B丧靡,效率更高
## [,1] [,2] [,3]
## [1,] 30 70 110
## [2,] 70 174 278
## [3,] 110 278 446
矩陣對角元素相關(guān)運(yùn)算
A = matrix(1:16, nrow = 4, ncol = 4)
diag(A) #對一個(gè)矩陣應(yīng)用diag()函數(shù)將產(chǎn)生主對角線向量
## [1] 1 6 11 16
diag(diag(A)) #對一個(gè)向量應(yīng)用 diag()函數(shù)將產(chǎn)生以這個(gè)向量為對角元素的對角矩陣
## [,1] [,2] [,3] [,4]
## [1,] 1 0 0 0
## [2,] 0 6 0 0
## [3,] 0 0 11 0
## [4,] 0 0 0 16
diag(3) #對一個(gè)正整數(shù) z 應(yīng)用 diag()函數(shù)將產(chǎn)生以 z 維單位矩陣
## [,1] [,2] [,3]
## [1,] 1 0 0
## [2,] 0 1 0
## [3,] 0 0 1
矩陣求逆
矩陣求逆可用函數(shù) solve()蟆沫,應(yīng)用 solve(a, b)運(yùn)算結(jié)果是解線性方程組 ax = b籽暇,若 b 缺省,則系統(tǒng)默認(rèn)為單位矩陣饭庞,因此可用其進(jìn)行矩陣求逆戒悠。
a = matrix(rnorm(16), 4, 4)
a
## [,1] [,2] [,3] [,4]
## [1,] 1.3724 0.2891 -0.88780 -1.090857
## [2,] -0.4679 0.6059 -1.91791 1.223136
## [3,] 0.1232 0.1639 0.06772 0.005791
## [4,] 1.8251 -0.6050 1.18867 -1.110864
solve(a)
## [,1] [,2] [,3] [,4]
## [1,] -0.1268 0.5369 0.8980 0.72034
## [2,] 0.2643 -0.3279 4.6452 -0.59628
## [3,] -0.3471 -0.2506 1.8130 0.07441
## [4,] -0.7237 0.7925 0.8852 0.68764
矩陣的特征值與特征向量
矩陣 A 的譜分解為 A=UΛU',其中 Λ 是由 A 的特征值組成的對角矩陣,U 的列為 A 的特征值對應(yīng)的特征向量但绕,在 R 中可以用函數(shù) eigen()函數(shù)得到 U 和 Λ救崔。
args(eigen)
## function (x, symmetric, only.values = FALSE, EISPACK = FALSE)
## NULL
其中:x 為矩陣,symmetric 項(xiàng)指定矩陣 x 是否為對稱矩陣捏顺,若不指定六孵,系統(tǒng)將自動檢測 x 是否為對稱矩陣。
A = diag(4) + 1
A
## [,1] [,2] [,3] [,4]
## [1,] 2 1 1 1
## [2,] 1 2 1 1
## [3,] 1 1 2 1
## [4,] 1 1 1 2
A.eigen = eigen(A, symmetric = T)
A.eigen #$vectors為特征值幅骄,$values為特征向量
## $values
## [1] 5 1 1 1
##
## $vectors
## [,1] [,2] [,3] [,4]
## [1,] -0.5 0.8660 0.0000 0.0000
## [2,] -0.5 -0.2887 -0.5774 -0.5774
## [3,] -0.5 -0.2887 -0.2113 0.7887
## [4,] -0.5 -0.2887 0.7887 -0.2113
A.eigen$vectors %*% diag(A.eigen$values) %*% t(A.eigen$vectors)
## [,1] [,2] [,3] [,4]
## [1,] 2 1 1 1
## [2,] 1 2 1 1
## [3,] 1 1 2 1
## [4,] 1 1 1 2
t(A.eigen$vectors) %*% A.eigen$vectors
## [,1] [,2] [,3] [,4]
## [1,] 1.000e+00 -5.551e-17 -1.110e-16 -9.714e-17
## [2,] -5.551e-17 1.000e+00 -5.551e-17 -5.551e-17
## [3,] -1.110e-16 -5.551e-17 1.000e+00 0.000e+00
## [4,] -9.714e-17 -5.551e-17 0.000e+00 1.000e+00
矩陣的維數(shù)
函數(shù)dim()將返回一個(gè)矩陣的維數(shù)劫窒,nrow()返回行數(shù),ncol()返回列數(shù)
A = matrix(1:12, 3, 4)
A
## [,1] [,2] [,3] [,4]
## [1,] 1 4 7 10
## [2,] 2 5 8 11
## [3,] 3 6 9 12
nrow(A) #行數(shù)
## [1] 3
ncol(A) #列數(shù)
## [1] 4
dim(A) #w維數(shù)
## [1] 3 4
矩陣的行和拆座、列和主巍、行平均與列平均
A
## [,1] [,2] [,3] [,4]
## [1,] 1 4 7 10
## [2,] 2 5 8 11
## [3,] 3 6 9 12
rowSums(A) #行和
## [1] 22 26 30
rowMeans(A) #列和
## [1] 5.5 6.5 7.5
colSums(A) #行平均
## [1] 6 15 24 33
colMeans(A) #列平均
## [1] 2 5 8 11
取矩陣的上、下三角部分
函數(shù)lower.tri()和函數(shù)upper.tri()可以很方便的取到一個(gè)矩陣的上挪凑、下三角部分的元素
args(lower.tri) #函數(shù)將返回一個(gè)邏輯值矩陣孕索,其中下三角部分為真,上三角部分為假躏碳,選項(xiàng)diag為真時(shí)包含對角元素搞旭,為假時(shí)不包含對角元素。upper.tri()的效果與之孑然相反菇绵。
## function (x, diag = FALSE)
## NULL
A
## [,1] [,2] [,3] [,4]
## [1,] 1 4 7 10
## [2,] 2 5 8 11
## [3,] 3 6 9 12
lower.tri(A)
## [,1] [,2] [,3] [,4]
## [1,] FALSE FALSE FALSE FALSE
## [2,] TRUE FALSE FALSE FALSE
## [3,] TRUE TRUE FALSE FALSE
lower.tri(A, diag = T)
## [,1] [,2] [,3] [,4]
## [1,] TRUE FALSE FALSE FALSE
## [2,] TRUE TRUE FALSE FALSE
## [3,] TRUE TRUE TRUE FALSE
A[lower.tri(A)] = 0 #上三角元素
A
## [,1] [,2] [,3] [,4]
## [1,] 1 4 7 10
## [2,] 0 5 8 11
## [3,] 0 0 9 12
A = matrix(1:12, 3, 4)
upper.tri(A)
## [,1] [,2] [,3] [,4]
## [1,] FALSE TRUE TRUE TRUE
## [2,] FALSE FALSE TRUE TRUE
## [3,] FALSE FALSE FALSE TRUE
upper.tri(A, diag = T)
## [,1] [,2] [,3] [,4]
## [1,] TRUE TRUE TRUE TRUE
## [2,] FALSE TRUE TRUE TRUE
## [3,] FALSE FALSE TRUE TRUE
A[upper.tri(A)] = 0 #下三角元素
A
## [,1] [,2] [,3] [,4]
## [1,] 1 0 0 0
## [2,] 2 5 0 0
## [3,] 3 6 9 0
行列式的值
在R中肄渗,函數(shù)det(x)將計(jì)算方陣x的行列式的值
x = matrix(rnorm(16), 4, 4)
x
## [,1] [,2] [,3] [,4]
## [1,] -0.6702 -0.373644 -0.49882 0.6437
## [2,] -0.1772 0.197085 1.33065 1.2033
## [3,] 0.9153 1.679349 -0.06697 0.4548
## [4,] -1.0058 -0.009947 0.90347 0.2930
det(x)
## [1] -2.777