gpt4 book ai didi

R矩阵。将稀疏矩阵的特定元素设置为零。

转载 作者:行者123 更新时间:2023-12-02 06:54:45 24 4
gpt4 key购买 nike

我有相当大的稀疏矩阵( dgCMatrixdgTMatrix ,但这在这里不是很重要)。我想将一些元素设置为零。
例如我有 3e4 * 3e4矩阵,它是上三角并且非常密集:~23% 的元素不为零。 (实际上我有更大的矩阵 ~ 1e5 * 1e5 ,但它们更稀疏)所以在三元组中 dgTMatrix形成它需要大约 3.1gb 的 RAM。现在我想将所有小于某个阈值的元素设置为零(比如 1 )。

  1. 非常幼稚的方法(也讨论过 here )如下:

    threshold <- 1
    m[m < threshold] <- 0

    但是这个解决方案远非完美 - 130 秒 运行时间(在有足够 ram 的机器上,所以没有交换)而且更重要的是需要 ~ 25-30gb 额外的 RAM

  2. 我发现的第二个解决方案(并且很高兴)更有效 - 从头开始​​构建新矩阵:

    threshold <- 1
    ind <- which(m@x > threshold)
    m <- sparseMatrix(i = m@i[ind], j = m@j[ind], x = m@x[ind],
    dims = m@Dim, dimnames = m@Dimnames,
    index1 = FALSE,
    giveCsparse = FALSE,
    check = FALSE)

    仅需 ~ 6 秒并且需要~ 5gb 额外 RAM。

问题是 - 我们可以做得更好吗?特别有趣的是,我们是否可以使用更少的 RAM 来做到这一点?如果能够就地执行此操作,那就太完美了。

最佳答案

像这样:

library(Matrix)
m <- Matrix(0+1:28, nrow = 4)
m[-3,c(2,4:5,7)] <- m[ 3, 1:4] <- m[1:3, 6] <- 0
(m <- as(m, "dgTMatrix"))
m
#4 x 7 sparse Matrix of class "dgTMatrix"
#
#[1,] 1 . 9 . . . .
#[2,] 2 . 10 . . . .
#[3,] . . . . 19 . 27
#[4,] 4 . 12 . . 24 .

threshold <- 5
ind <- m@x <= threshold
m@x <- m@x[!ind]
m@i <- m@i[!ind]
m@j <- m@j[!ind]
m
#4 x 7 sparse Matrix of class "dgTMatrix"
#
#[1,] . . 9 . . . .
#[2,] . . 10 . . . .
#[3,] . . . . 19 . 27
#[4,] . . 12 . . 24 .

您只需要 ind 向量的 RAM。如果你想避免这种情况,你需要一个循环(可能在 Rcpp 中以提高性能)。

关于R矩阵。将稀疏矩阵的特定元素设置为零。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33775291/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com