R:向量和矩陣的線性代數運算
向量乘以標量可以直接運算,如下所示:
> y <- c( 1, 3, 6, 10 )
> 2 * y
[1] 2 6 12 20
如果想計算兩個向量的內積(也就是點積),可以使用crossprod()命令。
> crossprod( 1:3, c( 5, 12, 13 ) )
[,1]
[1,] 68
數學意義上的矩陣乘法,要使用運算子“%*%”。
> a <- matrix( c( 1, 3, 2, 4 ), nrow=2 )
> b <- matrix( c( 1, 0, -1, 1 ), nrow=2 )
> a %*% b
[,1] [,2]
[1,] 1 1
[2,] 3 1
函式solve()可以解線性方程組,還可以求矩陣的逆矩陣。
> a <- matrix( c( 1, 1, -1, 1 ), nrow=2, ncol=2 )
> b <- c( 2, 4 )
> solve( a, b )#求解線性方程組
[1] 3 1
> solve( a ) #第二個引數省略表示計算矩陣的逆
[,1] [,2]
[1,] 0.5 0.5
[2,] -0.5 0.5
下面是一些其他線性代數運算子:
Ю t():矩陣的轉置
Ю qr():QR分解
Ю chol():Cholesky分解
Ю det():矩陣的行列式值
Ю eigen():矩陣的特徵值和特徵向量
Ю diag():從方陣中提出對角矩陣(有利於從協方差矩陣中得到方差和構建對角矩陣)
Ю sweep():數值分析批量運算子
需要注意的是diag()函式的兩用型:如果它的引數是一個矩陣,它返回的是一個向量,反之亦然;同樣的,如果它的引數是一個標量,那麼這個函式返回指定大小的單位矩陣。
> m <- matrix( c( 1, 7, 2, 8 ), nrow=2 )
> dm <- diag( m )
> dm
[1] 1 8
> diag( dm )
[,1] [,2]
[1,] 1 0
[2,] 0 8
> diag( 3 )
[,1] [,2] [,3]
[1,] 1 0 0
[2,] 0 1 0
[3,] 0 0 1
函式sweep()可以做比較複雜的運算。下面的例子實現了第一行都加1,第二行都加4,第三行都加7:
> m <- matrix( c( 1, 4, 7, 2, 5, 8, 3, 6, 9 ), nrow=3 )
> sweep( m, 1, c( 1, 4, 7 ), "+" )
[,1] [,2] [,3]
[1,] 2 3 4
[2,] 8 9 10
[3,] 14 15 16
sweep()函式中的前兩個引數類似於apply()中的引數:陣列和方向。上面的例子中,方向是1,表示按行運算。sweep()函式中的第四個引數表示的是要使用的函式。