R语言基础教程 | 数据结构—矩阵

矩阵是一个二维数组,只是(数值型、字符型逻辑型)。可通过函数matrix创建矩阵。一般使用格式为:

matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE,dimnames = NULL)

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

1.创建矩阵

创建1:16的矩阵,行为4行,先按行排列

> mat = matrix(1:16,nrow = 4,ncol = 4,byrow = TRUE)
> mat
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    5    6    7    8
[3,]    9   10   11   12
[4,]   13   14   15   16

2. 查看矩阵维数并更改列名

dim(mat)
length(mat)
colnames(mat) = c('a','b','c','d')
rownames(mat) = c('e','f','g','h')

# 查看维度
> dim(mat)
[1] 4 4


# 查看元素总个数
> length(mat)
[1] 16


#更改列名
> colnames(mat) = c('a','b','c','d') 

#更改行名
> rownames(mat) = c('e','f','g','h') 



> mat
   a  b  c  d
e  1  2  3  4
f  5  6  7  8
g  9 10 11 12
h 13 14 15 16
> dim.name = dimnames(mat)


> dim.name
[[1]]
[1] "e" "f" "g" "h"

[[2]]
[1] "a" "b" "c" "d"


> dim.name[[1]]
[1] "e" "f" "g" "h"

3. 矩阵的取值

#取第一行,第三列元素
> mat[1,3] 
[1] 3

#取第二行,所有列
> mat[2,] 
a b c d 
5 6 7 8 

#取第三列到第四列,所有行
> mat[,3:4]
   c  d
e  3  4
f  7  8
g 11 12
h 15 16

#当取不相邻矩阵的行和列可以用c()创建向量
> mat[c(1,3),c(2,4)] 
   b  d
e  2  4
g 10 12

# 除去第一行 和第二列不取,其他全取
> mat[-1,-2] 
   a  c  d
f  5  7  8
g  9 11 12
h 13 15 16

#也可以使用行名和列名来取
> mat['f','a'] 
[1] 5

4. 矩阵的运算-元素间运算

对矩阵的每个元素进行加减乘除,且顺序是按照列来算的。

#原始矩阵
> mat 
   a  b  c  d
e  1  2  3  4
f  5  6  7  8
g  9 10 11 12
h 13 14 15 16

 #每个元素乘以3
> mat*3
   a  b  c  d
e  3  6  9 12
f 15 18 21 24
g 27 30 33 36
h 39 42 45 48

#每一行均乘以1,2,3,4
> mat*c(1:4) 
   a  b  c  d
e  1  2  3  4
f 10 12 14 16
g 27 30 33 36
h 52 56 60 64

#对矩阵运算不会改变原矩阵
> mat 
   a  b  c  d
e  1  2  3  4
f  5  6  7  8
g  9 10 11 12
h 13 14 15 16

#如果需要保留矩阵运算之后的矩阵,需要额外命名
> mat1 = mat*c(1:4) 
> mat1
   a  b  c  d
e  1  2  3  4
f 10 12 14 16
g 27 30 33 36
h 52 56 60 64


> mat*c(1:16) #按列进行对应元素相乘
   a   b   c   d
e  1  10  27  52
f 10  36  70 112
g 27  70 121 180
h 52 112 180 256

> mat + 5
   a  b  c  d
e  6  7  8  9
f 10 11 12 13
g 14 15 16 17
h 18 19 20 21

> mat/3
          a         b        c        d
e 0.3333333 0.6666667 1.000000 1.333333
f 1.6666667 2.0000000 2.333333 2.666667
g 3.0000000 3.3333333 3.666667 4.000000
h 4.3333333 4.6666667 5.000000 5.333333

> mat/c(1:3) #如果维度不对应,会有警告
     a  b   c  d
e  1.0  1 1.0  4
f  2.5  2 7.0  4
g  3.0 10 5.5  4
h 13.0  7 5.0 16
Warning message:
In mat/c(1:3) :
  longer object length is not a multiple of shorter object length

5.矩阵运算-矩阵间运算

# 矩阵转置
> t(mat) 
  e f  g  h
a 1 5  9 13
b 2 6 10 14
c 3 7 11 15
d 4 8 12 16

# 矩阵与矩阵相乘
> mat%*%mat 
    a   b   c   d
e  90 100 110 120
f 202 228 254 280
g 314 356 398 440
h 426 484 542 600

> mat%*%c(1:4)
  [,1]
e   30
f   70
g  110
h  150

#求矩阵的行列式
> det(mat) 
[1] 4.733165e-30

#求矩阵的对角线元素
> diag(mat) 
[1]  1  6 11 16

#rnorm表示在R中生成标准正态分布(normolisation)的随机数
> mat2 = matrix(rnorm(16),nrow = 4) 
> mat2
           [,1]       [,2]       [,3]       [,4]
[1,]  0.5741146  0.7455864 -0.2572695 -0.2411344
[2,] -0.5871949 -0.2625235 -0.1101282  0.7889012
[3,]  1.8245782  0.2449119 -0.6392340 -0.1252946
[4,] -0.2336952  0.2484867 -1.2900628 -0.3219892


#求逆
> mat3 = solve(mat2) 
> mat3
           [,1]        [,2]       [,3]       [,4]
[1,] -0.1133153 -0.04712281  0.5378375 -0.2398813
[2,]  1.6648317  0.37849333 -0.4219256 -0.1552514
[3,]  0.2164346 -0.24894733 -0.2353717 -0.6804385
[4,]  0.4998786  1.32371081  0.2270614 -0.3251987


> mat2%*%mat3 
              [,1] [,2]          [,3]          [,4]
[1,]  1.000000e+00    0 -1.387779e-17 -2.775558e-17
[2,] -5.551115e-17    1  1.110223e-16  5.551115e-17
[3,] -1.387779e-17    0  1.000000e+00  0.000000e+00
[4,]  1.110223e-16    0 -1.387779e-17  1.000000e+00
#对行求均值
> rowMeans(mat) 
   e    f    g    h 
 2.5  6.5 10.5 14.5 

#对列求均值
> colMeans(mat)
 a  b  c  d 
 7  8  9 10 

#对行求和
> rowSums(mat) 
 e  f  g  h 
10 26 42 58 

#对列求和
> colSums(mat)
 a  b  c  d 
28 32 36 40 

参考:https://mp.weixin.qq.com/s?__biz=MzA4NDAzODkzMA==&mid=2651263668&idx=2&sn=7c39826f8fb73f95ca92efd0a7045ce5&chksm=841ef6c9b3697fdfa5b302de3608d348ce71417b254a1e6d87d202e851942da4bffbd8b9383d&scene=21#wechat_redirect

你可能感兴趣的:(R语言基础教程 | 数据结构—矩阵)