R语言科学计算
分类统计
- mean(),求平均值
- min(),求最小值
- sd(),求标准差
数组和矩阵
数组与矩阵的维数
用dim函数来定义向量空间的维数。
例:
> my_num <- c(1:10)
> dim(my_num) <- c(2,5)
> my_num
[,1] [,2] [,3] [,4] [,5]
[1,] 1 3 5 7 9
[2,] 2 4 6 8 10
切片
索引向量
array函数
array函数根据维数参数生成多维数组,它的参数主要有两个,第一个是需要形成数组元素的数据,第二个是dim参数提示维度。
例:
> h1 <- c(1:20)
> mya1 <- array(h1, dim=c(4,5))
> mya1
[,1] [,2] [,3] [,4] [,5]
[1,] 1 5 9 13 17
[2,] 2 6 10 14 18
[3,] 3 7 11 15 19
[4,] 4 8 12 16 20
数组转换为向量
as.vector函数可将数组转换为向量。
例:
> x4 <- array(c(1:10), dim=c(2,5))
> x4
[,1] [,2] [,3] [,4] [,5]
[1,] 1 3 5 7 9
[2,] 2 4 6 8 10
> as.vector(x4)
[1] 1 2 3 4 5 6 7 8 9 10
matrix矩阵
使用matrix函数可创建矩阵,主要参数为:data表示构造所需数据,nrow为行数,ncol为列数,byrow表示是否按行顺序分配元素,默认为FALSE。
例:
> matrix(c(1:10),2,5,TRUE)
[,1] [,2] [,3] [,4] [,5]
[1,] 1 2 3 4 5
[2,] 6 7 8 9 10
> matrix(c(1:10),2,5)
[,1] [,2] [,3] [,4] [,5]
[1,] 1 3 5 7 9
[2,] 2 4 6 8 10
对角矩阵
通过diag函数可生成和分析对角矩阵。如果参数为一维数组,则将参数视为对角线元素,并生成对角矩阵。
例:
> a1 = c(1:10)
> diag(a1)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 1 0 0 0 0 0 0 0 0 0
[2,] 0 2 0 0 0 0 0 0 0 0
[3,] 0 0 3 0 0 0 0 0 0 0
[4,] 0 0 0 4 0 0 0 0 0 0
[5,] 0 0 0 0 5 0 0 0 0 0
[6,] 0 0 0 0 0 6 0 0 0 0
[7,] 0 0 0 0 0 0 7 0 0 0
[8,] 0 0 0 0 0 0 0 8 0 0
[9,] 0 0 0 0 0 0 0 0 9 0
[10,] 0 0 0 0 0 0 0 0 0 10
数组运算
数组四则运算
+, -, * 运算,每个元素分别进行。
向量连接
向量连接指的是将两个向量通过某种规律连接成一个数组。R语言的cbind和rbind函数可进行向量连接。
概略地说,cbind() 把矩阵横向合并成一个大矩阵(列方式),而rbind()
是纵向合并(行方式)。
在命令中
> X <- cbind(arg 1 , arg 2 , arg 3 , ...)
cbind() 的参数要么是任何长度的向量,要么是列长度一致的的矩阵(即行数一样)。结果将是一个合并arg1 , arg2 , . . . 的列形成的矩阵。
如果cbind() 的参数中有一些比其他矩阵参数的列长度短的向量,它们将会被循环使用以吻合矩阵的列长度(在没有矩阵的情况下,吻合其中最长向量的长度)。
函数rbind() 对行进行类似的操作。其中任何向量参数都会被当作行向量且可能被循环使用。
假定X1 和X2 有一样的行数。下面的命令会把它们的列合并以得到矩阵X,同时要求起始列都是1.
> X <- cbind(1, X1, X2)
rbind() 或者cbind() 返回值常常是矩阵形式。因此,cbind(x)
和rbind(x)
可能是把向量x 分别转换成列或者行矩阵最简单的方法。
> x2 <- c(101:105)
> x1 <- c(1:10)
> cbind(x1,x2)
x1 x2
[1,] 1 101
[2,] 2 102
[3,] 3 103
[4,] 4 104
[5,] 5 105
[6,] 6 101
[7,] 7 102
[8,] 8 103
[9,] 9 104
[10,] 10 105
> rbind(x1,x2)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
x1 1 2 3 4 5 6 7 8 9 10
x2 101 102 103 104 105 101 102 103 104 105
矩阵运算
矩阵连接
R语言的cbind函数完成矩阵的横向连接,rbind函数完成矩阵的纵向连接。
例:
> x3 <- matrix(c(1:10),2,5)
> x4 <- matrix(c(101:105),2,5)
> x3
[,1] [,2] [,3] [,4] [,5]
[1,] 1 3 5 7 9
[2,] 2 4 6 8 10
> x4
[,1] [,2] [,3] [,4] [,5]
[1,] 101 103 105 102 104
[2,] 102 104 101 103 105
> cbind(x3,x4)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 1 3 5 7 9 101 103 105 102 104
[2,] 2 4 6 8 10 102 104 101 103 105
> rbind(x3,x4)
[,1] [,2] [,3] [,4] [,5]
[1,] 1 3 5 7 9
[2,] 2 4 6 8 10
[3,] 101 103 105 102 104
[4,] 102 104 101 103 105
矩阵转置
R语言的t函数可完成矩阵转置计算
例:
> h <- c(1:10)
> array(h, dim=c(2,5)) -> mya
> mya
[,1] [,2] [,3] [,4] [,5]
[1,] 1 3 5 7 9
[2,] 2 4 6 8 10
> t(mya)
[,1] [,2]
[1,] 1 2
[2,] 3 4
[3,] 5 6
[4,] 7 8
[5,] 9 10
相对t函数而言,用aperm函数进行矩阵转置更灵活。aperm有两个常用的参数,第一个参数是需要转置的矩阵,第二个参数perm指示新矩阵相对于第一个参数矩阵的维度下标。
比如,将行转换为列,将列转换为行,将行列次序更换,将第一维的元素与第二维的元素互换,则将perm设为c(2,1).
例:
> aperm(mya,perm=c(2,1)) -> myb
> myb
[,1] [,2]
[1,] 1 2
[2,] 3 4
[3,] 5 6
[4,] 7 8
[5,] 9 10
> mya1 <- array(mya,c(2,2,5))
> mya1
, , 1
[,1] [,2]
[1,] 1 3
[2,] 2 4
, , 2
[,1] [,2]
[1,] 5 7
[2,] 6 8
, , 3
[,1] [,2]
[1,] 9 1
[2,] 10 2
, , 4
[,1] [,2]
[1,] 3 5
[2,] 4 6
, , 5
[,1] [,2]
[1,] 7 9
[2,] 8 10
> myb1 <- aperm(mya1,perm=c(2,1,3))
> myb1
, , 1
[,1] [,2]
[1,] 1 2
[2,] 3 4
, , 2
[,1] [,2]
[1,] 5 6
[2,] 7 8
, , 3
[,1] [,2]
[1,] 9 10
[2,] 1 2
, , 4
[,1] [,2]
[1,] 3 4
[2,] 5 6
, , 5
[,1] [,2]
[1,] 7 8
[2,] 9 10
矩阵乘积
若A为mn矩阵,B为nr矩阵,则它们的乘积AB(有时记做AB)会是一个mr的矩阵。矩阵乘积使用%*%操作符进行计算。
例:
> a2 <- array(c(1:10),dim=c(2,5))
> b2 <- t(a2)
> a2 %*% b2
[,1] [,2]
[1,] 165 190
[2,] 190 220
内积运算
向量外积
向量的外积是矩阵的克罗内克积的特殊情况,而克罗内克积是张量积的一种特殊情况。
> b1 <- array(c(1:4))
> a1 <- array(c(5:6))
> b1 %o% a1
[,1] [,2]
[1,] 5 6
[2,] 10 12
[3,] 15 18
[4,] 20 24
> a1 %o% b1
[,1] [,2] [,3] [,4]
[1,] 5 10 15 20
[2,] 6 12 18 24
> b2 <- array(c(1:4))
> a2 <- array(c(5:8))
> b2 %o% a2
[,1] [,2] [,3] [,4]
[1,] 5 6 7 8
[2,] 10 12 14 16
[3,] 15 18 21 24
[4,] 20 24 28 32
此外,还可以使用outer(a,b,'*')替代%o%运算符进行外积运算.
向量内积
向量内积以实数R上定义的两个向量为运算对象,返回一个实数标量值,属于二元运算,它是欧基里得空间的标准内积。
R语言通过corssprod函数完成向量内积运算.
例:
> a3 <- c(1:3)
> b3 <- c(4:6)
> crossprod(a3,b3)
[,1]
[1,] 32
矩阵内积
矩阵内积的计算方式相当于第一个参数的转置乘以第二个参数,就是前面提到的矩阵乘积。除了使用%*%操作符外,还可以使用crossprod函数完成矩阵内积计算。
求解线性方程组
一般通过solve函数来求解 a %*% x = b中的x向量值。求解线性方程组仅使用solve函数的前两个参数,第一个a为系统矩阵,第二个b为常数项,当b缺失时,默认为单位矩阵。
> b10
[,1]
[1,] 8
[2,] 9
> a10
[,1] [,2]
[1,] 1 3
[2,] 2 4
> solve(a10,b10)
[,1]
[1,] -2.5
[2,] 3.5
矩阵求逆
通过solve函数可进行矩阵求逆计算,只指定1个参数(待求逆的矩阵)即可。
例:
> a10
[,1] [,2]
[1,] 1 3
[2,] 2 4
> solve(a10)
[,1] [,2]
[1,] -2 1.5
[2,] 1 -0.5
矩阵的特征值求解
R语言通过eigen函数可求解特征值。
> a11 <- array(c(1:16),dim=c(4,4))
> a11
[,1] [,2] [,3] [,4]
[1,] 1 5 9 13
[2,] 2 6 10 14
[3,] 3 7 11 15
[4,] 4 8 12 16
> eigen(a11)
$values
[1] 3.620937e+01 -2.209373e+00 1.599839e-15 7.166935e-16
$vectors
[,1] [,2] [,3] [,4]
[1,] 0.4140028 0.82289268 -0.5477226 0.1125155
[2,] 0.4688206 0.42193991 0.7302967 0.2495210
[3,] 0.5236384 0.02098714 0.1825742 -0.8365883
[4,] 0.5784562 -0.37996563 -0.3651484 0.4745519
求解矩阵行列式
> a16 <- array(c(3:6),dim=c(2,2))
> a16
[,1] [,2]
[1,] 3 5
[2,] 4 6
> det(a16)
[1] -2
奇异值分解
使用R语言的svd函数可完成奇异分解。
> a20 <- array(c(1:16),dim=c(4,4))
> a20
[,1] [,2] [,3] [,4]
[1,] 1 5 9 13
[2,] 2 6 10 14
[3,] 3 7 11 15
[4,] 4 8 12 16
> svd(a20)
$d
[1] 3.862266e+01 2.071323e+00 2.076990e-15 4.119458e-16
$u
[,1] [,2] [,3] [,4]
[1,] -0.4284124 -0.7186535 0.43803202 0.3288281
[2,] -0.4743725 -0.2738078 -0.82913672 -0.1119477
[3,] -0.5203326 0.1710379 0.34417739 -0.7625890
[4,] -0.5662928 0.6158835 0.04692732 0.5457086
$v
[,1] [,2] [,3] [,4]
[1,] -0.1347221 0.82574206 0.5322301 -0.1293488
[2,] -0.3407577 0.42881720 -0.6132292 0.5691660
[3,] -0.5467933 0.03189234 -0.3702319 -0.7502855
[4,] -0.7528288 -0.36503251 0.4512310 0.3104683