矩阵(matrix)是一种特殊的向量,包含两个附加的属性:行数和列数。所以矩阵也是和向量一样,有模式(数据类型)的概念。(但反过来,向量却不能看作是只有一列或一行的矩阵。
数组(array)是R里更一般的对象,矩阵是数组的一个特殊情形。数组可以是多维的。例如:一个三维数组可以包含行、列和层(layer),而一个矩阵只有行和列两个维度
1、创建矩阵
矩阵的行和列的下标都是从1开始,如:矩阵a左上角的元素记作a[1,1]。矩阵在R中是按列存储的,也就是说先存储第一列,再存储第二列,以此类推。
> y <- matrix(c(1,2,3,4),nrow=2,ncol=2) > y [,1] [,2] [1,] 1 3 [2,] 2 4 > y <- matrix(c(1,2,3,4),nrow=2) > y [,1] [,2] [1,] 1 3 [2,] 2 4 > #按列输出 > y[,2] #输出第二列 [1] 3 4 >
为矩阵中的元素赋值
> y <- matrix(nrow = 2,ncol = 2) > y [,1] [,2] [1,] NA NA [2,] NA NA > y[1,1] <- 1 > y[2,1] <- 2 > y[1,2] <- 3 > y[2,2] <-4 > y [,1] [,2] [1,] 1 3 [2,] 2 4 >
>#与上面的代码效果相同 > y <- matrix(c(1,2,3,4),nrow = 2) > y [,1] [,2] [1,] 1 3 [2,] 2 4 >
默认在R中矩阵是以列进行存储的,但通过byrow = T,参数可以将矩阵进行按行存储
> y <- matrix(c(1,2,3,4),nrow = 2, byrow = T) > y [,1] [,2] [1,] 1 2 [2,] 3 4 >
2、一般矩阵运算
常用的矩阵运算:线性代数运算、矩阵索引、矩阵元素筛选
#线性代数运算
线性代数运算包括:矩阵相乘、矩阵数量乘法、矩阵加法等
> y <- matrix(c(1,2,3,4),nrow = 2) > y [,1] [,2] [1,] 1 3 [2,] 2 4 > y %*% y #矩阵相乘 [,1] [,2] [1,] 7 15 [2,] 10 22 > 3*y #矩阵数量乘法 [,1] [,2] [1,] 3 9 [2,] 6 12 > y+y #矩阵加法 [,1] [,2] [1,] 2 6 [2,] 4 8 >
#矩阵索引
> 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] #提取z中第2、3更 [,1] [,2] [1,] 1 1 [2,] 1 0 [3,] 0 1 [4,] 0 0 >
给矩阵赋值
> z [,1] [,2] [,3] [1,] 1 1 1 [2,] 2 1 0 [3,] 3 0 1 [4,] 4 0 0 > z[c(1,3),] <-matrix(c(1,1,8,12,16,20),nrow = 2) #给z1,3行进行赋新值 > z [,1] [,2] [,3] [1,] 1 8 16 [2,] 2 1 0 [3,] 1 12 20 [4,] 4 0 0 >
利用行号负值,移除行或列
> 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,] #移除第2行 [,1] [,2] [1,] 1 4 [2,] 3 6 > y[,-2] #移除第2列 [1] 1 2 3 >
#矩阵元素筛选
矩阵跟向量样也可以进行筛选,只是语法上不同而已