R二分法稀疏矩阵

时间:2011-06-21 14:06:54

标签: r sparse-matrix

我有一个500x53380的稀疏矩阵并尝试对其进行二分法。我尝试在sna包下使用“event2dichot”但没有成功,因为它需要一个邻接矩阵或网络对象。

我也试过写一个像

这样的简单算法
for ( i in 1:500)
for (j in 1:53380)
if (matrix[i,j]>0) matrix[i,j]=1

这似乎是有效的,但由于矩阵非常大,到目前为止至少需要几个小时,而且它还在计算,因为我在问这个问题求助!

你知道更好的方法或黑客来完成这项任务吗?

谢谢大家。

4 个答案:

答案 0 :(得分:3)

虽然您的问题是关于稀疏矩阵,但在我看来,您的代码实际上描述了一个标准矩阵。

如果是这种情况,您可以在几秒钟内处理500x53380矩阵。以下代码利用矩阵在R内部存储为向量的事实。这意味着您可以在整个矩阵上应用单个向量函数。需要注意的是,您必须在之后恢复矩阵尺寸。

以下是一个更小矩阵的插图:

mr <- 5
mc <- 8

mat <- matrix(round(rnorm(mr*mc), 3), nrow=mr)
mat

       [,1]   [,2]   [,3]   [,4]   [,5]   [,6]   [,7]   [,8]
[1,] -1.477  1.773  1.630 -0.152  1.054  0.057 -1.260  0.999
[2,] -1.863 -0.312 -0.221 -0.102  0.892 -1.255  0.996 -0.193
[3,] -0.364 -0.059  2.317  1.156  0.893  0.225  0.392 -1.986
[4,] -1.123 -0.661  0.070  0.032  0.019 -1.763 -0.205  0.951
[5,] -0.111 -3.112 -0.970 -0.794 -1.372 -0.119  1.291 -0.680

mydim <- dim(mat)
mat[mat>0] <- 1
mat[mat<0] <- 0
dim(mat) <- mydim
mat

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    0    1    1    0    1    1    0    1
[2,]    0    0    0    0    1    0    1    0
[3,]    0    0    1    1    1    1    1    0
[4,]    0    0    1    1    1    0    0    1
[5,]    0    0    0    0    0    0    1    0

在我的机器上重复这个500x53380矩阵的整个过程大约需要12秒:

mr <- 500
mc <- 53380

system.time({
  mat <- matrix(round(rnorm(mr*mc), 3), nrow=mr)
  mydim <- dim(mat)
  mat[mat>0] <- 1
  mat[mat<0] <- 0
  dim(mat) <- mydim
})

   user  system elapsed 
  12.25    0.42   12.88 

答案 1 :(得分:2)

思考矢量化,并仅使用索引。 E.g:

mat <- matrix(0, nrow = 500, ncol = 53380)
set.seed(7)
fill <- sample(500*53380, 10000)
mat[fill] <- sample(fill, 1:10, replace = TRUE)

可以使用以下方式离散:

mat[mat > 0] <- 1

我的工作站上的速度非常快:

> system.time(mat[mat > 0] <- 1)
   user  system elapsed 
  1.680   0.166   1.875

答案 2 :(得分:2)

如果您使用Matrix包,矩阵是 - 比如Mat,那么您可以在Mat@x上作为向量进行操作。 例如。 ix_low <- (Mat@x < threshold), then Mat@x[ix_low] = 0, Mat@x[!ix_low] = 1

关键是你在查看稀疏矩阵时会以错误的方式思考。 典型的表示是(i,j,value)。

你只是在看触摸值向量 - 不要迭代其他任何东西。

答案 3 :(得分:0)

使用正式定义的稀疏矩阵(即在基数“Matrix”中生成的矩阵,使用大写M而不是较旧的基础“matrix”)的一种简单方法是强制执行使用as命令将矩阵转换为逻辑,然后返回数值或整数矩阵。