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()函数中的第四个参数表示的是要使用的函数。
> 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()函数中的第四个参数表示的是要使用的函数。
相关文章推荐
- [00310]矩阵与线性代数运算
- Python 机器学习——线性代数和矩阵运算:从matlab迁移到python
- 矩阵 向量 求导运算
- 探讨:使用boost库做大量向量与矩阵运算方面的项目
- Eigen之矩阵、向量、标量的操作运算
- 【线性代数】矩阵、向量、行列式、特征值与特征向量(掌握这些概念一篇文章就够了)
- 图形学学习笔记5——向量矩阵运算
- 数学:《线性代数》矩阵运算
- 运用numpy进行数组、向量、矩阵运算
- [线性代数]矩阵的特征值与特征向量
- 线性代数-【2-1】矩阵及其运算
- 别出心栽地实现矩阵的运算(继承向量类)
- matlab 向量/矩阵运算
- 利用python做矩阵的简单运算(行列式、特征值、特征向量等的求解)
- Matlab与线性代数 -- 矩阵的特征值与特征向量
- MKL 进行矩阵向量运算
- 继承、重载运算符、虚函数与向量、矩阵运算
- IOS中的矩阵和向量运算
- R向量矩阵运算
- MATLAB(6)矩阵和向量运算