用过Matlab的同学转用R会觉得R的矩阵运算真的有点蛋疼,但是学了统计,一直不用R也不是回事,所以索性放下Matlab,了解并使用一下R的矩阵运算。
创建一个向量
x = c(1:12)
x
## [1] 1 2 3 4 5 6 7 8 9 10 11 12
创建一个矩阵
R中的矩阵输入是内容和格式分开的,不像matlab直接可以输入,需要把向量变为矩阵。
A = matrix(x, nrow = 3, ncol = 4, byrow = T, dimnames = NULL) #注意R中输入的矩阵默认是先排列,后排行,与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 项为必要的矩阵元素,nrow 为行数,ncol 为列数,注意 nrow 与 ncol 的乘积应为矩阵元素个数,byrow 项控制排列元素时是否按行进行,dimnames 给定行和列的名称。
矩阵转置
t(A)
## [,1] [,2] [,3]
## [1,] 1 5 9
## [2,] 2 6 10
## [3,] 3 7 11
## [4,] 4 8 12
矩阵加减和数乘
使用“+”、“-”、“*”,如:
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 #真不知道怎么发明的这个符号……
## [,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
矩阵对角元素相关运算
A = matrix(1:16, nrow = 4, ncol = 4)
diag(A) #对一个矩阵应用diag()函数将产生主对角线向量
## [1] 1 6 11 16
diag(diag(A)) #对一个向量应用 diag()函数将产生以这个向量为对角元素的对角矩阵
## [,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) #对一个正整数 z 应用 diag()函数将产生以 z 维单位矩阵
## [,1] [,2] [,3]
## [1,] 1 0 0
## [2,] 0 1 0
## [3,] 0 0 1
矩阵求逆
矩阵求逆可用函数 solve(),应用 solve(a, b)运算结果是解线性方程组 ax = b,若 b 缺省,则系统默认为单位矩阵,因此可用其进行矩阵求逆。
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 的特征值对应的特征向量,在 R 中可以用函数 eigen()函数得到 U 和 Λ。
args(eigen)
## function (x, symmetric, only.values = FALSE, EISPACK = FALSE)
## NULL
其中:x 为矩阵,symmetric 项指定矩阵 x 是否为对称矩阵,若不指定,系统将自动检测 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
矩阵的维数
函数dim()将返回一个矩阵的维数,nrow()返回行数,ncol()返回列数
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) #行数
## [1] 3
ncol(A) #列数
## [1] 4
dim(A) #w维数
## [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
取矩阵的上、下三角部分
函数lower.tri()和函数upper.tri()可以很方便的取到一个矩阵的上、下三角部分的元素
args(lower.tri) #函数将返回一个逻辑值矩阵,其中下三角部分为真,上三角部分为假,选项diag为真时包含对角元素,为假时不包含对角元素。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中,函数det(x)将计算方阵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