2.2.2 矩阵
矩阵(matrix)是一个二维数组,只是每个元素都拥有相同的模式(数值型、字符型或逻辑型)。
函数:matrix(vector, nrow=number_of_rows, ncol=number_of_columns, byrow=logical_value, dimnames=list(char_vector_rownames, char_vector_colnames))
其中vector包含了矩阵的元素,nrow和ncol用以指定行和列的维数,dimnames包含了可选的、以字符型向量表示的行名和列名。选项byrow则表明矩阵应当按行填充(byrow=TRUE)还是按列填充(byrow=FALSE),默认情况下按列填充。10
1.创建矩阵
b <- matrix(1:9, 3, 3) # 1到9构建矩阵b,3行,3列。
b # 显示矩阵b。
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
b1 <- matrix(c("one", "two", "three", "four", "five", "six", "seven", "eight", "nine"), 3, 3) # 字符型矩阵。
b1 # 显示矩阵b1。
[,1] [,2] [,3]
[1,] "one" "four" "seven"
[2,] "two" "five" "eight"
[3,] "three" "six" "nine"
b[!upper.tri(b, diag = TRUE)] <- 0 # 构建上三角矩阵。
b # 显示结果。
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 0 5 8
[3,] 0 0 9
b1[!lower.tri(b1, diag = TRUE)] <- 0 # 构建下三角矩阵。
b1 # 显示结果。
[,1] [,2] [,3]
[1,] "one" "0" "0"
[2,] "two" "five" "0"
[3,] "three" "six" "nine"
2.查看矩阵
dim(b) # 显示矩阵维度。
[1] 3 3
nrow(b1) # 查看矩阵行维度。
[1] 3
ncol(b1) # 查看矩阵列维度。
[1] 3
diag(b1) # 返回矩阵的对角。
[1] "one" "five" "nine"
b1[2,1] # 返回矩阵第2行,第1列的元素。
[1] "two"
b1[2,3] = "eight" # 改变矩阵b1种第2行,第3列的元素为eight。
b1 # 显示结果。
[,1] [,2] [,3]
[1,] "one" "0" "0"
[2,] "two" "five" "eight"
[3,] "three" "six" "nine"
b1[upper.tri(b1)] = c("four", "seven", "eight") # 通过upper.tri()查询上三角并重新赋值。
b1 # 显示结果。
[,1] [,2] [,3]
[1,] "one" "four" "seven"
[2,] "two" "five" "eight"
[3,] "three" "six" "nine"
b1[lower.tri(b1)] = c("two", "two", "two") # 通过upper.tri()查询上三角并重新赋值。
b1 # 显示结果。
[,1] [,2] [,3]
[1,] "one" "four" "seven"
[2,] "two" "five" "eight"
[3,] "two" "two" "nine"
diag(b1) = c("one", "one", "one") # 通过diag()索引对角并重新赋值。
b1 # 显示结果。
[,1] [,2] [,3]
[1,] "one" "four" "seven"
[2,] "two" "one" "eight"
[3,] "two" "two" "one"
3.矩阵重命名行和列
colnames(b) <- c("a", "b", "c") # 给矩阵b的列重命名为a,b,c。
rownames(b) <- c("a", "b", "c") # 给矩阵b的行重命名为a,b,c。
b # 显示结果。
a b c
a 1 4 7
b 0 5 8
c 0 0 9
4.矩阵运算
b2 <- cbind(b, b1) # 合并矩阵b和b1。
b2 # 显示结果。
a b c
a "1" "4" "7" "one" "four" "seven"
b "0" "5" "8" "two" "one" "eight"
c "0" "0" "9" "two" "two" "one"
t(b2) # 矩阵转置。
a b c
a "1" "0" "0"
b "4" "5" "0"
c "7" "8" "9"
"one" "two" "two"
"four" "one" "two"
"seven" "eight" "one"
b+2 # 矩阵内各元素加2。
a b c
a 3 6 9
b 2 7 10
c 2 2 11
b*2 # 矩阵内各元素乘以2。
a b c
a 2 8 14
b 0 10 16
c 0 0 18
b+b # 矩阵相加
a b c
a 2 8 14
b 0 10 16
c 0 0 18
b-b # 矩阵相减。
a b c
a 0 0 0
b 0 0 0
c 0 0 0
b3 <- matrix(1:15, 3, 5) # 构建矩阵b3,1到15的数值,3行,5列。
b3 # 显示b3。
[,1] [,2] [,3] [,4] [,5]
[1,] 1 4 7 10 13
[2,] 2 5 8 11 14
[3,] 3 6 9 12 15
b4 <- matrix(1:18, 3, 6) # 构建矩阵b4,1到15的数值,3行,6列。
b4 # 显示b4。
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1 4 7 10 13 16
[2,] 2 5 8 11 14 17
[3,] 3 6 9 12 15 18
t(b3) %*% b4 # 矩阵b3乘以b4。
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 14 32 50 68 86 104
[2,] 32 77 122 167 212 257
[3,] 50 122 194 266 338 410
[4,] 68 167 266 365 464 563
[5,] 86 212 338 464 590 716
crossprod(b3, b4) # 用函数crossprod()进行矩阵相乘。
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 14 32 50 68 86 104
[2,] 32 77 122 167 212 257
[3,] 50 122 194 266 338 410
[4,] 68 167 266 365 464 563
[5,] 86 212 338 464 590 716
rowSums(b) # 矩阵的行之和。
a b c
12 13 9
rowMeans(b) # 矩阵行的平均值。
a b c
4.000000 4.333333 3.000000
colSums(b) # 矩阵的列之和。
a b c
1 9 24
colMeans(b) # 矩阵列平均值。
a b c
0.3333333 3.0000000 8.0000000
- 矩阵相乘规则:若A矩阵的维度为m
n,相乘时,那么B矩阵的维度应为n
p,生成的结果矩阵的维度为m
P。这里b3的维度是3
5,b4的维度是3
6,为符合规则,将b3进行转置,维度变为5
3,生成新的矩阵的维度为5
6。