gpt4 book ai didi

r - 为什么在大型稀疏矩阵上的 R 行提取比将其分成较小的部分然后提取时要慢?

转载 作者:行者123 更新时间:2023-12-04 11:52:22 30 4
gpt4 key购买 nike

我正在使用“dgCMatrix”类的 19089 x 9432 稀疏矩阵(我们称之为 M),我必须提取每一行以对其进行一些计算。我用一个循环来做这件事,所以在每次迭代时我必须做类似 currentrow <- M[i,] 的事情。在其上应用循环体。计算非常耗时,所以我想尽可能地优化它,我意识到如果我首先将我的矩阵分成小块( M[1:100,]M[101:200,] 等...),然后我做了一个在每个较小的矩阵上循环(因此在每次迭代时调用 currentrow <- current_smallM[i,]),循环要快得多。
这是我运行以重现此代码示例:

library(Matrix)

N = 10000
M = 5000

# Creation of the large matrix (of class dgCMatrix)
largeMatrix <- Matrix(rnorm(N*M,mean=0,sd=1), byrow = TRUE, nrow = N, sparse = TRUE)


# We take into account the time for the creation of the smaller matrix, and then calculate the time to allocate the 200 rows to a variable
start.time = Sys.time()
smallMatrix = largeMatrix[100:200,]
for (i in 1:100){
test <- smallMatrix[i,]
}
end.time = Sys.time()
print(end.time - start.time) # 0.47 secs


# Same allocations but working on the large matrix
start.time = Sys.time()
for (i in 100:200){
test <- largeMatrix[i,]
}
end.time = Sys.time()
print(end.time - start.time) # 18.44 secs
你可以看到时差真的很大......所以我真的很想知道:
  • 为什么会这样?
  • 有没有比将我的矩阵分成更小的部分更有效的方法来存储我的数据?

  • 有趣的是,我用 matrix 测试了相同的代码。对象(使用 largeMatrix <- matrix( rnorm(N*M,mean=0,sd=1), N, M) ),结果完全不同:分割矩阵为 0.06 秒,大矩阵为 0.04 秒,所以我真的想知道稀疏表示有什么不同。
    注意:我发现了一个非常相似的问题 here但它使用的是不同的语言,并且(我认为)解决方案在这里不适用,因为它是由于隐式类型转换,而在这里我只是提取一行。
    感谢您的帮助!

    最佳答案

    dgCMatrix is a compressed sparse column format .它有一个 indptr有 X 个条目的数组,其中 X 是矩阵中的列数,还有一个 index标识每个非零值位置的数组,它有 N 个条目,其中 N 是数组中非零值的数量。
    这意味着每次你想用 对它进行切片时行 它需要遍历整个index数组并查找您要切片范围内的值。使用此 smallMatrix = largeMatrix[100:200,]将数组切片成一个较小的数组,其中 index数组要小得多,因此可以更快地遍历。
    您真正的问题是您试图从数据结构中获取行,这使您对行进行切片效率非常低,而对列进行切片效率很高。

    关于r - 为什么在大型稀疏矩阵上的 R 行提取比将其分成较小的部分然后提取时要慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68348927/

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