R语言初级教程(14): 矩阵(中篇)

这篇博客将介绍有关矩阵的一些操作,主要包括矩阵的基本运算、转置、内积、行列式、对角元素操作、逆、提取矩阵的上下三角部分以及如何将矩阵转化为向量。

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学堂”,我将定期更新相关文章。

《R语言初级教程(14): 矩阵(中篇)》

    原文作者:R语言和Python学堂
    原文地址: https://www.jianshu.com/p/babf0c1fdce3
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞