常见的矩阵运算,包括线性代数运算、矩阵索引和矩阵元素筛选。
►线性代数运算
你可以对矩阵进行各种线性代数运算,比如矩阵相乘、矩阵数量乘法和矩阵加法。针对以前例子中的y,以下为这三种运算的实例:
> y = matrix( c(1,2,3,4), nrow=2, ncol=2)
> y + y
[,1] [,2]
[1,] 2 6
[2,] 4 8
> y %*% y
[,1] [,2]
[1,] 7 15
[2,] 10 22
> 3 * y
[,1] [,2]
[1,] 3 9
[2,] 6 12
►矩阵索引
向量运算同样适用于矩阵。
> z <- matrix( c(1, 2, 3, 4, 1, 1, 0, 0, 1, 0, 1, 0),nrow=4 )
> z
[,1] [,2] [,3]
[1,] 1 1 1
[2,] 2 1 0
[3,] 3 0 1
[4,] 4 0 0
> z[, 2:3]
[,1] [,2]
[1,] 1 1
[2,] 1 0
[3,] 0 1
[4,] 0 0
> z[2:3, ]
[,1] [,2] [,3]
[1,] 2 1 0
[2,] 3 0 1
> z[2:3, 3]
[1] 0 1
注:我们要得到的是一个1行2列的子矩阵,可是返回的却是一个由两个元素组成的向量。元素是正确的,可是数据类型却不对。如果把返回值输入到其他的矩阵函数里可能会导致错误。解决办法是通过设定参数drop,告诉R让返回结果保持数据的二维属性。对原本就是向量的对象,可以使用as.matrix()函数将其转化为矩阵。
> y <- matrix( c(1, 2, 3, 4, 5, 6), nrow=3 )
> y
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
> y[ c(1,3), ] <- matrix( c(1,1,8,12), nrow=2 )
> y #对一个矩阵的子矩阵进行赋值
[,1] [,2]
[1,] 1 8
[2,] 2 5
[3,] 1 12
> x <- matrix( nrow=3,ncol=3 )
> y <- matrix( c( 4, 5, 2, 3 ), nrow=2 )
> y
[,1] [,2]
[1,] 4 2
[2,] 5 3
> x[2:3, 2:3] <- y
> x
[,1] [,2] [,3]
[1,] NA NA NA
[2,] NA 4 2
[3,] NA 5 3
> y <- matrix( c(1, 2, 3, 4, 5, 6), nrow=3 )
> y
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
> y[-2, ] #取出矩阵y中除第二行外的所有行(负值索引用来排除掉某些元素)
[,1] [,2]
[1,] 1 4
[2,] 3 6
> which( y %% 2 == 1 )
[1] 1 3 5
注:从向量索引的角度看,y的第1、3、5个元素是奇数。