第六次课-矩阵

黄利东

15/04/2021

矩阵

-矩阵是一个二维数组,只是每个元素都拥有相同的模式(数值型、字符型或逻辑型)。可通 过函数matrix()创建矩阵

-matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE,dimnames = NULL)

参数说明:

-data 向量,矩阵的数据

-nrow 行数

-ncol 列数

-byrow 逻辑值,为 FALSE 按列排列,为 TRUE 按行排列

-dimname 设置行和列的名称

> matrix(1:20, nrow=5, ncol=4)
##      [,1] [,2] [,3] [,4]
## [1,]    1    6   11   16
## [2,]    2    7   12   17
## [3,]    3    8   13   18
## [4,]    4    9   14   19
## [5,]    5   10   15   20
> matrix(1:20, nrow=5, ncol=4,byrow = T)
##      [,1] [,2] [,3] [,4]
## [1,]    1    2    3    4
## [2,]    5    6    7    8
## [3,]    9   10   11   12
## [4,]   13   14   15   16
## [5,]   17   18   19   20

矩阵索引-元素位置索引

-矩阵的索引从行列两个方向入手,见下面的例子

> y <- matrix(1:20, nrow=5, ncol=4)#矩阵存储在y中
> y[2,]#索引亦然是用方括号,二维矩阵的索引在方括号中用逗号隔开,逗号左边是行,右边是列
## [1]  2  7 12 17
> y[,2]#能猜到这是哪一部分么?
## [1]  6  7  8  9 10
> y[2,2]#行列对应单元数据
## [1] 7
> z <-y[2,]#上面的代码相当于先拿出第2行,再选出第2个元素
> z[2]
## [1] 7
> y[c(1,2),c(2,3)]#多重选择 
##      [,1] [,2]
## [1,]    6   11
## [2,]    7   12
> y[-1,]#不选第一行
##      [,1] [,2] [,3] [,4]
## [1,]    2    7   12   17
## [2,]    3    8   13   18
## [3,]    4    9   14   19
## [4,]    5   10   15   20

矩阵其他索引方式

-逻辑索引

-向量化索引/按列从上到下,从左到右

> y <- matrix(11:30, nrow=5, ncol=4)
> y
##      [,1] [,2] [,3] [,4]
## [1,]   11   16   21   26
## [2,]   12   17   22   27
## [3,]   13   18   23   28
## [4,]   14   19   24   29
## [5,]   15   20   25   30
> y[T,c(F,T)]#思考为什么啊
##      [,1] [,2]
## [1,]   16   26
## [2,]   17   27
## [3,]   18   28
## [4,]   19   29
## [5,]   20   30
> y[1:5]
## [1] 11 12 13 14 15

矩阵运算1

-A + B是矩阵加法, A - B是矩阵减法

-A %*% B是矩阵乘法。

-x*A若x是标量,A是矩阵,作矩阵数乘。

-如果x是向量,A是矩阵, 则x %*% A表示行向量x左乘矩阵A,

-A%*%x表示列向量x右乘矩阵A。

> set.seed(110)
> A <- matrix(rnorm(12), nrow=3, ncol=4)
> A
##           [,1]      [,2]        [,3]      [,4]
## [1,] 0.2911952 1.4778760 -0.04460784 0.2256401
## [2,] 1.3888632 0.4387201  1.48441337 1.4199606
## [3,] 0.6490100 0.5223182 -1.59101108 0.9697612
> B <- matrix(rnorm(12,-1,2), 3)#注意生成方式的区别
> B
##           [,1]       [,2]       [,3]       [,4]
## [1,]  2.808512 -0.5875462  2.1154084 -4.0074773
## [2,] -2.400824 -4.0926231 -4.9218862  0.6770989
## [3,]  2.556057  0.2923954 -0.2222837 -2.6654285
> A+B
##           [,1]       [,2]      [,3]      [,4]
## [1,]  3.099707  0.8903298  2.070801 -3.781837
## [2,] -1.011961 -3.6539030 -3.437473  2.097060
## [3,]  3.205067  0.8147136 -1.813295 -1.695667
> A-B
##           [,1]      [,2]      [,3]      [,4]
## [1,] -2.517317 2.0654221 -2.160016 4.2331174
## [2,]  3.789687 4.5313433  6.406300 0.7428617
## [3,] -1.907047 0.2299227 -1.368727 3.6351897
> A*B
##            [,1]       [,2]        [,3]       [,4]
## [1,]  0.8178254 -0.8683204 -0.09436379 -0.9042476
## [2,] -3.3344159 -1.7955161 -7.30611374  0.9614538
## [3,]  1.6589066  0.1527234  0.35365578 -2.5848292
> #A %*% B,出错误,为什么?
> A %*% t(B)#t()是矩阵转置的意思
##           [,1]       [,2]       [,3]
## [1,] -1.049106  -6.375162  0.5849238
## [2,]  1.092552 -11.474592 -0.4364713
## [3,] -5.736068   4.791590 -0.4195434
> 2*A
##           [,1]      [,2]        [,3]      [,4]
## [1,] 0.5823905 2.9557519 -0.08921567 0.4512802
## [2,] 2.7777263 0.8774402  2.96882675 2.8399212
## [3,] 1.2980201 1.0446363 -3.18202216 1.9395224

矩阵运算2

> set.seed(110)
> C <- matrix(rnorm(16), nrow=4, ncol=4)
> D <- round(C)#四舍五入
> D
##      [,1] [,2] [,3] [,4]
## [1,]    0    0   -2    2
## [2,]    1    1    0   -1
## [3,]    1    0    1    2
## [4,]    1    1    1    0
> det(D)
## [1] 4
> E <- solve(D)
> D%*%E
##      [,1] [,2] [,3] [,4]
## [1,]    1    0    0    0
## [2,]    0    1    0    0
## [3,]    0    0    1    0
## [4,]    0    0    0    1
> E%*%D
##      [,1] [,2] [,3] [,4]
## [1,]    1    0    0    0
## [2,]    0    1    0    0
## [3,]    0    0    1    0
## [4,]    0    0    0    1
> G <- 1:4# F不用是因为F代表FALSE
> solve(D,G)
## [1] -0.25  3.50  0.75  1.25

矩阵操作

> set.seed(110)
> C <- matrix(rnorm(16), nrow=4, ncol=4)
> D <- round(C)#四舍五入
> diag(D)
## [1] 0 1 1 0
> eigen(D)
## eigen() decomposition
## $values
## [1]  1.7429256+1.0941392i  1.7429256-1.0941392i -0.7429256+0.6265678i
## [4] -0.7429256-0.6265678i
## 
## $vectors
##                       [,1]                  [,2]                  [,3]
## [1,] -0.1820599+0.3539865i -0.1820599-0.3539865i -0.7440716+0.0000000i
## [2,] -0.1365193+0.3963668i -0.1365193-0.3963668i  0.5523637+0.1391179i
## [3,]  0.7053579+0.0000000i  0.7053579+0.0000000i  0.0294291+0.1294845i
## [4,]  0.3530442+0.2088866i  0.3530442-0.2088866i  0.3058240-0.1036212i
##                       [,4]
## [1,] -0.7440716+0.0000000i
## [2,]  0.5523637-0.1391179i
## [3,]  0.0294291-0.1294845i
## [4,]  0.3058240+0.1036212i
> dim(D)
## [1] 4 4
> nrow(D)
## [1] 4
> ncol(D)
## [1] 4
> colnames(D) <- LETTERS[1:4]
> rownames(D) <- letters[1:4]
> D
##   A B  C  D
## a 0 0 -2  2
## b 1 1  0 -1
## c 1 0  1  2
## d 1 1  1  0