当我们对稀疏矩阵应用()时,会自动将其转换为密集矩阵吗?

Eri*_* He 4 r matrix

运行以下代码:

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

我收到此错误:

asMethod(object)出错:文件中的Cholmod错误'问题太大'../Core/cholmod_dense.c,第105行

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

Bry*_*gin 5

如果你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)
...
Run Code Online (Sandbox Code Playgroud)

我放弃了其余的,但正如你所看到的,在函数调用的早期,apply将对象x转换为带as.matrix或的数组或矩阵as.array.这aa从一个类强制dgCMatrixmatrix没有sparse参数的类.从本质上讲,您的代码相当于apply()在R中的常规矩阵上运行,但是如果您尝试的话

bb = matrix(0, nrow = 8000000, ncol = 100000)
Run Code Online (Sandbox Code Playgroud)

你得到

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)
Run Code Online (Sandbox Code Playgroud)

...还有其他一些警告.

Matrix我们的软件包文档中,

即使是基础功能可以自动地工作(如果他们先请as.matrix()他们的主要论点),例如apply,eigen,svd或者kappa全部都通过强迫工作,以"传统"(密)矩阵.

这与上述内容一致.你遇到的问题是,当apply()调用它时,它首先创建一个矩阵,但它试图制作的矩阵不合理地大,并且该函数无法完成.如果你的目标是在大型稀疏矩阵上计算自定义函数,我觉得你必须在没有apply()函数帮助的情况下完成它.