R入门Day4:数据类型3---矩阵

20200510·Kony·Win10

矩阵

矩阵是一个二维数组,只是每个元素都拥有相同的模式(数值型、字符型或逻辑型)。可通过函数matrix()创建矩阵。一般使用格式为

mymatrix <- matrix(vector, nrow=number_of_rows, ncol=number_of_columns, 
                    byrow=logical_value, dimnames=list(
                      char_vector_rownames, char_vector_colnames))

参数说明

vector包含了矩阵的元素;
nrow和ncol用以指定行和列的维数;
dimnames包含了可选的、以字符型向量表示的行名和列名。
选项 byrow 则表明矩阵应当按行填充( byrow=TRUE )还是按列填充( byrow=FALSE ),默认情况下按列填充

1. 创建矩阵

matrix()

a<-matrix(c(1,2,3,4,5,6),nrow=2,byrow=T)
a
##      [,1] [,2] [,3]
## [1,]    1    2    3
## [2,]    4    5    6

dim()
通过dim来创建,先生成向量x,接着给向量x适当的维数,此例子中给向量的维数为5行,3列:

x <- 1:15
x # 建立x
##  [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15

dim(x) #查看x的维度

##  NULL

dim(x) <- c(5,3)   # 将向量x转化为5行3列的矩阵
x
##       [,1] [,2] [,3]
##  [1,]    1    6   11
##  [2,]    2    7   12
##  [3,]    3    8   13
##  [4,]    4    9   14
##  [5,]    5   10   15

2. 矩阵命名

Dimnames(Row_name,Col_name),给定行和列的名称,如果不需要给行或者列命名,则以NULL代替。

a<-c(1,2,3,4,5,6);
a
## [1] 1 2 3 4 5 6

a<-matrix(a,nrow=2,byrow=T,dimnames=list(c('a','b'),c('A','B','C')));
a
##   A B C
## a 1 2 3
## b 4 5 6

rownamescolnames实现

b
## [1] 2 3 4 5 6 7

b<-matrix(b,nrow=2)  # 将向量b转化为矩阵
b
##      [,1] [,2] [,3]
## [1,]    2    4    6
## [2,]    3    5    7

rownames(b)<-c("row_1","row_2") # 将矩阵行命名
colnames(b)<-c("col_1","col_2","col_3") # 将矩阵的列命名
b
     col_1 col_2 col_3
row_1     2     4     6
row_2     3     5     7

3. 参看矩阵

3.1 查看矩阵行/列相关信息

colnames(a) # 查看矩阵列名
## [1] "A" "B" "C"

rownames(a) # 查看矩阵行名
## [1] "a" "b"

3.2 查看矩阵的维度

dim(a) # 返回行与列数
## [1] 2 3

nrow(a) # 返回行数
## [1] 2

ncol(a) # 返回列数
## [1] 3

3.3 条件提取子集矩阵

a # 查看矩阵a
##   A B C
## a 1 2 3
## b 4 5 6

a[2,3] #取矩阵a的第行,第3个元素
## [1] 6

a[,1] #取矩阵a的第1列
## a b 
## 1 4

a[1,] # 取矩阵a的第1行
## A B C 
## 1 2 3

x<-c(1,2,3,4,5,6,7,8,8)
x<-matrix(x,nrow=3)
x

##      [,1] [,2] [,3]
## [1,]1    4    7
## [2,]2    5    8
## [3,]3    6    8

x[,3] # 选取矩阵的第3列
## [1] 7 8 8

x[3,] # 选取矩阵的第3行
## [1] 3 6 8

y<-x[,3,drop=FALSE] # 选取x矩阵的第3列,并返回一个矩阵给y
y

##      [,1]
## [1,]    7
## [2,]    8
## [3,]    8

x[,-1] # 不显示矩阵的第1列

##      [,1] [,2]

## [1,]4    7

## [2,]5    8

## [3,]6    8

x[-1,] # 不显示矩阵的第1行
##      [,1] [,2] [,3]
## [1,]2    5    8
## [2,]3    6    8

x[,-(1:2)] # 不显示矩阵的第1,2列
## [1] 7 8 8

z<-x[,-(1:2),drop=FALSE] #不显示矩阵x的第1,2列,并且返回为一矩阵y
z
##      [,1]
## [1,]    7
## [2,]    8
## [3,]    8

3.4 提取矩阵的行或列

nrowncol函数: nrow与ncol函数返回行或列的某一个数字。
NCOL****与NROW用于向量,即把向量作为单行的矩阵处理。
用法: nrow(x) ncol(x) NCOL(x) NROW(x)
参数: x:向量,或数据框; 值:长度为1或无的整数; 类似的有dim函数

ma <- matrix(1:12, 3, 4);ma # 建矩阵3行4列的矩阵

##      [,1] [,2] [,3] [,4]
## [1,]1    4    710
## [2,]2    5    811
## [3,]3    6    912

nrow(ma)   # 行数为3
## [1] 3

ncol(ma)   # 列数为4
## [1] 4

y <-array(1:24, dim = 2:4);y # 建2行4列的数组
## , , 1
## 
##      [,1] [,2] [,3]
## [1,]1    3    5
## [2,]2    4    6
## 
## , , 2
## 
##      [,1] [,2] [,3]
## [1,]7    9   11
## [2,]8   10   12
## 
## , , 3
## 
##      [,1] [,2] [,3]
## [1,]13   15   17
## [2,]14   16   18
## 
## , , 4
## 
##     [,1] [,2] [,3]
## [1,]19   21   23
## [2,]20   22   24

ncol(y)
## [1] 3

NCOL(1:12) # NCOL把数组作为单行的矩阵处理
## [1] 1

NROW(1:12) # 12
## [1] 12

4. 矩阵的运算

4.1 矩阵相乘 %*%

只有当矩阵a的列数与矩阵b的行数相等时a×b才有意义。
一个m×n的矩阵a(m,n)左乘一个n×p的矩阵b(n,p),会得到一个m×p的矩阵c(m,p),满足矩阵乘法满足结合律,但不满足交换律。
运算的法则:
矩阵a的第1行的3个元素(1,2,3)分别与矩阵b第1列的3个元素(1,2,3)相乘,其和为结果为e[1,1],即e[1,1]=1×1+2×2+3×3=14;
矩阵a的第1行的3个元素(1,2,3)分别与矩阵b第2列的3个元素(4,5,6)相乘1×4+2×5+3×6=32,得到e[1,2];
矩阵a的第2行的3个元素(4,5,6)分别与矩阵b第1列的3个元素(1,2,3)相乘4×1+5×2+6×3=32,得到e[2,1];
矩阵a的第2行的3个元素(4,5,6)分别与矩阵b第2列的3个元素(4,5,6)相乘4×4+5×5+6×6=77,得到e[2,2].

a
##   A B C
## a 1 2 3
## b 4 5 6

d <- c(1:6)
d <- matrix(d,nrow=3)
d

##      [,1] [,2]
## [1,]1    4
## [2,]2    5
## [3,]3    6

e<-a%*%d
e
##   [,1] [,2]
## a   14   32
## b   32   77

4.2 矩阵合并

m1<-matrix(1,nrow=2,ncol=2)

m1 # 建立矩阵m1,2行2列,值为1

##      [,1] [,2]
## [1,]1    1
## [2,]1    1

m2<-matrix(2,nrow=2,ncol=2)

m2 # 建立矩阵m2,2行2列,值为2

##      [,1] [,2]
## [1,]2    2
## [2,]2    2

m_rbind<-rbind(m1,m2);m_rbind # 对两个矩阵m1,m2进行行合并,即上下合并

##      [,1] [,2]
## [1,]1    1
## [2,]1    1
## [3,]2    2
## [4,]2    2

m_cbind<-cbind(m1,m2);m_cbind #对两个矩阵m1,m2进行列合并,即左右合并

##      [,1] [,2] [,3] [,4]
## [1,]1    1    22
## [2,]1    1    22

4.3 星号

把两个矩阵中每个对应的元素相乘,例子中a与b拥有相同的维度

a

##   A B C
## a 1 2 3
## b 4 5 6

b

##       col_1 col_2 col_3
## row_12     4     6
## row_23     5     7

result<-a*b #将矩阵a与矩阵b相乘,并将其结果给result
result

##    A  B  C
## a  2  8 18
## b 12 25 42

4.4 增加行与列

f<-matrix(,4,2) # 建立4行2列的空矩阵f
f

##      [,1] [,2]
## [1,]NA   NA
## [2,]NA   NA
## [3,]NA   NA
## [4,]NA   NA

f[c(1,3),]<-matrix(c(1,2,3,4)) #取f的1行与3行,将向量(1,2,3,4)填充进去,默认按列填充
f
##      [,1] [,2]
## [1,]1    3
## [2,]NA   NA
## [3,]2    4
## [4,]NA   NA

g<-matrix(,4,2)
g
##      [,1] [,2]
## [1,]NA   NA
## [2,]NA   NA
## [3,]NA   NA
## [4,]NA   NA

g[c(1,3),]<-matrix(c(1,2,3,4),byrow=FALSE) # byrow=FALSE则按行填充
g
##      [,1] [,2]
## [1,]1    3
## [2,]NA   NA
## [3,]2    4
## [4,]NA   NA

4.5 矩阵转置

f
##      [,1] [,2]
## [1,]1    3
## [2,]NA   NA
## [3,]2    4
## [4,]NA   NA

h<-t(f)
h
##      [,1] [,2] [,3] [,4]
## [1,]1   NA    2NA
## [2,]3   NA    4NA

4.6 取对角元素

j<-c(1,2,3,4,5,6,7,8,9)
j # 建立向量j
## [1] 1 2 3 4 5 6 7 8 9

j<-matrix(j,nrow=3)
j #建立3行3列矩阵
##      [,1] [,2] [,3]
## [1,]1    4    7
## [2,]2    5    8
## [3,]3    6    9

j_diag<-diag(j) #取对角
j_diag
## [1] 1 5 9

diag()函数其他用法

a <- c(1,4)
diag(a)
#       [,1] [,2]
#  [1,]   1   0
#  [2,]   0   4

4.7 求各行与列的总和与均值

j
##      [,1] [,2] [,3]
## [1,]1    4    7
## [2,]2    5    8
## [3,]3    6    9

rowSums(j) # 求各行的总和
## [1] 12 15 18

rowMeans(j) # 求行的均值
## [1] 4 5 6

colSums(j) #求各列的总和
## [1]  6 15 24

colMeans(j) #求各列的均值
## [1] 2 5 8

4.8 矩阵的特征值与特征向量

矩阵A的谱分解为A=UΛU,其中Λ是由A的特征值组成的对角矩阵,U的列为A的特征值对应的特征向量,在R中可以使用eigen()得到U和A,eigen(x,symmertic, only.values=FALSE,EISPACK=FALSE)
其中参数symmetric项是逻辑值,是F或T,它用于指定矩阵x是否为对称矩阵,如果不指定,系统将自动检验x是否为对称矩阵

eigen(j)
# ?eigen() decomposition
#  $values
#  [1]  1.611684e+01 -1.116844e+00 -5.700691e-16

#  $vectors
#             [,1]       [,2]       [,3]
#  [1,] -0.4645473 -0.8829060  0.4082483
#  [2,] -0.5707955 -0.2395204 -0.8164966
#  [3,] -0.6770438  0.4038651  0.4082483

4.9 矩阵的求逆

a<-matrix(1:8,2,4)
b<-matrix(2:9,4,2)
e<-a%*%b  ## a的行数与b的列数相同
a
##       [,1] [,2] [,3] [,4]
##  [1,]    1    3    5    7
##  [2,]    2    4    6    8

b
##       [,1] [,2]
##  [1,]    2    6
##  [2,]    3    7
##  [3,]    4    8
##  [4,]    5    9

e
##       [,1] [,2]
##  [1,]   66  130
##  [2,]   80  160

solve(e)
##       [,1]    [,2]
##  [1,]  1.0 -0.8125
##  [2,] -0.5  0.4125

参考:RVDSD的个人笔记

### 矩阵的choleskey分解

### 矩阵奇异值分解


### 矩阵QR分解

### 矩阵kronecker积

笔记参考:R语言基础--数据类型之矩阵

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。