gpt4 book ai didi

r - 当我们对稀疏矩阵执行 apply() 时,它会自动将其转换为密集矩阵吗?

转载 作者:行者123 更新时间:2023-12-04 11:38:29 26 4
gpt4 key购买 nike

关闭。这个问题需要更多 focused .它目前不接受答案。












想改进这个问题?更新问题,使其仅关注一个问题 editing this post .

5年前关闭。




Improve this question




运行以下代码:

aa = Matrix(0, nrow = 8000000, ncol = 100000, sparse = TRUE)
object.size(aa)
# 401424 bytes
apply(aa, 1, mean)

我收到此错误:

Error in asMethod(object) : Cholmod error 'problem too large' at file ../Core/cholmod_dense.c, line 105



在这种情况下, aa 的大小不是太大,因此我猜 apply函数自动将其转换为密集矩阵。有什么办法可以使这个工作吗?我知道 rowMeans可以轻松替换 apply(aa, 1, mean)在这里,但是如果我想应用一些其他自定义功能怎么办?

最佳答案

如果你看apply没有 ()当您调用 apply() 时,您可以看到实际发生的情况。

function (X, MARGIN, FUN, ...) 
{
FUN <- match.fun(FUN)
dl <- length(dim(X))
if (!dl)
stop("dim(X) must have a positive length")
if (is.object(X))
X <- if (dl == 2L)
as.matrix(X)
else as.array(X)
...

我省略了其余部分,但正如您所见,在函数调用的早期, apply转换对象 x使用 as.matrix 放入数组或矩阵中或 as.array .这会强制 aa来自类(class) dgCMatrix上课 matrix没有 sparse争论。本质上,您的代码相当于运行 apply()在 R 中的常规矩阵上,但是如果你尝试
bb = matrix(0, nrow = 8000000, ncol = 100000)

你得到
Error: cannot allocate vector of size 5960.5 Gb
In addition: Warning messages:
1: In matrix(0, nrow = 8e+06, ncol = 1e+05) :
Reached total allocation of 8075Mb: see help(memory.size)

...
没有其他一些警告。

Matrix 的文档中我们有的包裹,

Even base functions may work automagically (if they first call as.matrix() on their principal argument), e.g., apply, eigen, svd or kappa all do work via coercion to a “traditional” (dense) matrix.



这与上面所说的一致。您遇到的问题是当 apply()被调用,它首先创建了一个矩阵,但是它试图制作的矩阵太大了,无法完成功能。如果您的目标是在大型稀疏矩阵上计算自定义函数,我感觉您将不得不在没有 apply() 帮助的情况下完成它。职能。

关于r - 当我们对稀疏矩阵执行 apply() 时,它会自动将其转换为密集矩阵吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37635612/

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