R语言中使用矩阵(matrix)

创建矩阵

可以使用 matrix() 函数来创建一个矩阵。

1
2
3
# 创建一个3x3矩阵
mat <- matrix(1:9, nrow = 3)
print(mat)

输出:

1
2
3
4
     [,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9

矩阵的维度和结构

  • nrow(mat)ncol(mat) 分别获取矩阵的行数和列数。
  • dim(mat) 获取矩阵的维度。
  • str(mat) 查看矩阵的结构。

例子如下:

1
2
mat <- matrix(1:6, nrow = 3, ncol = 2)
print(mat)

输出:

1
2
3
4
     [,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6

查看这个矩阵的维度:

1
dim(mat)

输出:

1
[1] 3 2

查看矩阵的结构:

1
int [1:3, 1:2] 1 2 3 4 5 6

访问矩阵的元素

获取第二行第一列的元素:

1
2
3
4
5
6
7
> mat <- matrix(1:6, nrow = 3, ncol = 2)
> mat
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6

输出:

1
2
> mat[2, 1]
[1] 2

注意这里的第一行不像是其他编程语言从0开始。

还可以选择某一行的所有元素(默认情况下,会将这些看作一个向量):

1
2
3
4
> mat[3,]
[1] 3 6
> mat[2,]
[1] 2 5

或者是选择某一列的所有元素:

1
2
3
4
> mat[,1]
[1] 1 2 3
> mat[,2]
[1] 4 5 6

或者是选择除了某一行的所有元素,例如下面就是选择除了第一行的所有元素,返回的是一个矩阵。

1
2
3
4
> mat[-1,]
[,1] [,2]
[1,] 2 5
[2,] 3 6

上面的选择元素,都是将某一行或者某一列所有的元素,看成一个向量,而不是一个矩阵。通过 dim() 可以查看到维度不存在(NULL),这说明 x 是一个向量。

1
2
3
4
5
6
> A <- matrix(1:6, nrow=3)
> A[,2]
[1] 4 5 6
> x <- A[,2]
> dim(x)
NULL

保持矩阵结构

先来看一个例子:

1
2
3
4
5
6
> A <- matrix(1:6, nrow=3)
> x2 <- A[, 2]
> x2
[1] 4 5 6
> dim(x2)
NULL

上面的 x2 不是一个矩阵。

如果我们希望保留矩阵的结构,则需要用 drop

1
2
3
> x2 <- A[, 2, drop=FALSE]
> dim(x2)
[1] 3 1

使用了 drop=FALSE 之后,x2 仍然是一个矩阵。

矩阵的运算

1
2
mat1 <- matrix(1:4, nrow = 2)
mat2 <- matrix(5:8, nrow = 2)

先打印出来矩阵

1
2
3
4
5
6
7
8
9
> print(mat1)
[,1] [,2]
[1,] 1 3
[2,] 2 4

> print(mat2)
[,1] [,2]
[1,] 5 7
[2,] 6 8
1
2
3
4
5
# 矩阵相加
> print(mat1 + mat2)
[,1] [,2]
[1,] 6 10
[2,] 8 12
1
2
3
4
5
# 矩阵乘法(内积)
> print(mat1 %*% mat2)
[,1] [,2]
[1,] 23 31
[2,] 34 46

应用在矩阵上的函数

例子如下:

1
2
mat <- matrix(1:6, nrow = 3, ncol = 2)
print(mat)

输出:

1
2
3
4
     [,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
1
2
3
# 计算每列的总和
> colSums(mat)
[1] 6 15
1
2
3
# 计算每行的平均值
> rowMeans(mat)
[1] 2.5 3.5 4.5

此外还有一些常用的

diag()

diag() 函数在处理矩阵时有两个主要用途:

  • 当它的参数是一个矩阵时,它会返回矩阵的对角线元素组成的向量。
  • 当它的参数是一个数值或向量时,它会返回一个以该数值或向量为对角线的对角矩阵。

举一个参数为矩阵的例子:

1
2
3
> B <- matrix(1:9, nrow=3)
> diag(B)
[1] 1 5 9

参数为数值:

1
2
3
4
5
6
7
> diag(5)
[,1] [,2] [,3] [,4] [,5]
[1,] 1 0 0 0 0
[2,] 0 1 0 0 0
[3,] 0 0 1 0 0
[4,] 0 0 0 1 0
[5,] 0 0 0 0 1

参数为向量的例子:

1
2
3
4
5
6
7
> B <- c(1,2,3,4)
> diag(B)
[,1] [,2] [,3] [,4]
[1,] 1 0 0 0
[2,] 0 2 0 0
[3,] 0 0 3 0
[4,] 0 0 0 4

det()

det() 函数计算给定矩阵的行列式。

行列式是一个可以从方阵(即行数和列数相同的矩阵)中得到的数值,它在线性代数中具有多种重要的应用,如判断矩阵是否可逆、求解线性方程组等。

1
2
3
4
5
6
7
> B <- matrix(c(1,2,3,4), nrow=2)
> B
[,1] [,2]
[1,] 1 3
[2,] 2 4
> det(B)
[1] -2

solve()

此函数可求解 x 的方程 a %*% x = b,其中 b 可以是向量或矩阵。换言之,就是求逆矩阵。

1
2
3
4
5
> B <- matrix(c(1,2,3,4), nrow=2)
> solve(B)
[,1] [,2]
[1,] -2 1.5
[2,] 1 -0.5

dim()

用于获取或设置指定矩阵、数组或 DataFrame 的维数。

1
2
3
> B <- matrix(c(1,2,3,4), nrow=2)
> dim(B)
[1] 2 2

绑定矩阵

还是用上面的例子:

1
2
3
4
5
6
7
8
9
10
11
12
mat1 <- matrix(1:6, nrow = 3)
mat2 <- matrix(6:11, nrow = 3)
> print(mat1)
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
> print(mat2)
[,1] [,2]
[1,] 6 9
[2,] 7 10
[3,] 8 11
1
2
3
4
5
6
7
8
9
# 将两个矩阵按行绑定
> rbind(mat1, mat2)
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
[4,] 6 9
[5,] 7 10
[6,] 8 11
1
2
3
4
5
6
# 将两个矩阵按列绑定
> cbind(mat1, mat2)
[,1] [,2] [,3] [,4]
[1,] 1 4 6 9
[2,] 2 5 7 10
[3,] 3 6 8 11

转置矩阵

例子如下:

1
2
3
4
5
6
> mat <- matrix(1:6, nrow = 3, ncol = 2)
> print(mat)
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6

使用 t() 函数来转置矩阵。

1
2
3
4
> t(mat)
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6