R语言与线性代数

Heaven Zone | 2018-05-10  |  R / 线性代数

使用R语言对线性代数一些问题进行计算。

测试矩阵:

m <-  matrix(c(2,2:9), nrow = 3)
m
##      [,1] [,2] [,3]
## [1,]    2    4    7
## [2,]    2    5    8
## [3,]    3    6    9
m2 <- c(1:3)
m2
## [1] 1 2 3

矩阵乘以标量

m * 2
##      [,1] [,2] [,3]
## [1,]    4    8   14
## [2,]    4   10   16
## [3,]    6   12   18

求内积,即点积

即$A^TA$。

crossprod(m, m2)
##      [,1]
## [1,]   15
## [2,]   32
## [3,]   50
crossprod(m2, m2)
##      [,1]
## [1,]   14
a <- matrix( c( 1, 3, 2, 4 ), nrow=2 )
b <- matrix( c( 1, 0, -1, 1 ), nrow=2 )
crossprod(a, b)
##      [,1] [,2]
## [1,]    1    2
## [2,]    2    2
## 等价于
t(a) %*% b
##      [,1] [,2]
## [1,]    1    2
## [2,]    2    2
crossprod(a)
##      [,1] [,2]
## [1,]   10   14
## [2,]   14   20

求逆矩阵

solve(a)
##      [,1] [,2]
## [1,] -2.0  1.0
## [2,]  1.5 -0.5

解方程组

x <- matrix( c( 1, 1, -1, 1 ), nrow=2, ncol=2 )
y <- c( 2, 4 )

solve(x, y)
## [1] 3 1

求对角阵

diag(diag(m))
##      [,1] [,2] [,3]
## [1,]    2    0    0
## [2,]    0    5    0
## [3,]    0    0    9

得到n阶单位阵

diag(3)
##      [,1] [,2] [,3]
## [1,]    1    0    0
## [2,]    0    1    0
## [3,]    0    0    1

每行加不同的数

sweep(m, 1, c(1,2,3), `+`)
##      [,1] [,2] [,3]
## [1,]    3    5    8
## [2,]    4    7   10
## [3,]    6    9   12

求行列式

det(m)
## [1] -3

求矩阵的特征值和特征向量

eigen(m)
## eigen() decomposition
## $values
## [1] 16.2349993 -0.5631364  0.3281371
## 
## $vectors
##            [,1]       [,2]       [,3]
## [1,] -0.4867178 -0.6095934 -0.7326354
## [2,] -0.5625331 -0.5712311  0.6514109
## [3,] -0.6683279  0.5496279 -0.1972540

QR分解

qr(m)
## $qr
##            [,1]       [,2]        [,3]
## [1,] -4.1231056 -8.7312825 -13.8245306
## [2,]  0.4850713 -0.8744746  -1.4798801
## [3,]  0.7276069 -0.2717739  -0.8320503
## 
## $rank
## [1] 3
## 
## $qraux
## [1] 1.4850713 1.9623611 0.8320503
## 
## $pivot
## [1] 1 2 3
## 
## attr(,"class")
## [1] "qr"

Cholesky分解

m3 <- m %*% solve(m) *2
m3
##      [,1] [,2] [,3]
## [1,]    2    0    0
## [2,]    0    2    0
## [3,]    0    0    2
chol(m3)
##          [,1]     [,2]     [,3]
## [1,] 1.414214 0.000000 0.000000
## [2,] 0.000000 1.414214 0.000000
## [3,] 0.000000 0.000000 1.414214