R语言: 矩阵
R 语言为线性代数的研究提供了矩阵类型,这种数据结构很类似于其它语言中的二维数组,但 R 提供了语言级的矩阵运算支持。矩阵里的元素可以是数字、符号或数学式。
函数 | 说明 |
---|---|
data | 向量,矩阵的数据 |
nrow | 行数 |
ncol | 列数 |
byrow | 逻辑值,为 FALSE 按列排列,为 TRUE 按行排列 |
dimname | 设置行和列的名称 |
创建矩阵
在R语言中,主要通过matrix函数来完成矩阵的创建。
m <- matrix(1:8,nrow=2)
m <- matrix(1:8,nrow=2,byrow=T)
> #默认按列创建矩阵
> m <- matrix(1:8,nrow=2)
> m[,1] [,2] [,3] [,4]
[1,] 1 3 5 7
[2,] 2 4 6 8
> #按行创建矩阵
> m <- matrix(1:8,nrow=2,byrow=T)
> m[,1] [,2] [,3] [,4]
[1,] 1 2 3 4
[2,] 5 6 7 8
倒置矩阵
R 语言矩阵提供了 t() 函数,可以实现矩阵的行列互换。
例如有个 m 行 n 列的矩阵,使用 t() 函数就能转换为 n 行 m 列的矩阵。
t( )
> m <- matrix(1:8,nrow=2)
> m[,1] [,2] [,3] [,4]
[1,] 1 3 5 7
[2,] 2 4 6 8
> t(m)[,1] [,2]
[1,] 1 2
[2,] 3 4
[3,] 5 6
[4,] 7 8
矩阵运算
大小相同(行数列数都相同)的矩阵之间可以相互加减,具体是对每个位置上的元素做加减法。
> m1 <-matrix(1:4,nrow=2)
> m2 <-matrix(2:5,nrow=2)
> m1;m2[,1] [,2]
[1,] 1 3
[2,] 2 4[,1] [,2]
[1,] 2 4
[2,] 3 5
> m1+m2[,1] [,2]
[1,] 3 7
[2,] 5 9
> m1*m2 #对应位置相乘[,1] [,2]
[1,] 2 12
[2,] 6 20
矩阵的乘法则较为复杂。两个矩阵可以相乘,当且仅当第一个矩阵的列数等于第二个矩阵的行数。
> m1 <-matrix(1:6,nrow=3)
> m2 <-matrix(2:7,nrow=2)
> m1;m2[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6[,1] [,2] [,3]
[1,] 2 4 6
[2,] 3 5 7
> m1%*%m2[,1] [,2] [,3]
[1,] 14 24 34
[2,] 19 33 47
[3,] 24 42 60
矩阵索引
> m <-matrix(1:12,nrow=4)
> m[,1] [,2] [,3]
[1,] 1 5 9
[2,] 2 6 10
[3,] 3 7 11
[4,] 4 8 12
输出第2-3列
> m[,2:3][,1] [,2]
[1,] 5 9
[2,] 6 10
[3,] 7 11
[4,] 8 12
输出第1-3行
> m[1:2,][,1] [,2] [,3]
[1,] 1 5 9
[2,] 2 6 10
输出列表中元素,按列级优先
> m[1:3]
[1] 1 2 3
> m[1:5]
[1] 1 2 3 4 5
列表删除
> m <- matrix(1:12, nrow= 4)
> m[,1] [,2] [,3]
[1,] 1 5 9
[2,] 2 6 10
[3,] 3 7 11
[4,] 4 8 12
删除第一行
> m[-1,][,1] [,2] [,3]
[1,] 2 6 10
[2,] 3 7 11
[3,] 4 8 12
删除第一列
> m[,-1][,1] [,2]
[1,] 5 9
[2,] 6 10
[3,] 7 11
[4,] 8 12
删除第一行和第一类
> m[-1,-1][,1] [,2]
[1,] 6 10
[2,] 7 11
[3,] 8 12
组合矩阵数据
cbind( )
rbind( )
> m<-matrix(1:20,nrow=5)
> m[,1] [,2] [,3] [,4]
[1,] 1 6 11 16
[2,] 2 7 12 17
[3,] 3 8 13 18
[4,] 4 9 14 19
[5,] 5 10 15 20
> col.v<-matrix(21:40,nrow=5)
> col.v[,1] [,2] [,3] [,4]
[1,] 21 26 31 36
[2,] 22 27 32 37
[3,] 23 28 33 38
[4,] 24 29 34 39
[5,] 25 30 35 40
> cbind(m,col.v)[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,] 1 6 11 16 21 26 31 36
[2,] 2 7 12 17 22 27 32 37
[3,] 3 8 13 18 23 28 33 38
[4,] 4 9 14 19 24 29 34 39
[5,] 5 10 15 20 25 30 35 40
> rbind(m,col.v)[,1] [,2] [,3] [,4][1,] 1 6 11 16[2,] 2 7 12 17[3,] 3 8 13 18[4,] 4 9 14 19[5,] 5 10 15 20[6,] 21 26 31 36[7,] 22 27 32 37[8,] 23 28 33 38[9,] 24 29 34 39
[10,] 25 30 35 40
apply函数
对矩阵的行或者列调用函数
apply(m,dim.index,f)
dim.index: 1代表每一行应用函数f,2代表每一列应用函数f
> m<- matrix(1:6, nrow = 3 )
> m[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
> #求每一行的最大值
> apply(m,1,max)
[1] 4 5 6
> #求每—列的最大值
> apply (m,2, max)
[1] 3 6