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)