文章目录

  • 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