1. 程式人生 > >R語言中矩陣常用的操作(筆記)

R語言中矩陣常用的操作(筆記)

1.1 矩陣的生成

生成一個4行4列的矩陣,這裡用1~16數字。

mat <- matrix(1:16,4,4)

mat
1 5 913
2 6 1014
3 7 1115
4 8 1216

1.2 提取主對角線

diag(mat)
  1. 1
  2. 6
  3. 11
  4. 16

1.3 生成對角線為1的對角矩陣

m1 <- diag(4)

m1
1000
0100
0010
0001

1.4 提取矩陣的下三角

mat[lower.tri(mat)]
  1. 2
  2. 3
  3. 4
  4. 7
  5. 8
  6. 12

1.5 提取矩陣上三角

mat[upper.tri(mat)]
  1. 5
  2. 9
  3. 10
  4. 13
  5. 14
  6. 15

1.6 以矩陣下三角構建對角矩陣

mat1 <- mat

mat1[upper.tri(mat1)] <- t(mat1)[upper.tri(mat1)]

原矩陣mat:

mat
1 5 913
2 6 1014
3 7 1115
4 8 1216

變換後的對角矩陣

mat1
1 2 3 4
2 6 7 8
3 7 1112
4 8 1216

1.7 將矩陣轉化為行列形式

原矩陣,生成三列:行,列,值

mat
1 5 913
2 6 1014
3 7 1115
4 8 1216

相關程式碼

nrow <- dim(mat)[1]

ncol <- dim(mat)[2]

row <- rep(1:nrow,ncol)

col <- rep(1:ncol, each=nrow)

frame <- data.frame(row,col,value
=as.numeric(mat)
)
frame
rowcolvalue
1 1 1
2 1 2
3 1 3
4 1 4
1 2 5
2 2 6
3 2 7
4 2 8
1 3 9
2 3 10
3 3 11
4 3 12
1 4 13
2 4 14
3 4 15
4 4 16

1.8 將三列形式轉化為矩陣

    nrow <- max(frame[, 1])

    ncol <- max(frame[, 2])

    y <- rep(0, nrow * ncol)

    y[(frame[, 2] - 1) * nrow + frame[, 1]] <- frame[, 3]

    y[(frame[, 1] - 1) * nrow + frame[, 2]] <- frame[, 3]

    matrix(y, nrow = nrow, ncol = ncol, byrow = T)
1 5 913
2 6 1014
3 7 1115
4 8 1216

1.9 將矩陣轉置

t(mat)
1 2 3 4
5 6 7 8
9101112
13141516

2.1 矩陣相加減

A=B=matrix(1:16,nrow=4,ncol=4)

A + B
2 101826
4 122028
6 142230
8 162432
A - B
0000
0000
0000
0000

2.2 數與矩陣相乘

c <- 2

c*A
2 101826
4 122028
6 142230
8 162432

3.3 矩陣相乘

A 為m × n矩陣,B為n× k矩陣,用符合“%*%”

A <- matrix(1:12,3,4)

B <- matrix(1:20,4,5)

A%*%B
70 158246334422
80 184288392496
90 210330450570

3.4 計算t(A)%*%B的方法

第一種,直接計算

A <- matrix(1:12,3,4)

B <- matrix(1:15,3,5)

t(A)%*%B
14 32 50 68 86
32 77122167212
50 122194266338
68 167266365464

第二種方法,用crossprod函式,資料量大時效率更高

A <- matrix(1:12,3,4)

B <- matrix(1:15,3,5)

crossprod(A,B)
14 32 50 68 86
32 77122167212
50 122194266338
68 167266365464

3.5 矩陣求逆

a <- matrix(rnorm(16),4,4)

solve(a)
-3.542393 5.8825038-3.2421870 6.9619170
1.081745 -2.2446318 1.4850549-2.0828270
-1.577580 2.4698567-0.7070850 2.5241525
-0.830685 0.5105919-0.3352182 0.5344842

矩陣與其逆矩陣的乘積為對角矩陣

round(solve(a)%*%a)
1000
0100
0010
0001

3.6 矩陣的廣義逆矩陣

對於奇異陣,並不存在逆矩陣,但是可以計算其廣義逆矩陣

a <- matrix(1:16,4,4)

solve(a)
Error in solve.default(a): Lapack例行程式dgesv: 系統正好是奇異的: U[3,3] = 0
Traceback:


1. solve(a)

2. solve.default(a)

顯示矩陣奇異,這裡可以使用MASS包的ginv計算其廣義逆矩陣

library(MASS)

a <- matrix(1:16,4,4)

ginv(a)
-0.285 -0.1075 0.07 0.2475
-0.145 -0.0525 0.04 0.1325
-0.005 0.0025 0.01 0.0175
0.135 0.0575-0.02 -0.0975

3.7 矩陣的直積(Kronecker,克羅內克積),使用函式kronecker計算

A 與B的直積:AB,LaTex寫作 “A \bigotimes B”

假設A為2X2矩陣

A <- matrix(c(10,5,5,20),2,2)

A
10 5
520

假設B為3X3矩陣

B <- matrix(c(1,0,2,0,1,4,2,4,1),3,3)

B
102
014
241

則A和B的直積就是6X6的矩陣

kronecker(A,B)
10 020 5 010
01040 0 520
2040101020 5
5 01020 040
0 520 02080
1020 5408020

3.8 矩陣的直和(direct sum)

公式:AB,在LaTex中是 “A \oplus B “

圖片.png

A <- matrix(c(1,2,3,3,2,1),2,3)

A
132
231
B <- matrix(c(1,0,6,1),2,2)

B
16
01
r1 <- dim(A)[1];c1 <- dim(A)[2]

r2 <- dim(B)[1];c2 <- dim(B)[2]

direct_sum <- rbind(cbind(A,matrix(0,r2,c2)),cbind(matrix(0,r1,c1),B))

direct_sum
13200
23100
00016
00001

歡迎關注我們
R語言與育種資料分析