1 矩阵简述
矩阵本质上是一种向量,只是比向量多两个属性:行数和列数;矩阵也有模式:如字符型,数值型。
> m<-matrix(1:8,nrow=4)
> m
[,1] [,2]
[1,] 1 5
[2,] 2 6
[3,] 3 7
[4,] 4 8
> nrow(m) #获取矩阵行数
[1] 4
> ncol(m) #获取矩阵列数
[1] 2
> dim(m) #获取行列数
[1] 4 2
> attributes(m) #显然矩阵是一个class,有自己的属性
$dim
[1] 4 2
2 创建矩阵
2.1
#方法一,确定好矩阵的行、列数
> 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<-matrix(nrow=2,ncol=4)
> y
[,1] [,2] [,3] [,4]
[1,] NA NA NA NA
[2,] NA NA NA NA
#方法四: 注意,将向量填充进矩阵时,默认都是按列排列向量的,而通过 <span style="font-family: Arial, Helvetica, sans-serif;">byrow=T, 可以将向量按行排列。</span>
> y<-matrix(1:8,nrow=2,byrow=T)
> y
[,1] [,2] [,3] [,4]
[1,] 1 2 3 4
[2,] 5 6 7 8
3矩阵的一般运算
3.1 矩阵乘法
# 矩阵乘法: %*%
> x<-matrix(1:8,nrow=4)
> x
[,1] [,2]
[1,] 1 5
[2,] 2 6
[3,] 3 7
[4,] 4 8
> y<-matrix(1:8,nrow=2)
> y
[,1] [,2] [,3] [,4]
[1,] 1 3 5 7
[2,] 2 4 6 8
> y%*%x
[,1] [,2]
[1,] 50 114
[2,] 60 140
3.2 矩阵的提取
#方法一:提取矩阵的二至四列
> y
[,1] [,2] [,3] [,4]
[1,] 1 3 5 7
[2,] 2 4 6 8
> y[,2:4]
[,1] [,2] [,3]
[1,] 3 5 7
[2,] 4 6 8
#方法二:去掉矩阵的第一列
> y[,-1]
[,1] [,2] [,3]
[1,] 3 5 7
[2,] 4 6 8
3.3 元素的筛选
#矩阵的筛选和向量类似,原理也相似
> y
[,1] [,2] [,3] [,4]
[1,] 1 3 5 7
[2,] 2 4 6 8
> y[,y[2,]>4]
[,1] [,2]
[1,] 5 7
[2,] 6 8
#上述筛选方法的原理
> y[2,]>4
[1] FALSE FALSE TRUE TRUE
3.4 矩阵的行、列数的变化
矩阵不能增加一行(列)或删除一行(列),类似的功能需要对矩阵进行重新赋值的操作。
> y[2,3]<-4
> y
[,1] [,2] [,3] [,4]
[1,] 1 3 5 7
[2,] 2 4 4 8
> x<-1
> y
[,1] [,2] [,3] [,4]
[1,] 1 3 5 7
[2,] 2 4 4 8
#给y添加一行
> rbind(y,x)
[,1] [,2] [,3] [,4]
1 3 5 7
2 4 4 8
x 1 1 1 1
#给y添加一列
> cbind(y,x)
x
[1,] 1 3 5 7 1
[2,] 2 4 4 8 1
#注意,上述操作中显然x的数量不足以填充y的一行或一列,但是R自动使用了循环赋值,及重复x的值,以使x中的元素达到需要的数量。
rbind(),cbind()的本质也是要创建一个新的矩阵,这是很费时的。
4.1 apply函数是用来对矩阵的每一行或每一列调用一次某个函数的函数,
apply(m,dimcode,f,fargs)
参数解释:
- m为矩阵
- dimcode是维度编号,取1表示对m矩阵中的每一行应用函数,取2代表对m矩阵中的每一列应用函数
- f是应用在行或列上的函数
- fargs是f的可选参数集
4.2 简单的实例
> y
[,1] [,2] [,3] [,4]
[1,] 1 3 5 7
[2,] 2 4 6 8
> mean(y)
[1] 4.5
> apply(y,1,mean)
[1] 4 5
5 避免意外降维
> y
[,1] [,2] [,3] [,4]
[1,] 1 3 5 7
[2,] 2 4 4 8
> x<-y[1,]
> x
[1] 1 3 5 7
> attributes(x)
NULL
在上免得代码中,x是y矩阵的第一行,是y的子矩阵。x本质上是一个一行四列的矩阵。而,当我们从一种将x取出是,R自动将x降维成向量。虽然大多数情况下,并不应印象我们的操作和处理,但是在运行复杂代码时,可能会出现因此原因出现一些意想不到的错误。以此,要尽力避免这种意外降维。可采用如下方法,使R不自作主张的降维
> x<-y[1,,drop=FALSE]
> x
[,1] [,2] [,3] [,4]
[1,] 1 3 5 7