文章目录
- 1 创建矩阵
- 2 一般的矩阵运算
- 2.1 线性代数运算
- 2.2 矩阵索引
- 2.4 矩阵元素筛选
- 3 对矩阵的行和列调用函数
- 3.1 使用apply()函数
- 4 增加或删除矩阵的行或列
- 4.1 改变矩阵的大小
- 5 向量与矩阵的差异
- 6 避免意外降维
- 7 矩阵的行和列的命名问题
- 8 高维数组
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是一个矩阵,并且给出它的行数和列数
> y <- matrix(nrow = 2,ncol = 2)
> 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
2 一般的矩阵运算
2.1 线性代数运算
> 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
2.2 矩阵索引
> x <- matrix(c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16),nrow = 4)
> x
[,1] [,2] [,3] [,4]
[1,] 1 5 9 13
[2,] 2 6 10 14
[3,] 3 7 11 15
[4,] 4 8 12 16
> x[1:2,]
[,1] [,2] [,3] [,4]
[1,] 1 5 9 13
[2,] 2 6 10 14
> x[,2:3]
[,1] [,2]
[1,] 5 9
[2,] 6 10
[3,] 7 11
[4,] 8 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
2.4 矩阵元素筛选
> x <- matrix(c(1:3,2:4),nrow=3)
> x
[,1] [,2]
[1,] 1 2
[2,] 2 3
[3,] 3 4
> x[x[,2] >= 3,] #判断第二列大于3的元素
[,1] [,2]
[1,] 2 3
[2,] 3 4
上面这个例子是通过x定义且用于提取x中二点元素,实际上还可以基于除被筛选变量以外的变量
看下面这个例子:
> z <- c(5,12,13)
> z %% 2 == 1
[1] TRUE FALSE TRUE #用结果对x的矩阵进行判断
> x[z %% 2 == 1,]
[,1] [,2]
[1,] 1 2
[2,] 3 4
因为矩阵也是向量,所以向量的运算也适用于矩阵
> x <- matrix(c(1:3,2:4),nrow=3)
> x
[,1] [,2]
[1,] 1 2
[2,] 2 3
[3,] 3 4
> which(x>2)
[1] 3 5 6
3 对矩阵的行和列调用函数
3.1 使用apply()函数
一般形式:apply(m,dimcode,f,fargs)
各参数如下:
- m是一个矩阵
- dimcode是维度编号,若取值为1代表每一行应用函数,若取值为2代表对每一列应用函数
- f是应用在行和列上的函数
- fargs是f的可选参数集
> z <- matrix(c(1:6),nrow = 3)
> z
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
> apply(z,2,mean)
[1] 2 5
> apply(z, 1, sum)
[1] 5 7 9
函数也可以是用户自定义函数
> z <- matrix(c(1:6),nrow = 3)
> z
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
> f <- function(x) x/c(2,8)
> y <- apply(z, 1, f)
> y
[,1] [,2] [,3]
[1,] 0.5 1.000 1.50
[2,] 0.5 0.625 0.75
是不是非常惊讶为什么结果 形状变了,不要慌!
这是因为apply()函数的默认方式就是按列的
可以看到矩阵转置了,可以通过转置得出我们想要的矩阵
> t(apply(z,1,f))
[,1] [,2]
[1,] 0.5 0.500
[2,] 1.0 0.625
[3,] 1.5 0.750
这样就得到我们想要的结果了
4 增加或删除矩阵的行或列
4.1 改变矩阵的大小
函数rbind()和函数cbind()可以给矩阵增加行和列
> z <- matrix(c(1: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
> cbind(a,z) #按行组合,创建了一个新矩阵
a
[1,] 1 1 1 1
[2,] 1 2 1 0
[3,] 1 3 0 1
[4,] 1 4 0 0
函数cbind()和rbind()还可以用来快速生成一些小的矩阵
> q <- cbind(c(1,2),c(3,4))
> q
[,1] [,2]
[1,] 1 3
[2,] 2 4
but,谨慎使用cbind()和创建向量一样,创建一个新的矩阵很耗时间
可以通过重新赋值来删除矩阵的行和列:
> m <- matrix(1:6,nrow = 3)
> m
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
> m <- m[c(1,3),]
> m
[,1] [,2]
[1,] 1 4
[2,] 3 6
5 向量与矩阵的差异
其实矩阵就是一个向量,只是多了两个属性:行数和列数
> z <- matrix(1:8,nrow = 4)
> z
[,1] [,2]
[1,] 1 5
[2,] 2 6
[3,] 3 7
[4,] 4 8
> #因为是向量,因此可以求它的长度
> length(z)
[1] 8
> #查看z的类型
> class(z)
[1] "matrix" "array"
> attributes(z)
$dim
[1] 4 2
R的大部分类是S3类,用¥符号可以访问各组件,矩阵类中有一个dim属性,是一个由矩阵的行数和列数组成的向量
用dim()函数访问dim属性:
> dim(z)
[1] 4 2
行数和列数还可以分贝用nrow()和ncol()函数访问:
> nrow(z)
[1] 4
> ncol(z)
[1] 2
6 避免意外降维
> z <- matrix(1:8,nrow = 4)
> z
[,1] [,2]
[1,] 1 5
[2,] 2 6
[3,] 3 7
[4,] 4 8
> r <- z[2,] #此时r已经不再是向量
> r
[1] 2 6
R里可以使用drop参数
> r <- z[2,,drop=FALSE]
> r
[,1] [,2]
[1,] 2 6
对原本就是向量的对象,可以使用as.matrix()函数转化为矩阵
> u <- c(1,2,3)
> v <- as.matrix(u)
> attributes(u)
NULL
> attributes(v)
$dim
[1] 3 1
7 矩阵的行和列的命名问题
当然,访问矩阵元素最直接的方法是通过行号和列号,但是也可以使用行名和列名
> z <- matrix(1:4, nrow = 2)
> z
[,1] [,2]
[1,] 1 3
[2,] 2 4
> colnames(z) <- c("a","b")
> z
a b
[1,] 1 3
[2,] 2 4
> colnames(z)
[1] "a" "b"
> z[,"a"]
[1] 1 2
roqnames()函数的功能与此类似
8 高维数组
直接看这段代码吧:
> firsttest <- matrix(c(1,2,3,4,5,6),nrow = 3)
> firsttest
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
> secondtest <- matrix(c(7,8,9,10,11,12),nrow = 3)
> secondtest
[,1] [,2]
[1,] 7 10
[2,] 8 11
[3,] 9 12
> thirdtest <- matrix(c(13,14,15,16,17,18),nrow = 3)
> tests <- array(data=c(firsttest,secondtest,thirdtest),dim = c(3,2,3))
> tests[]
, , 1
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
, , 2
[,1] [,2]
[1,] 7 10
[2,] 8 11
[3,] 9 12
, , 3
[,1] [,2]
[1,] 13 16
[2,] 14 17
[3,] 15 18