本文我们介绍使用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
本文参考链接:https://blog.csdn.net/neweastsun/article/details/122123795