日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

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

 育種數(shù)據(jù)分析 2021-11-18

發(fā)現(xiàn)好久沒有更新微信文了, 所謂才思枯竭, 黔驢技窮就是我現(xiàn)在的狀態(tài). 記得看過這樣一句話: "如果你不知道寫什么東西, 那就寫不知道寫什么事情這件事吧". 深得我心.


分享一篇我CSND博客里面的R語言矩陣操作, 可以通過編程理解很多線性代數(shù)的概念. 這篇文章閱讀量2萬+, 而我的CSND博客閱讀量才10萬+, 可以看出博客的閱讀量分布不是正態(tài)的, 符合馬太效應(yīng).

1.1 矩陣的生成

生成一個(gè)4行4列的矩陣,這里用1~16數(shù)字。

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

mat
15913
261014
371115
481216

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 以矩陣下三角構(gòu)建對角矩陣

mat1 <- mat

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

原矩陣mat:

mat
15913
261014
371115
481216

變換后的對角矩陣

mat1
1234
2678
371112
481216

1.7 將矩陣轉(zhuǎn)化為行列形式

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

mat
15913
261014
371115
481216

相關(guān)代碼

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
111
212
313
414
125
226
327
428
139
2310
3311
4312
1413
2414
3415
4416

1.8 將三列形式轉(zhuǎn)化為矩陣

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)
15913
261014
371115
481216

1.9 將矩陣轉(zhuǎn)置

t(mat)
1234
5678
9101112
13141516

2.1 矩陣相加減

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

A + B
2101826
4122028
6142230
8162432
A - B
0000
0000
0000
0000

2.2 數(shù)與矩陣相乘

c <- 2c*A
2101826
4122028
6142230
8162432

3.3 矩陣相乘

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

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

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

A%*%B
70158246334422
80184288392496
90210330450570

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

第一種,直接計(jì)算

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

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

t(A)%*%B
1432506886
3277122167212
50122194266338
68167266365464

第二種方法,用crossprod函數(shù),數(shù)據(jù)量大時(shí)效率更高

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

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

crossprod(A,B)
1432506886
3277122167212
50122194266338
68167266365464

3.5 矩陣求逆

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

solve(a)
-3.5423935.8825038-3.24218706.9619170
1.081745-2.24463181.4850549-2.0828270
-1.5775802.4698567-0.70708502.5241525
-0.8306850.5105919-0.33521820.5344842

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

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

3.6 矩陣的廣義逆矩陣

對于奇異陣,并不存在逆矩陣,但是可以計(jì)算其廣義逆矩陣

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

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


1. solve(a)

2. solve.default(a)

顯示矩陣奇異,這里可以使用MASS包的ginv計(jì)算其廣義逆矩陣

library(MASS)

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

ginv(a)
-0.285-0.10750.070.2475
-0.145-0.05250.040.1325
-0.0050.00250.010.0175
0.1350.0575-0.02-0.0975

3.7 矩陣的直積(Kronecker,克羅內(nèi)克積),使用函數(shù)kronecker計(jì)算

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

假設(shè)A為2X2矩陣

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

A
105
520

假設(shè)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)
100205010
010400520
20401010205
501020040
052002080
10205408020

3.8 矩陣的直和(direct sum)

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

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

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請遵守用戶 評(píng)論公約

    類似文章 更多