• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

R语言中矩阵的常规操作

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

1、生成矩阵,使用matrix函数

> set.seed(111)                  ## 设定随机数种子
> vect <- sample(1:10,16, replace = T)
> vect
 [1]  4  3  9  5  3  8 10  1 10  4  8 10  9  8  1  7
> dat <- matrix(vect, nrow = 4, ncol = 4, byrow = T,        ## 生成4行4列矩阵,矩阵行列相同,也叫方阵,并指定行名、列名
+               dimnames = list(paste0("r",1:4), paste0("c",1:4)))
> dat
   c1 c2 c3 c4
r1  4  3  9  5
r2  3  8 10  1
r3 10  4  8 10
r4  9  8  1  7
> class(dat)
[1] "matrix" "array" 

 

2、提取主对角线元素

> dat
   c1 c2 c3 c4
r1  4  3  9  5
r2  3  8 10  1
r3 10  4  8 10
r4  9  8  1  7
> class(dat)
[1] "matrix" "array" 
> diag(dat)    ## 提取主对角线元素
[1] 4 8 8 7

 

3、提取副对角线元素

> dat
   c1 c2 c3 c4
r1  4  3  9  5
r2  3  8 10  1
r3 10  4  8 10
r4  9  8  1  7
> diag(dat[,ncol(dat):1])   ## 先列逆向输出,然后取对角线
[1]  5 10  4  9

 

4、生成对角线为1的对角矩阵(对角矩阵条件:1、矩阵行、列相等,即方阵  2、除对角线元素外其余元素全部为0

> test1 <- diag(4)    ## 生成对角线元素为1的4行4列对角元素
> test1
     [,1] [,2] [,3] [,4]
[1,]    1    0    0    0
[2,]    0    1    0    0
[3,]    0    0    1    0
[4,]    0    0    0    1
> class(test1)
[1] "matrix" "array" 
> dim(test1)
[1] 4 4

 

5、提取矩阵的下三角矩阵、上三角矩阵

> dat
   c1 c2 c3 c4
r1  4  3  9  5
r2  3  8 10  1
r3 10  4  8 10
r4  9  8  1  7
> dat[lower.tri(dat)]    ## 提取下三角矩阵
[1]  3 10  9  4  8  1
> dat[upper.tri(dat)]    ## 提取上三角矩阵
[1]  3  9 10  5  1 10

 

6、矩阵转置(即行列互换)

> dat
   c1 c2 c3 c4
r1  4  3  9  5
r2  3  8 10  1
r3 10  4  8 10
r4  9  8  1  7
> t(dat)       ## 矩阵转置
   r1 r2 r3 r4
c1  4  3 10  9
c2  3  8  4  8
c3  9 10  8  1
c4  5  1 10  7

 

7、以矩阵下三角矩阵构建对称矩阵(对称矩阵:指以主对角线为对称轴,各元素对应相等的矩阵。

> test <- dat
> test
   c1 c2 c3 c4
r1  4  3  9  5
r2  3  8 10  1
r3 10  4  8 10
r4  9  8  1  7
> test[upper.tri(test)] <- t(test)[upper.tri(test)]    ## 将test上对角矩阵 赋值为test转置后的上对角矩阵
> test
   c1 c2 c3 c4
r1  4  3 10  9
r2  3  8  4  8
r3 10  4  8  1
r4  9  8  1  7

 

8、以矩阵的上对角矩阵构建对称矩阵

> test <- dat
> test
   c1 c2 c3 c4
r1  4  3  9  5
r2  3  8 10  1
r3 10  4  8 10
r4  9  8  1  7
> test[lower.tri(test)] <- t(test)[lower.tri(test)]     ## 同上
> test
   c1 c2 c3 c4
r1  4  3  9  5
r2  3  8 10  1
r3  9 10  8 10
r4  5  1 10  7

 

9、将矩阵转换成行索引、列索引、值的形式

(1)列优先

> test <- dat
> test
   c1 c2 c3 c4
r1  4  3  9  5
r2  3  8 10  1
r3 10  4  8 10
r4  9  8  1  7
> r <- rep(1:nrow(test), times = ncol(test))   ## 生成行的索引,优先按列输出
> r
 [1] 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4
> c <- rep(1:ncol(test), each = nrow(test))    ## 生成列的索引,优先按列输出
> c
 [1] 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4
> values <- test[1:(nrow(test)*ncol(test))]    ## 输出矩阵的每一个值,优先按列输出
> values
 [1]  4  3 10  9  3  8  4  8  9 10  8  1  5  1 10  7
> result <- data.frame(r, c, values)
> result      ## 结果文件
   r c values
1  1 1      4
2  2 1      3
3  3 1     10
4  4 1      9
5  1 2      3
6  2 2      8
7  3 2      4
8  4 2      8
9  1 3      9
10 2 3     10
11 3 3      8
12 4 3      1
13 1 4      5
14 2 4      1
15 3 4     10
16 4 4      7

 

(2)、行优先

> test <- dat
> test
   c1 c2 c3 c4
r1  4  3  9  5
r2  3  8 10  1
r3 10  4  8 10
r4  9  8  1  7
> r <- rep(1:nrow(test), each = ncol(test))    ## 生成行索引,行优先
> r
 [1] 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4
> c <- rep(1:ncol(test), time = nrow(test))    ## 生成列索引,行优先
> c
 [1] 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4
> values <- vector()
> for (i in 1:nrow(test)) {                    ## 利用双循环按行优先导出矩阵的值
+   for (j in 1:ncol(test)) {
+     values <- c(values, test[i,j])
+   }
+ }
> values
 [1]  4  3  9  5  3  8 10  1 10  4  8 10  9  8  1  7
> result <- data.frame(r, c, values)
> result    ## 结果文件
   r c values
1  1 1      4
2  1 2      3
3  1 3      9
4  1 4      5
5  2 1      3
6  2 2      8
7  2 3     10
8  2 4      1
9  3 1     10
10 3 2      4
11 3 3      8
12 3 4     10
13 4 1      9
14 4 2      8
15 4 3      1
16 4 4      7

 

10、将三列的矩阵(列优先)形式转换为矩阵形式

> test <- dat
> test
   c1 c2 c3 c4
r1  4  3  9  5
r2  3  8 10  1
r3 10  4  8 10
r4  9  8  1  7
> r <- rep(1:nrow(test), time = ncol(test) )
> r
 [1] 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4
> c <- rep(1:ncol(test), each = nrow(test))
> c
 [1] 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4
> values <- as.numeric(dat)
> values
 [1]  4  3 10  9  3  8  4  8  9 10  8  1  5  1 10  7
> result <- data.frame(r, c, values)
> result    ## 三列的形式,列优先
   r c values
1  1 1      4
2  2 1      3
3  3 1     10
4  4 1      9
5  1 2      3
6  2 2      8
7  3 2      4
8  4 2      8
9  1 3      9
10 2 3     10
11 3 3      8
12 4 3      1
13 1 4      5
14 2 4      1
15 3 4     10
16 4 4      7
> if (all(result[,2] == sort(result[,2]))) {       ## 利用第二列判断是否是列优先
+   row <- max(result[,1])
+   col <- max(result[,1])
+   re_matrix <- matrix(result[,3], nrow = row, ncol = col, byrow = F)  ## byrow = F,表示按列优先输出
+ }
> re_matrix
     [,1] [,2] [,3] [,4]
[1,]    4    3    9    5
[2,]    3    8   10    1
[3,]   10    4    8   10
[4,]    9    8    1    7

 

11、将三列的矩阵(行优先)形式转换为矩阵形式

> test <- dat
> test
   c1 c2 c3 c4
r1  4  3  9  5
r2  3  8 10  1
r3 10  4  8 10
r4  9  8  1  7
> r <- rep(1:nrow(test), each = ncol(test))
> r
 [1] 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4
> c <- rep(1:ncol(test), times = nrow(test))
> c
 [1] 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4
> values <- vector()
> for (i in 1:nrow(test)) {
+   for(j in 1:ncol(test)){
+     values <- c(values, test[i,j])
+   }
+ }
> values
 [1]  4  3  9  5  3  8 10  1 10  4  8 10  9  8  1  7
> result <- data.frame(r, c, values)
> result   ## 行优先的三列矩阵
   r c values
1  1 1      4
2  1 2      3
3  1 3      9
4  1 4      5
5  2 1      3
6  2 2      8
7  2 3     10
8  2 4      1
9  3 1     10
10 3 2      4
11 3 3      8
12 3 4     10
13 4 1      9
14 4 2      8
15 4 3      1
16 4 4      7
> if (all(result[,2] != sort(result[,2]))) {    ## 如果第二列不是排好序,则说明是行优先
+   row <- mas(result[,1])
+   col <- max(result[,2])
+   re_matrix <- matrix(result[,3], nrow = row, ncol = col, byrow = T)   ## byrow = T,表示按行优先输出
+ }
> re_matrix
     [,1] [,2] [,3] [,4]
[1,]    4    3    9    5
[2,]    3    8   10    1
[3,]   10    4    8   10
[4,]    9    8    1    7

 

12、矩阵加法、减法运算(矩阵加减法运算前提是两个矩阵维度一致,即同行同列)

> mat1 <- matrix(sample(1:10,9), nrow = 3, ncol = 3, byrow = T)  ## 生成3行3列矩阵
> mat1
     [,1] [,2] [,3]
[1,]    4    9   10
[2,]    2    7    6
[3,]    8    1    3
> mat2 <- matrix(sample(1:10,9), nrow = 3, ncol = 3, byrow = T)  ## 生成3行3列矩阵
> mat2
     [,1] [,2] [,3]
[1,]    7    5    9
[2,]    1    4    2
[3,]    6    8   10
> mat1 + mat2      ## 矩阵加法运算
     [,1] [,2] [,3]
[1,]   11   14   19
[2,]    3   11    8
[3,]   14    9   13
> mat1 - mat2       ## 矩阵减法运算
     [,1] [,2] [,3]
[1,]   -3    4    1
[2,]    1    3    4
[3,]    2   -7   -7

 

13、矩阵与数值的乘法运算

> mat1 <- matrix(sample(1:10, 9), ncol = 3, nrow = 3, byrow = T)      ## 生成3行3列矩阵
> mat1
     [,1] [,2] [,3]
[1,]   10    8    6
[2,]    4    2    1
                      

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
R语言中apply函数发布时间:2022-07-18
下一篇:
R语言实战(二)数据管理发布时间:2022-07-18
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap