R語言中矩陣的常規操作


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
[3,]    5    7    9
> 3 * mat1       ## 矩陣與數值的乘法
     [,1] [,2] [,3]
[1,]   30   24   18
[2,]   12    6    3
[3,]   15   21   27
> mat1 * 2
     [,1] [,2] [,3]
[1,]   20   16   12
[2,]    8    4    2
[3,]   10   14   18

 

14、矩陣與矩陣的乘法(矩陣與矩陣乘法的前提是左側矩陣的列數等於右側矩陣的行數, 因為乘積的每一項為左側矩陣每一列的元素與右側矩陣每一行元素乘積之和,所以必須一一對應, 矩陣相乘的結果矩陣維度為:等於左側矩陣的行數, 由於右側矩陣的列數

> mat1 <- matrix(sample(1:6,6), nrow = 2, ncol = 3, byrow = T)  ## 生成2行3列矩陣 > mat1
     [,1] [,2] [,3]
[1,]    6    5    4
[2,]    1    3    2
> mat2 <- matrix(sample(1:6,12, replace = T), nrow = 3, ncol = 4, byrow = T)  ## 生成3行4列矩陣 > mat2
     [,1] [,2] [,3] [,4]
[1,]    6    4    4    6
[2,]    3    1    2    4
[3,]    3    2    5    5
> mat1 %*% mat2       ## 左側矩陣列數3, 右側矩陣函數3,因此可以相乘; 左側矩陣2行, 右側矩陣4列, 因此結果為2行4列; 結果中每一項為左側矩陣行 和 右側矩陣列乘積之和
     [,1] [,2] [,3] [,4]
[1,]   63   37   54   76
[2,]   21   11   20   28

 

15、t(A) %*% B的方法

> A <- matrix(1:12,3,4)   ## A為3行4列矩陣 > A
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12
> B <- matrix(1:15,3,5)   ## B為3行5列矩陣 > B
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    4    7   10   13
[2,]    2    5    8   11   14
[3,]    3    6    9   12   15
> t(A) %*% B        #A的列數不等於B的行數,無法相乘,A轉置,變為4行3列矩陣, 列數等於B的行數, 可以相乘
     [,1] [,2] [,3] [,4] [,5]
[1,]   14   32   50   68   86
[2,]   32   77  122  167  212
[3,]   50  122  194  266  338
[4,]   68  167  266  365  464

 

使用crossprod函數計算:

> A <- matrix(1:12,3,4)
> A
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12
> B <- matrix(1:15,3,5)
> B
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    4    7   10   13
[2,]    2    5    8   11   14
[3,]    3    6    9   12   15
> t(A) %*% B
     [,1] [,2] [,3] [,4] [,5]
[1,]   14   32   50   68   86
[2,]   32   77  122  167  212
[3,]   50  122  194  266  338
[4,]   68  167  266  365  464
> crossprod(A,B) ## 與t(A) %*% B的結果相等,據說速度更快
     [,1] [,2] [,3] [,4] [,5]
[1,]   14   32   50   68   86
[2,]   32   77  122  167  212
[3,]   50  122  194  266  338
[4,]   68  167  266  365  464

 

16、矩陣求逆(給定n階方陣A,若存在n階方陣B滿足AB = BA = I,則稱A為可逆矩陣,且稱B為A的逆矩陣)。 矩陣A與它的逆矩陣的乘積為單位矩陣,單位矩陣為對角線元素為1,其余元素為0的矩陣

> mat1 <- matrix(sample(1:10, 16, replace = T), 4, 4, byrow = T)  ## 生成4行4列矩陣 > mat1
     [,1] [,2] [,3] [,4]
[1,]    2    3    9    6
[2,]    8    4    4   10
[3,]    6    2    3    2
[4,]    3    6    5    3
> mat2 <- solve(mat1)   ## 使用solve函數生成矩陣mat1的逆矩陣mat2 > mat2
            [,1]         [,2]        [,3]        [,4]
[1,] -0.04219409 -0.002109705  0.20675105 -0.04641350
[2,] -0.10829817  0.011251758 -0.10267229  0.24753868
[3,]  0.14345992 -0.092827004  0.09704641 -0.04219409
[4,]  0.01969058  0.134317862 -0.16315049 -0.04500703
> mat1 %*% mat2
              [,1]         [,2]         [,3]          [,4]
[1,]  1.000000e+00 0.000000e+00 1.110223e-16 -5.551115e-17
[2,]  0.000000e+00 1.000000e+00 0.000000e+00 -5.551115e-17
[3,] -4.163336e-17 5.551115e-17 1.000000e+00 -8.326673e-17
[4,]  4.857226e-17 5.551115e-17 5.551115e-17  1.000000e+00
> round(mat1 %*% mat2, 5)     ## 測試,矩陣與其逆矩陣的乘積為單位矩陣
     [,1] [,2] [,3] [,4]
[1,]    1    0    0    0
[2,]    0    1    0    0
[3,]    0    0    1    0
[4,]    0    0    0    1

 

參考:https://blog.csdn.net/yijiaobani/article/details/78880004

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM