R-二分稀疏矩阵

R-二分稀疏矩阵,r,sparse-matrix,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 这似乎是工作,但由于矩阵是非常大的,它需要至少几个小时到目前为止,它仍然是计算,因为我问这个问题的帮助 你知道更好的方法或技巧来完成这项任务吗 谢谢大家 虽然您的问题

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

我还试着写一个简单的算法,比如

for ( i in 1:500)
for (j in 1:53380)
if (matrix[i,j]>0) matrix[i,j]=1
这似乎是工作,但由于矩阵是非常大的,它需要至少几个小时到目前为止,它仍然是计算,因为我问这个问题的帮助

你知道更好的方法或技巧来完成这项任务吗


谢谢大家

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

如果是这种情况,您可以在几秒钟内处理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

mr考虑向量化,只使用索引。例如:

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,那么您可以在
Mat@x
作为向量。
例如,
ix_low处理正式定义的稀疏矩阵的一种简单方法是使用
as
命令将矩阵强制为逻辑矩阵,然后返回到数字或整数矩阵

这太棒了。我现在意识到我只是浪费了几个小时:)我真希望我早点在这里写。非常感谢。我可以采取什么步骤来学习像这样的技巧,是否有任何文档在那里,或者在我前进的过程中,这是我必须了解的东西?再次感谢。@user808562这实际上在R手册的
介绍中有描述
谢谢,这太棒了。我不敢相信我在R屏幕前浪费了这么多时间。就这么简单:)我去过那里。我在那里呆得太久了还有一个简单的问题,如果我想对同一矩阵的每一列求和,并将其放入一个向量中,该怎么办。也就是说,如果第一列中的元素和是5,第二列是4,…我将得到一个和向量[5,4,…]
colSums()
将是我的首选。阅读
?colSums
@user808562同样,如果他们解决了问题,请接受其中一个答案(至少有两个答案已经解决)。勾选每个答案左边的勾号@安德烈是第一个提出解决方案的人…+1我刚刚了解了“二分法”的含义:)
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