Skip to main content
 首页 » 编程设计

R语言矩阵相关计算函数汇总

2022年07月19日129zhoujg

本文我们介绍使用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
阅读延展