本文我们介绍使用R语言实现矩阵的常见运算。包括矩阵加减以及乘法运算、矩阵转置、逆矩阵、行列式、特征值和特征向量等计算。

矩阵的加减

加减是矩阵的最基本操作,下面定义示例矩阵,为后面所有示例使用。

# 示例方阵
A <- matrix(c(10, 8,
              5, 12), ncol = 2, byrow = TRUE)
A
#      [,1] [,2]
# [1,]   10    8
# [2,]    5   12

B <- matrix(c(5, 3,
              15, 6), ncol = 2, byrow = TRUE)
B
#      [,1] [,2]
# [1,]    5    3
# [2,]   15    6

dim(A) # 2 2
dim(B) # 2 2

# 计算矩阵相加
A + B
#      [,1] [,2]
# [1,]   15   11
# [2,]   20   18

# 计算矩阵相减
A - B
#      [,1] [,2]
# [1,]    5    5
# [2,]  -10    6

A、B两个矩阵维度相同,可以使用dim函数检查矩阵的维度(行和列数),我们看到加减非常简单,当然两个矩阵维度要一致。

矩阵转置

R 提供了t函数实现矩阵转置:

t(A)
#      [,1] [,2]
# [1,]   10    5
# [2,]    8   12

t(B)
#      [,1] [,2]
# [1,]    5   15
# [2,]    3    6

矩阵乘法

有多种不同类型的矩阵乘法:和标量乘,逐个元素相乘,矩阵相乘,外积和内积。

和标量乘

矩阵与标量乘除,分别使用 “*” 、"/" 符号:

2 * A
#      [,1] [,2]
# [1,]   20   16
# [2,]   10   24

A / 2
#      [,1] [,2]
# [1,]  5.0    4
# [2,]  2.5    6

逐个元素相乘

两个矩阵逐个元素相乘,需要两个矩阵有相同的维度,直接使用 “*” 符号,输出矩阵的维度与原矩阵一致:

A * B
#      [,1] [,2]
# [1,]   50   24
# [2,]   75   72

矩阵乘法

R 中矩阵乘法使用 “%*%” 符号:

A %*% B

#      [,1] [,2]
# [1,]  170   78
# [2,]  205   87

矩阵相乘需要维度兼容,即第一个矩阵的列数必须要等于第二个矩阵的行数。

矩阵的行列式

矩阵A的行列式一般记作∣A∣,它是代表矩阵特定属性的标量值.在R中使用det函数计算。

det(A)
# 80

det(B)
# -15

逆矩阵

我们可以使用solve函数求矩阵的逆矩阵。矩阵乘以其对应的逆矩阵,结果为单位阵。solve 也可以计算矩阵方程,A %*% X = B,利用该函数可以计算X对应的矩阵:

M <- solve(A)

M
#         [,1]   [,2]
# [1,]  0.1500 -0.100
# [2,] -0.0625  0.125

## 验证矩阵乘以其逆矩阵
A %*% M
#      [,1] [,2]
# [1,]    1    0
# [2,]    0    1

# 解矩阵方程
solve(A, B)
#         [,1]    [,2]
# [1,] -0.7500 -0.1500
# [2,]  1.5625  0.5625

求矩阵的秩

矩阵秩是线性无关的最大列(行)数。R没有内置函数实现,但可以利用qr函数计算QR分解,返回输入矩阵的秩。另外可以使用Matrix包中的rankMatrix函数:

qr(A)$rank #2
qr(B)$rank #2

# Equivalent to:
library(Matrix)
rankMatrix(A)[1] # 2

对角矩阵

diag 函数可以抽取或修改矩阵对角线:

diag(A) # 10 12 
diag(B) # 5 6

# 修改主对角线的元素
# diag(A) <- c(0, 2)

使用rev 函数对矩阵的列则可以抽取矩阵的次对角线:

# 抽取矩阵的次对角线
diag(apply(A, 2, rev)) # 5 8
diag(apply(B, 2, rev)) # 15  3

通过diag函数还可以创建矩阵,通过向量类型参数指定对角线的值:

diag(c(7, 9, 2))

#      [,1] [,2] [,3]
# [1,]    7    0    0
# [2,]    0    9    0
# [3,]    0    0    2

我们还可以通过diag函数创建单位阵:

diag(4)

#      [,1] [,2] [,3] [,4]
# [1,]    1    0    0    0
# [2,]    0    1    0    0
# [3,]    0    0    1    0
# [4,]    0    0    0    1

特征值和特征向量

R 中提供eigen函数可以计算特征值和特征向量。特征值在返回值列表中values元素中,且按降序排列:

eigen(A)$values # 17.403124  4.596876
eigen(B)$values # 12.226812 -1.226812

特征向量在vectors元素中:

eigen(A)$vectors

#            [,1]       [,2]
# [1,] -0.7339565 -0.8286986
# [2,] -0.6791964  0.5596952

eigen(B)$vectors
#            [,1]       [,2]
# [1,] -0.3833985 -0.4340394
# [2,] -0.9235830  0.9008939
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐