矩阵是一个二维数组,只是(数值型、字符型或逻辑型)。可通过函数matrix创建矩阵。一般使用格式为:
matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE,dimnames = NULL)
-data
:包含了矩阵的元素;
-nrow
和ncol
:用以指定行和列的维数;
-byrow
:表明矩阵应当按行填充(byrow=TRUE)还是按列填充(byrow=FALSE),默认情况下按列填充
-dimnames
:包含了可选的、以字符型向量表示的行名和列名;
1.创建矩阵
创建1:16的矩阵,行为4行,先按行排列
> mat = matrix(1:16,nrow = 4,ncol = 4,byrow = TRUE)
> mat
[,1] [,2] [,3] [,4]
[1,] 1 2 3 4
[2,] 5 6 7 8
[3,] 9 10 11 12
[4,] 13 14 15 16
2. 查看矩阵维数并更改列名
dim(mat)
length(mat)
colnames(mat) = c('a','b','c','d')
rownames(mat) = c('e','f','g','h')
# 查看维度
> dim(mat)
[1] 4 4
# 查看元素总个数
> length(mat)
[1] 16
#更改列名
> colnames(mat) = c('a','b','c','d')
#更改行名
> rownames(mat) = c('e','f','g','h')
> mat
a b c d
e 1 2 3 4
f 5 6 7 8
g 9 10 11 12
h 13 14 15 16
> dim.name = dimnames(mat)
> dim.name
[[1]]
[1] "e" "f" "g" "h"
[[2]]
[1] "a" "b" "c" "d"
> dim.name[[1]]
[1] "e" "f" "g" "h"
3. 矩阵的取值
#取第一行,第三列元素
> mat[1,3]
[1] 3
#取第二行,所有列
> mat[2,]
a b c d
5 6 7 8
#取第三列到第四列,所有行
> mat[,3:4]
c d
e 3 4
f 7 8
g 11 12
h 15 16
#当取不相邻矩阵的行和列可以用c()创建向量
> mat[c(1,3),c(2,4)]
b d
e 2 4
g 10 12
# 除去第一行 和第二列不取,其他全取
> mat[-1,-2]
a c d
f 5 7 8
g 9 11 12
h 13 15 16
#也可以使用行名和列名来取
> mat['f','a']
[1] 5
4. 矩阵的运算-元素间运算
对矩阵的每个元素进行加减乘除,且顺序是按照列来算的。
#原始矩阵
> mat
a b c d
e 1 2 3 4
f 5 6 7 8
g 9 10 11 12
h 13 14 15 16
#每个元素乘以3
> mat*3
a b c d
e 3 6 9 12
f 15 18 21 24
g 27 30 33 36
h 39 42 45 48
#每一行均乘以1,2,3,4
> mat*c(1:4)
a b c d
e 1 2 3 4
f 10 12 14 16
g 27 30 33 36
h 52 56 60 64
#对矩阵运算不会改变原矩阵
> mat
a b c d
e 1 2 3 4
f 5 6 7 8
g 9 10 11 12
h 13 14 15 16
#如果需要保留矩阵运算之后的矩阵,需要额外命名
> mat1 = mat*c(1:4)
> mat1
a b c d
e 1 2 3 4
f 10 12 14 16
g 27 30 33 36
h 52 56 60 64
> mat*c(1:16) #按列进行对应元素相乘
a b c d
e 1 10 27 52
f 10 36 70 112
g 27 70 121 180
h 52 112 180 256
> mat + 5
a b c d
e 6 7 8 9
f 10 11 12 13
g 14 15 16 17
h 18 19 20 21
> mat/3
a b c d
e 0.3333333 0.6666667 1.000000 1.333333
f 1.6666667 2.0000000 2.333333 2.666667
g 3.0000000 3.3333333 3.666667 4.000000
h 4.3333333 4.6666667 5.000000 5.333333
> mat/c(1:3) #如果维度不对应,会有警告
a b c d
e 1.0 1 1.0 4
f 2.5 2 7.0 4
g 3.0 10 5.5 4
h 13.0 7 5.0 16
Warning message:
In mat/c(1:3) :
longer object length is not a multiple of shorter object length
5.矩阵运算-矩阵间运算
# 矩阵转置
> t(mat)
e f g h
a 1 5 9 13
b 2 6 10 14
c 3 7 11 15
d 4 8 12 16
# 矩阵与矩阵相乘
> mat%*%mat
a b c d
e 90 100 110 120
f 202 228 254 280
g 314 356 398 440
h 426 484 542 600
> mat%*%c(1:4)
[,1]
e 30
f 70
g 110
h 150
#求矩阵的行列式
> det(mat)
[1] 4.733165e-30
#求矩阵的对角线元素
> diag(mat)
[1] 1 6 11 16
#rnorm表示在R中生成标准正态分布(normolisation)的随机数
> mat2 = matrix(rnorm(16),nrow = 4)
> mat2
[,1] [,2] [,3] [,4]
[1,] 0.5741146 0.7455864 -0.2572695 -0.2411344
[2,] -0.5871949 -0.2625235 -0.1101282 0.7889012
[3,] 1.8245782 0.2449119 -0.6392340 -0.1252946
[4,] -0.2336952 0.2484867 -1.2900628 -0.3219892
#求逆
> mat3 = solve(mat2)
> mat3
[,1] [,2] [,3] [,4]
[1,] -0.1133153 -0.04712281 0.5378375 -0.2398813
[2,] 1.6648317 0.37849333 -0.4219256 -0.1552514
[3,] 0.2164346 -0.24894733 -0.2353717 -0.6804385
[4,] 0.4998786 1.32371081 0.2270614 -0.3251987
> mat2%*%mat3
[,1] [,2] [,3] [,4]
[1,] 1.000000e+00 0 -1.387779e-17 -2.775558e-17
[2,] -5.551115e-17 1 1.110223e-16 5.551115e-17
[3,] -1.387779e-17 0 1.000000e+00 0.000000e+00
[4,] 1.110223e-16 0 -1.387779e-17 1.000000e+00
#对行求均值
> rowMeans(mat)
e f g h
2.5 6.5 10.5 14.5
#对列求均值
> colMeans(mat)
a b c d
7 8 9 10
#对行求和
> rowSums(mat)
e f g h
10 26 42 58
#对列求和
> colSums(mat)
a b c d
28 32 36 40
参考:https://mp.weixin.qq.com/s?__biz=MzA4NDAzODkzMA==&mid=2651263668&idx=2&sn=7c39826f8fb73f95ca92efd0a7045ce5&chksm=841ef6c9b3697fdfa5b302de3608d348ce71417b254a1e6d87d202e851942da4bffbd8b9383d&scene=21#wechat_redirect