Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何根据R中稀疏矩阵的阈值替换行值?_R_Optimization_Sparse Matrix_Memory Efficient - Fatal编程技术网

如何根据R中稀疏矩阵的阈值替换行值?

如何根据R中稀疏矩阵的阈值替换行值?,r,optimization,sparse-matrix,memory-efficient,R,Optimization,Sparse Matrix,Memory Efficient,我有一个非常大的稀疏矩阵(40000x100000+),如果一个元素大于某个阈值,我想用1替换它。但是,矩阵中的每一行都有一个唯一的阈值(这只是一个表示行长度的向量),因此我想逐行检查特定行的元素是否大于该行的唯一阈值 我最初尝试使用for循环来解决这个问题,通过遍历稀疏矩阵的所有非零元素,但这花费了太长时间,因为我有超过1亿个元素要遍历 number_of_elem <- matrix@x %>% length() for (j in 1:number_of_elem){ t

我有一个非常大的稀疏矩阵(40000x100000+),如果一个元素大于某个阈值,我想用1替换它。但是,矩阵中的每一行都有一个唯一的阈值(这只是一个表示行长度的向量),因此我想逐行检查特定行的元素是否大于该行的唯一阈值

我最初尝试使用for循环来解决这个问题,通过遍历稀疏矩阵的所有非零元素,但这花费了太长时间,因为我有超过1亿个元素要遍历

number_of_elem <- matrix@x %>% length()
for (j in 1:number_of_elem){

  threshold <- thres_array[j] 

  if (threshold == 0){
    next
  }

  if (matrix@x[j] > threshold){

    matrix@x[j] <- 1

  }

}
元素数%length()
for(j in 1:元素数){
阈值(阈值){

matrix@x[j] 你说得对,在R中,通常更倾向于将代码矢量化。幸运的是,如果我正确理解了你的问题,在这种情况下,这很容易做到

由于您没有提供任何数据(请以后提供),我在下面生成了一个阈值数组
thres_数组
和一个矩阵
mat

thres\u数组
的每个条目与整个
mat行
进行比较就是
mat>thres\u数组
的问题,也可以在一行中应用阈值。
通过将
thres\u数组中的零替换为
Inf
,我们确保
mat>thres\u数组中的零永远不会为真,因此跳过这些值

thres_array <- 0:9
mat <- matrix(runif(1000, max = 10), nrow = 10)

# get rid of zeros
thres_array[thres_array == 0] <- Inf

# apply threshold
mat[mat > thres_array] <- 1

我修改了@Bas解决方案,以便它利用矩阵的稀疏性来提高性能

mat@x[mat@x > thres_array[mat@i + 1] ] <- 1

mat@x[mat@x>thres_阵列[mat@i+1]]thres_阵列[mat@i+1]
并将这些值重新分配到1。

什么是
类(矩阵)
?>类(矩阵)[1]“dgCMatrix”属性(,“package”)[1]“矩阵”你提出的方法在理论上是可行的,但由于矩阵太大,我一直有内存问题。我想知道是否有办法利用稀疏矩阵的插槽特性。比如mat@x给出非零值和mat@i给出非零元素所属行的索引。好的,很清楚。抱歉没有拾取该索引。U幸运的是,我对R中的稀疏矩阵一无所知。我将保留这个答案,也许将来会有其他人从中受益。
mat@x[mat@x > thres_array[mat@i + 1] ] <- 1