我有一个计算机生成的方程矩阵。求解每个等式以产生单个数字。然后将得到的数字矩阵馈送到solve
函数。为了在变量上绘制结果,必须重复N次。
我想通过修改方程式的AST来加速计算,并在评估之前使用these functions简化它们。
我遇到的问题是我无法在矩阵或data.frame中正确存储类型expression
或language
的修改方程式。例如:
foo <- data.frame(matrix(expression(NA), nrow = 100, ncol = 100))
# does not work
# apply(foo, MARGIN = c(1,2), function(x) {expression(1+1)})
for (i in c(1:100)) {for (j in c(1:100)) {foo[i,j] <- expression(1+1)}}
结果data.frame foo
即使对于最短的表达式也是3.1Mb。实方程甚至更大,并且具有可怕的子集时间。有没有办法有效地存储这些类型?
答案 0 :(得分:0)
到目前为止,我发现处理这个问题的最佳方法是将表达式存储在函数中。我创建了一个函数:
out <- function() {
m <- matrix(NA, nrow = 100, ncol = 100)
}
然后我将表达式附加到它:
n <- 3
for (i in c(1:100)) {
for (j in c(1:100)) {
body(out)[[n]] <- substitute(m[i, j] <- f+i+j, list(i=i, j=j))
n <- n + 1
}
n <- n + 1
}
最后,我追加return
语句并为函数添加参数:
body(out)[[length(body(out))+1]] <- quote(m)
formals(out) <- alist(f=)
为了加快重复评估结果函数的速度,我将其编译为字节码:
outc <- cmpfun(out)
在调用此函数时,返回执行方程的数值矩阵,因此不需要子集。虽然它真的很大。 out
和outc
均为56Mb。