R矩阵运算

用过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

你可能感兴趣的:(R矩阵运算)