您的位置:首页 > 其它

R:向量和矩阵的线性代数运算

2014-10-27 10:31 281 查看
向量乘以标量可以直接运算,如下所示:

> 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()函数中的第四个参数表示的是要使用的函数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: