尝试这个。它将
summary
输出的矩阵连接起来,然后在按
(i, j)
对进行分组后取最大值。它还具有通用性,您可以执行任何类型的元素间操作,只需将
max
替换为所选函数(或编写一个接受
FUN
参数的通用函数)。
pmax.sparse <- function(..., na.rm = FALSE) {
num.rows <- unique(sapply(list(...), nrow))
num.cols <- unique(sapply(list(...), ncol))
stopifnot(length(num.rows) == 1)
stopifnot(length(num.cols) == 1)
cat.summary <- do.call(rbind, lapply(list(...), summary))
out.summary <- aggregate(x ~ i + j, data = cat.summary, max, na.rm)
sparseMatrix(i = out.summary$i,
j = out.summary$j,
x = out.summary$x,
dims = c(num.rows, num.cols))
}
如果你的矩阵太大,非常稀疏,导致这段代码运行速度过慢,我会考虑使用类似的方法来使用 data.table。以下是一个应用示例:
N <- 1000000
n <- 10000
M1 <- sparseMatrix(i = sample(N,n), j = sample(N,n), x = runif(n), dims = c(N,N))
M2 <- sparseMatrix(i = sample(N,n), j = sample(N,n), x = runif(n), dims = c(N,N))
M3 <- sparseMatrix(i = sample(N,n), j = sample(N,n), x = runif(n), dims = c(N,N))
system.time(p <- pmax.sparse(M1,M2,M3))
# user system elapsed
# 2.58 0.06 2.65
另一个提出的解决方案出现了以下错误:
Error in .class1(object) :
Cholmod error 'problem too large' at file ../Core/cholmod_dense.c, line 106
as.matrix(v)
不是一个选项,因为它是一个大型的稀疏矩阵? - David Robinson