R語言中怎麼講矩陣變爲三元組(即三列: row, col, value)

bing上搜索:

矩陣怎麼變爲三元組形式, 在bing上搜索結果:

各種C語言, 完全找不到R語言的實現方法.

R語言寫循環很慢, 就用現成的包吧

Matrix

Matrix是一個很強大的包, 它可以將矩陣轉化爲稀疏矩陣, 將0變爲., 節約資源.

測試, 生成10*10的矩陣, 裏面有大量的0, 現在將其非0的地方轉化爲三元組的形式.

何謂三元組, 即使矩陣的轉化爲三列的形式, 本來矩陣是二維的, 現在將其行號抽取出來, 作爲第一列, 將其列號抽取出來, 作爲第二列, 對應的值抽取出來, 作爲第三列.

比如:

1 2
3 4

變爲三元組是:

1 1 1
1 2 2
2 1 3
2 2 4

測試數據

# 矩陣變爲三元組形式: R語言 Matrix
mm = matrix(sample(c(0,0,2),size = 100,replace = T),10,10)
# 假設是對稱矩陣, 只保留下三角, 所以講上三角爲0
mm[upper.tri(mm)] = 0
mm
> mm
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]    2    0    0    0    0    0    0    0    0     0
 [2,]    0    2    0    0    0    0    0    0    0     0
 [3,]    0    2    2    0    0    0    0    0    0     0
 [4,]    0    0    0    0    0    0    0    0    0     0
 [5,]    0    0    0    0    2    0    0    0    0     0
 [6,]    0    0    0    2    2    0    0    0    0     0
 [7,]    0    0    0    0    0    0    0    0    0     0
 [8,]    2    0    0    0    2    0    0    0    0     0
 [9,]    0    0    0    2    0    2    0    0    0     0
[10,]    0    0    0    0    0    0    0    2    2     0

轉化爲稀疏矩陣:

可以看到, 稀疏矩陣所有的0都變成了點號.

library(Matrix)
smm = Matrix(mm)
smm
> smm
10 x 10 sparse Matrix of class "dtCMatrix"
                         
 [1,] 2 . . . . . . . . .
 [2,] . 2 . . . . . . . .
 [3,] . 2 2 . . . . . . .
 [4,] . . . . . . . . . .
 [5,] . . . . 2 . . . . .
 [6,] . . . 2 2 . . . . .
 [7,] . . . . . . . . . .
 [8,] 2 . . . 2 . . . . .
 [9,] . . . 2 . 2 . . . .
[10,] . . . . . . . 2 2 .

將稀疏矩陣轉化爲三元組

# 變爲三元組
re = summary(smm)
sm = as.data.frame(re)
sm

結果:

> sm
    i j x
1   1 1 2
2   8 1 2
3   2 2 2
4   3 2 2
5   3 3 2
6   6 4 2
7   9 4 2
8   5 5 2
9   6 5 2
10  8 5 2
11  9 6 2
12 10 8 2
13 10 9 2

這應該是一個比較高效的方法.

完整代碼:

# 矩陣變爲三元組形式: R語言 Matrix
mm = matrix(sample(c(0,0,2),size = 100,replace = T),10,10)
mm

# 假設是對稱矩陣, 只保留下三角, 所以講上三角爲0
mm[upper.tri(mm)] = 0
mm

library(Matrix)
smm = Matrix(mm)
smm

# 變爲三元組
re = summary(smm)
sm = as.data.frame(re)
sm
library(dplyr)
arrange(sm,i,j)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章