R 语言编程结构

魔法师LQ

矩阵是特殊的向量,有行和列属性。

数组是多维的,而矩阵是两维的。

所以“黑客帝国(Matrix)”应该改叫”Array”。

向量强大在于向量化和取子集运算,矩阵强大在矩阵运算。

创建矩阵

1
2
3
4
5
6
> x <- matrix(nrow = 3, ncol = 3)
> x
[,1] [,2] [,3]
[1,] NA NA NA
[2,] NA NA NA
[3,] NA NA NA

默认创建NA矩阵。

1
2
3
4
5
6
7
8
9
10
11
12
u <- matrix(c(1, 2, 4, 2, 5, 0), nrow = 2, ncol = 3)
u
[,1] [,2] [,3]
[1,] 1 4 5
[2,] 2 2 0

v <- matrix(c(3, 2, 1, 4), nrow = 2)
v

[,1] [,2]
[1,] 3 1
[2,] 2 4

默认按列创建。

1
2
3
4
5
v <- matrix(1:4, nrow = 2, byrow = T)

[,1] [,2]
[1,] 1 2
[2,] 3 4

设置参数byrow=T,改为按照行创建。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
     [,1] [,2]
[1,] 1 2
[2,] 3 4

v[3]
[1] 2

v[1, 2]
[1] 2

v[1,]
[1] 1 2

v[,1]
[1] 1 3
  • 某个位置:v[i, j]v[k](按列第k个位置)
  • 某行:v[i,]
  • 某列:v[,j]

R中索引都是从1开始。

一般矩阵运算

矩阵线性代数运算

转置 t()

1
2
3
4
5
6
7
8
9
> u
[,1] [,2] [,3]
[1,] 1 4 5
[2,] 2 2 0
> t(u)
[,1] [,2]
[1,] 1 2
[2,] 4 2
[3,] 5 0

矩阵转成表

1
2
3
4
5
6
7
8
9
10
11
12
# 矩阵转换为表[1]
mat2tbl <- function(m){
nrow <- dim(m)[1]
ncol <- dim(m)[2]
row <- rep(1:nrow, ncol) # rep重复
col <- rep(1:ncol, each = nrow)
frame <- data.frame(row, col, value = as.numeric(m))
frame
}

m <- matrix(1:16, 4, byrow = T)
mat2tbl(m)
1
2
3
4
5
     [,1] [,2] [,3] [,4]
[1,] 1 2 3 4
[2,] 5 6 7 8
[3,] 9 10 11 12
[4,] 13 14 15 16

转换如下,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
   row col value
1 1 1 1
2 2 1 5
3 3 1 9
4 4 1 13
5 1 2 2
6 2 2 6
7 3 2 10
8 4 2 14
9 1 3 3
10 2 3 7
11 3 3 11
12 4 3 15
13 1 4 4
14 2 4 8
15 3 4 12
16 4 4 16

矩阵加减

直接加减号。

1
2
3
4
> u - u
[,1] [,2] [,3]
[1,] 0 0 0
[2,] 0 0 0

矩阵和标量运算

直接运算。

1
2
3
4
5
6
7
8
> u
[,1] [,2] [,3]
[1,] 1 4 5
[2,] 2 2 0
> u + 100
[,1] [,2] [,3]
[1,] 101 104 105
[2,] 102 102 100

矩阵相乘%*%

使用符号%*%

1
2
3
4
5
6
7
8
9
10
11
12
13
> u
[,1] [,2] [,3]
[1,] 1 4 5
[2,] 2 2 0
> v
[,1] [,2]
[1,] 1 2
[2,] 3 4
> t(u)%*%v
[,1] [,2]
[1,] 7 10
[2,] 10 16
[3,] 5 10

更多矩阵线性代数运算

见之后专题。

矩阵索引

类似于Python中的矩阵切片。

1
2
3
4
5
6
7
8
> u
[,1] [,2] [,3]
[1,] 1 4 5
[2,] 2 2 0
> u[, 2:3]
[,1] [,2]
[1,] 4 5
[2,] 2 0
1
2
3
4
> u[1:2, 2:3]
[,1] [,2]
[1,] 4 5
[2,] 2 0
1
2
> u[-1,]
[1] 2 2 0

并且可以对子矩阵进行赋值,

1
2
3
4
5
6
7
8
9
10
11
> x
[,1] [,2] [,3]
[1,] NA NA NA
[2,] NA NA NA
[3,] NA NA NA
> x[2:3, 1:2] <- v
> x
[,1] [,2] [,3]
[1,] NA NA NA
[2,] 1 2 NA
[3,] 3 4 NA

扩展案例:图像操作

待完善…

参考

[1] R语言常用的矩阵操作