矩阵

2018-08-31

2018-08-31
数据结构-矩阵

1 矩阵(Matrix)


在数学中,矩阵是一个按照长方阵列排列的复数或实数集合。

在编程中,矩阵是用来组织具有相同存储类型的一组变量。

2 创建矩阵


2.1 多个向量合为矩阵

将向量a和b纵向合并为矩阵

a<-(1:9)
b<-(1:3)
c<-(1:2)
cbind(a,b)    # 将向量a和b纵向合并为矩阵
##       a b
##  [1,] 1 1
##  [2,] 2 2
##  [3,] 3 3
##  [4,] 4 1
##  [5,] 5 2
##  [6,] 6 3
##  [7,] 7 1
##  [8,] 8 2
##  [9,] 9 3

将向量a、b、c以纵向形式合并为矩阵

cbind(a,b,c)  # 将向量a、b、c纵向合并为矩阵
##       a b c
##  [1,] 1 1 1
##  [2,] 2 2 2
##  [3,] 3 3 1
##  [4,] 4 1 2
##  [5,] 5 2 1
##  [6,] 6 3 2
##  [7,] 7 1 1
##  [8,] 8 2 2
##  [9,] 9 3 1

将向量a和b以横向形式合并为矩阵

rbind(a,b)    # 向量横向合并为矩阵
##   [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
## a    1    2    3    4    5    6    7    8    9
## b    1    2    3    1    2    3    1    2    3

其中,矩阵第2列由向量b中的元素依次复制3次得到

2.2 单个向量创建矩阵

  matrix(向量名,nrow=矩阵行数,ncol=矩阵列数,byrow=TRUE/FALSE,dimnames=list(行名称向量,列名称向量))

  式中,nrow和ncol分别表示矩阵的行和列,byrow用于指定向量元素在矩阵中的排列顺序,TRUE表示按行排列,FALSE按列排列。

a<-(1:10)
dim1<-c("R1","R2","R3","R4","R5")  # 设置行名称向量
dim2<-c("C1","C2","C3","C4","C5","C6") # 设置列名称向量
jzdata<-matrix(a,nrow=5,ncol=6,byrow=FALSE,dimnames=list(dim1,dim2)) # 表示创建一个5行6列的矩阵
print(jzdata)
##    C1 C2 C3 C4 C5 C6
## R1  1  6  1  6  1  6
## R2  2  7  2  7  2  7
## R3  3  8  3  8  3  8
## R4  4  9  4  9  4  9
## R5  5 10  5 10  5 10

表示创建一个5行6列的矩阵

3 访问矩阵元素


  矩阵的索引,其中索引值必须包含在括号内,中括号的第一个参数是行(Row,),第二个参数为列(,Column).

访问第二行第三列的矩阵元素

jzdata[2,3]      
## [1] 2

访问矩阵中1到2行与1到3列中的矩阵元素

jzdata[1:2,1:3]    
##    C1 C2 C3
## R1  1  6  1
## R2  2  7  2

访问矩阵中第二行的所有元素

jzdata[2,]         
## C1 C2 C3 C4 C5 C6 
##  2  7  2  7  2  7

访问矩阵中1到3行的所有元素

jzdata[c(1,3),]   
##    C1 C2 C3 C4 C5 C6
## R1  1  6  1  6  1  6
## R3  3  8  3  8  3  8

访问矩阵中第1列的矩阵元素

jzdata[,1]         
## R1 R2 R3 R4 R5 
##  1  2  3  4  5

访问矩阵中1到3列的矩阵元素

jzdata[,1:3]       
##    C1 C2 C3
## R1  1  6  1
## R2  2  7  2
## R3  3  8  3
## R4  4  9  4
## R5  5 10  5

4 矩阵的运算与处理


4.1 矩阵行和列的运算

rowSums()计算矩阵每一行的和生成一个新向量

colSums()计算矩阵每一列的和生成一个新向量

1)对行求和生成矩阵

rowTotal <- rowSums(jzdata)         #以列方式将每一行和向量接在矩阵之后形成有5列的新矩阵
newjzdata1 <- cbind(jzdata,rowTotal) # 以列方式将每一列和向量接在矩阵之后形成一个有新累加和列的矩阵
newjzdata1
##    C1 C2 C3 C4 C5 C6 rowTotal
## R1  1  6  1  6  1  6       21
## R2  2  7  2  7  2  7       27
## R3  3  8  3  8  3  8       33
## R4  4  9  4  9  4  9       39
## R5  5 10  5 10  5 10       45

2)对列求和生成矩阵

colTotal <- colSums(jzdata)
newjzdata2 <- rbind(jzdata,colTotal)# 以行方式将每一行和向量接在矩阵之后形成一个有新累加和行的矩阵
newjzdata2 
##          C1 C2 C3 C4 C5 C6
## R1        1  6  1  6  1  6
## R2        2  7  2  7  2  7
## R3        3  8  3  8  3  8
## R4        4  9  4  9  4  9
## R5        5 10  5 10  5 10
## colTotal 15 40 15 40 15 40

4.2 矩阵与常数的四则运算

矩阵对象与一般常数利用加、减、、乘、除进行运算时可与该常数分别执行运算即可。

1)矩阵jzdata+6

View(jzdata)
jzdata1 <- jzdata+6 # 给矩阵中所对应的位置的每个数字都加上6
jzdata1
##    C1 C2 C3 C4 C5 C6
## R1  7 12  7 12  7 12
## R2  8 13  8 13  8 13
## R3  9 14  9 14  9 14
## R4 10 15 10 15 10 15
## R5 11 16 11 16 11 16

2)矩阵jzdata1-2

jzdata2 <- jzdata1-2 # 给矩阵中所对应的位置的每个数字都减去2
jzdata2
##    C1 C2 C3 C4 C5 C6
## R1  5 10  5 10  5 10
## R2  6 11  6 11  6 11
## R3  7 12  7 12  7 12
## R4  8 13  8 13  8 13
## R5  9 14  9 14  9 14

3)矩阵jzdata2*3

jzdata3 <- jzdata2*3 # 给矩阵中所对应的位置的每个数字乘以3
jzdata3
##    C1 C2 C3 C4 C5 C6
## R1 15 30 15 30 15 30
## R2 18 33 18 33 18 33
## R3 21 36 21 36 21 36
## R4 24 39 24 39 24 39
## R5 27 42 27 42 27 42

4)矩阵jzdata3与3的商

jzdata4 <- jzdata3/3  # 给矩阵中所对应的位置的每个数字都除以3
jzdata1
##    C1 C2 C3 C4 C5 C6
## R1  7 12  7 12  7 12
## R2  8 13  8 13  8 13
## R3  9 14  9 14  9 14
## R4 10 15 10 15 10 15
## R5 11 16 11 16 11 16

5)两个矩阵相加:jzdata1+jzdata2

jzdata5 <- jzdata1+jzdata2  # 两个矩阵中所对应的位置的数字相加
jzdata5
##    C1 C2 C3 C4 C5 C6
## R1 12 22 12 22 12 22
## R2 14 24 14 24 14 24
## R3 16 26 16 26 16 26
## R4 18 28 18 28 18 28
## R5 20 30 20 30 20 30

6)两个矩阵相乘:jzdata1*jzdata2

jzdata5 <- jzdata1*jzdata2  # 两个矩阵中所对应的位置的数字相乘
jzdata5
##    C1  C2 C3  C4 C5  C6
## R1 35 120 35 120 35 120
## R2 48 143 48 143 48 143
## R3 63 168 63 168 63 168
## R4 80 195 80 195 80 195
## R5 99 224 99 224 99 224

7)矩阵和向量相乘:向量X和矩阵jzdata5相乘

X <- 1:5               # 从1到5创建向量
jzdata6 <- jzdata5*X   # 对矩阵每行数字乘以它相对应的元素。例如:第一行就乘以1,第5行乘以5
jzdata6
##     C1   C2  C3   C4  C5   C6
## R1  35  120  35  120  35  120
## R2  96  286  96  286  96  286
## R3 189  504 189  504 189  504
## R4 320  780 320  780 320  780
## R5 495 1120 495 1120 495 1120

5 矩阵转置


函数t()可以执行矩阵转置,矩阵转置后,矩阵的行列元素将相互对调。

查看矩阵jzdata5

print(jzdata5)  # jzdata5本是5行6列,需要将它转置后变为6行5列
##    C1  C2 C3  C4 C5  C6
## R1 35 120 35 120 35 120
## R2 48 143 48 143 48 143
## R3 63 168 63 168 63 168
## R4 80 195 80 195 80 195
## R5 99 224 99 224 99 224

将矩阵jzdata5进行转置变为6行5列

t(jzdata5)
##     R1  R2  R3  R4  R5
## C1  35  48  63  80  99
## C2 120 143 168 195 224
## C3  35  48  63  80  99
## C4 120 143 168 195 224
## C5  35  48  63  80  99
## C6 120 143 168 195 224