这篇博客将介绍有关矩阵的一些操作,主要包括矩阵的基本运算、转置、内积、行列式、对角元素操作、逆、提取矩阵的上下三角部分以及如何将矩阵转化为向量。
1. 矩阵的基本运算
1.1 矩阵间的四则运算
当矩阵的维度相同时,矩阵间的四则运算只不过是对应元素的运算,这一点跟向量的运算非常像。来看些例子:
> A <- matrix(1:4, ncol=2)
> B <- matrix(2:5, ncol=2)
> A
[,1] [,2]
[1,] 1 3
[2,] 2 4
> B
[,1] [,2]
[1,] 2 4
[2,] 3 5
> A + B ##两矩阵相加
[,1] [,2]
[1,] 3 7
[2,] 5 9
> A / B ##两矩阵相除
[,1] [,2]
[1,] 0.5000000 0.75
[2,] 0.6666667 0.80
1.2 矩阵与向量的四则运算
矩阵也可直接与向量进行四则运算,此时要求向量元素的个数不能超过矩阵元素的个数。当向量长度小于矩阵元素个数,向量会自动按列循环补齐至与矩阵相同,然后再运算。如果矩阵元素的个数不是向量元素的个数的整数倍,结果会附带警告信息。来看一些例子,比如:
> A <- matrix(1:4, ncol=2)
> A
[,1] [,2]
[1,] 1 3
[2,] 2 4
> A + 3 ##3将自动补齐为 matrix(c(3, 3, 3, 3), ncol=2),结果为每个元素都加上3
[,1] [,2]
[1,] 4 6
[2,] 5 7
> A + c(2, 3) ##向量c(2, 3)将自动补齐为 matrix(c(2, 3, 2, 3), ncol=2)
[,1] [,2]
[1,] 3 5
[2,] 5 7
> A + c(2, 3, 4) ##向量c(2, 3, 4)将自动补齐为 matrix(c(2, 3, 4, 2), ncol=2),并给出警告信息
[,1] [,2]
[1,] 3 7
[2,] 5 6
Warning message:
In A + c(2, 3, 4) :
longer object length is not a multiple of shorter object length
> A + 2:6 ##向量元素的个数不能超过矩阵元素的个数
Error: dims [product 4] do not match the length of object [5]
In addition: Warning message:
In A + 2:6 :
longer object length is not a multiple of shorter object length
1.3 其它基本运算
来看一些例子:
> A <- matrix(1:4, ncol=2)
> A
[,1] [,2]
[1,] 1 3
[2,] 2 4
> sin(A)
[,1] [,2]
[1,] 0.8414710 0.1411200
[2,] 0.9092974 -0.7568025
> exp(A)
[,1] [,2]
[1,] 2.718282 20.08554
[2,] 7.389056 54.59815
我们可以看到,基本运算函数作用于矩阵也只是简单地作用于相应元素。
2. 矩阵的转置
若A
为mxn矩阵,可用t()
函数来求A
的转置(nxm矩阵),比如:
> A <- matrix(1:6, ncol=2)
> A
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
> t(A)
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
在R中,向量默认为是列向量。若将t()
函数作用于一个向量x
,返回结果将为行矩阵。若想得到一个列矩阵,可用t(t(x))
(即转置两次)。比如:
> x <- 1:4 ##向量
> x
[1] 1 2 3 4
> is.matrix(x) ##判断是否为矩阵
[1] FALSE
> t(x) ##行矩阵
[,1] [,2] [,3] [,4]
[1,] 1 2 3 4
> is.matrix(t(x))
[1] TRUE
> t(t(x)) ##列矩阵,转置两次
[,1]
[1,] 1
[2,] 2
[3,] 3
[4,] 4
3. 矩阵的内积
若A
为m×n矩阵,B
为n×k矩阵,在R中如何求它们的内积呢,也即求AB
。有两种方法:
-
使用
%*%
运算符 -
使用
crossprod()
函数,A %*% B
等价于crossprod(t(A), B)
,不过使用crossprod()
函数计算速度一般会更快
> A <- matrix(1:6, ncol=2)
> A
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
> B <- matrix(1:6, nrow=2)
> B
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
> A %*% B ##矩阵的内积,使用`%*%`运算符
[,1] [,2] [,3]
[1,] 9 19 29
[2,] 12 26 40
[3,] 15 33 51
> crossprod(t(A), B) ##使用crossprod函数,注意函数第一个参数是t(A)
[,1] [,2] [,3]
[1,] 9 19 29
[2,] 12 26 40
[3,] 15 33 51
4. 矩阵的行列式
数学中,只有方阵(行数与列数一样的矩阵)才有行列式。R中可用det()
函数来求矩阵行列式的值,例如:
> A <- matrix(1:4, ncol=2)
> B <- matrix(1:6, ncol=2)
> A
[,1] [,2]
[1,] 1 3
[2,] 2 4
> B
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
> det(A) ##矩阵行列式的值
[1] -2
> det(B) ##只有方阵才有行列式
Error in determinant.matrix(x, logarithm = TRUE, ...) :
'x'必需是正方形矩阵
5. 矩阵对角元素相关操作
在R中,可用diag()
函数来对矩阵的对角元素进行操作。根据其参数的不同,主要有三种不同使用方法:
-
当参数为矩阵时,可提取矩阵的对角元素;结合赋值运算可改变矩阵对角元素的值
-
当参数为向量(长度>1)时,返回以向量元素为对角线元素的对角矩阵
-
当参数为正整数
z
时,返回z
维单位矩阵
来看些例子:
> A <- matrix(1:4, ncol=2)
> A
[,1] [,2]
[1,] 1 3
[2,] 2 4
> diag(A) ##提取矩阵的对角元素
[1] 1 4
> diag(A) <- c(7, 8) ##改变矩阵的对角元素
> A
[,1] [,2]
[1,] 7 3
[2,] 2 8
> diag(c(3, 4)) ##创建对角矩阵
[,1] [,2]
[1,] 3 0
[2,] 0 4
> 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
6. 矩阵的逆
在R中,可用solve()
函数来求矩阵的逆,例如:
> A
[,1] [,2]
[1,] 1 3
[2,] 2 4
> solve(A) ##矩阵A的逆
[,1] [,2]
[1,] -2 1.5
[2,] 1 -0.5
> A %*% solve(A) ##结果应为单位矩阵
[,1] [,2]
[1,] 1 0
[2,] 0 1
solve()
函数的原型为solve(a, b, ...)
,一般用来求线性方程组a %*% x = b
的解x
。若参数b
没有提供,系统将默认为单位矩阵,因此其计算结果就是矩阵的逆。
7. 提取矩阵的上、下三角部分
在R中,可以使用upper.tri(x, diag = FALSE)
和lower.tri(x, diag = FALSE)
函数分别提取一个矩阵的上、下三角部分的元素,其中参数diag
设置是否包含对角元素。upper.tri()
函数将返回一个逻辑型矩阵,其中上三角部分为真
,下三角部分为假
;lower.tri()
函数正好相反。
来看一些例子:
> A <- matrix(1:16, ncol=4)
> A
[,1] [,2] [,3] [,4]
[1,] 1 5 9 13
[2,] 2 6 10 14
[3,] 3 7 11 15
[4,] 4 8 12 16
> upper.tri(A)
[,1] [,2] [,3] [,4]
[1,] FALSE TRUE TRUE TRUE
[2,] FALSE FALSE TRUE TRUE
[3,] FALSE FALSE FALSE TRUE
[4,] FALSE FALSE FALSE FALSE
> upper.tri(A, diag=TRUE) ##包含对角元素
[,1] [,2] [,3] [,4]
[1,] TRUE TRUE TRUE TRUE
[2,] FALSE TRUE TRUE TRUE
[3,] FALSE FALSE TRUE TRUE
[4,] FALSE FALSE FALSE TRUE
> lower.tri(A)
[,1] [,2] [,3] [,4]
[1,] FALSE FALSE FALSE FALSE
[2,] TRUE FALSE FALSE FALSE
[3,] TRUE TRUE FALSE FALSE
[4,] TRUE TRUE TRUE FALSE
> A[lower.tri(A)] <- 0 ##将下三角部分所有元素设为0
> A
[,1] [,2] [,3] [,4]
[1,] 1 5 9 13
[2,] 0 6 10 14
[3,] 0 0 11 15
[4,] 0 0 0 16
8. 矩阵转化为向量
在R中,你可以使用as.vector()
函数或者直接使用c()
函数将一个矩阵转化为向量。来看些例子:
> A <- matrix(1:9, ncol=3)
> A
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
> as.vector(A) ##默认按列转化
[1] 1 2 3 4 5 6 7 8 9
> as.vector(t(A)) ##结合t()函数,按行转化
[1] 1 4 7 2 5 8 3 6 9
> c(A) ##也是默认按列转化
[1] 1 2 3 4 5 6 7 8 9
> c(t(A)) ##结合t()函数,按行转化
[1] 1 4 7 2 5 8 3 6 9
R矩阵的第二部分内容就讲到这。
其实关于矩阵的操作还有很多内容,比如:特征值与特征向量、奇异值分解、qr分解、广义逆等等。这里暂且不讲这些内容,如若有需要后期会添加至本博客。
感谢您的阅读!想了解更多有关R语言技巧,请关注我的微信公众号“R语言和Python学堂”,我将定期更新相关文章。
![](https://img.haomeiwen.com/i14120044/78447ed391dc6b2b.png)
网友评论