一、 数组
数组可以看作是带有多个下标类型相同的元素集合。 维度向量(dimension vector)是一个正整数向量。如果它的长度为k,那么该数组就是k-维的。
向量只有在定义了dim属性后才能作为数组在R中使用。 假定,z是一个含1500个元素的向量
> z<-seq(1,1500) > dim(z)<- c(3,5,100) >attributes(z) $dim [1] 3 5100
对dim属性的赋值使得该向量成一个3×5×100的数组。
1.数组索引
数组元素可以通过给定数组名及其后方括号中用逗号隔开的下标访问。可以根据索引数组去给数组中不规则的元素集合赋值或者将数组中特定的元素返回到一个向量中。
2.array()
除了用设定一个向量dim属性的方法来构建数组,它还可直接通过函数array将向量转换得到。
假定向量h有24个或更少的数值,那么命令
> h <- seq(1,24) > Z <-array(h, dim=c(3,4,2))
等价于
> dim(h)<- c(3,4,2)
3.向量和数组混合运算
· 表达式运算是从左到右进行的。
· 短的向量操作数将会被循环使用以达到其他操作数的长度。
· 有且只有短的向量和数组在一起,数组必须有一样的属性dim,否则返回一个错误。
· 向量操作数比矩阵或者数组操作数长时会引起错误。
· 如果数组结构给定,同时也没有关于向量的错误信息和强制转换操作,结果将是一个和它的数组操作数属性dim一致的数组。
4.数组的外积
数组一个非常重要的运算就是外积运算(outerproduct)。如果a和b是两个数值数组,它们的外积将是这样的一个数组:维度向量通过连接两个操作数的维度向量得到;数据向量则由a的数据向量元素和b的数据向量元素的所有可能乘积得到。外积是通过特别的操作符%o%实现:
> a <- 1:3 > b <- 1:3 > ab <-a %o% b > ab <-outer(a, b,"*") > ab [,1] [,2] [,3] [1,] 1 2 3 [2,] 2 4 6 [3,] 3 6 9
命令中的乘法操作符可以被任意一个双变量函数代替。
> x<-c(1,2,3);y<-c(2,3,4) > f <- function(x, y)cos(y)/(1 x^2) > z <- outer(x, y, f)
两个常规向量的外积是一个双下标的数组(就是矩阵,最大秩为1)。
5.数组的广义转置
函数aperm(a, perm) 可以用来重排一个数组a
B <- aperm(z,c(2,1))
等价操作
t(z)
二、矩阵
矩阵是一个双下标的数组。R包括许多只对矩阵操作的操作符和函数。例如上面提到的t(X)就是矩阵的转置函数。函数nrow(A)和ncol(A)将会分别返回矩阵A的行数和列数。
1.矩阵相乘
操作符%*% 用于矩阵相乘。 如果A和B是大小一样的方阵,那么
A * B
将是一个对应元素乘积的矩阵,而
A %*% B
则是一个矩阵积。如果x是一个向量,那么
x %*% A %*% x
通过上述数组外积中的z和x试试下列代码:
> z * z > z %*% z > x %*% z%*% x
crossprod():可以完成"矢积"运算,也就是说crossprod(X,y) 和t(X) %*% y 等价,而且在运算上更为高效。 diag():返回以该向量元素为对角元素的对角矩阵。
2.解线性方程和求逆
求解线性方程组是矩阵乘法的逆运算。当下面的命令运行后,
b <- A %*% x
如果仅仅给出A和b,那么x就是该线性方程组的根。在R里面,用命令
solve(A,b)
矩阵的逆可以用下面的命令计算
solve(A)
三、小结
R语言中数组可以看作是带有多个下标类型相同的元素集合。 维度向量(dimensionvector)是一个正整数向量。如果它的长度为k,那么该数组就是k-维的。向量只有在定义了dim属性后才能作为数组在R中使用。除了用设定一个向量dim属性的方法来构建数组,它还可直接通过函数array将向量转换得到,outer()可以做外积运算,aperm()可以做数组的广义转置,等价于t(),%%可以做矩阵的相乘,crossprod()可以完成"矢积"运算,也就是crossprod(X,y)和t(X) %% y 等价,而且在运算上更为高效,diag()返回以该向量元素为对角元素的对角矩阵,使用solve()可以对矩阵求逆。