如何在R中快速求解多个方程?

时间:2014-07-17 16:45:17

标签: arrays r performance

我正在尝试快速解决R CRAN中大型阵列的方程式(形式为x%*%res = y)。
我有数据x和y,想要计算res。 如何做到最好,即快速?非常感谢!

这是一个例子和一些方法:(似乎“解决”是最快的?)

# setup:
p   = 20 # dimension of matrix to solve
nmkt= 3000 # length of array, i.e., number of equations to solve
res = matrix(0,p,nmkt) # result matrix
x   = array(rnorm(p*p*nmkt),c(p,p,nmkt)) # data
# make x symetric  and invertible
for(i in 1:nmkt){ x[, , i]= crossprod(x[, , i])+diag(p)*0.01}
y  = matrix(rnorm(p*nmkt),nmkt,p) # data

# computation and test:
R=100  # number of replications (actually much larger than 100 in my application R=1e5 or 1e7)
system.time(for(r in 1:R){ for(i in 1:nmkt){res[,i] = qr.solve(x[, , i], y[i,], tol = 1e-7)}})
system.time(for(r in 1:R){ for(i in 1:nmkt){res[,i] = solve(x[, , i], y[i,], tol = 1e-7)}})
system.time(for(r in 1:R){ for(i in 1:nmkt){res[,i] = crossprod(  chol2inv(chol( x[, , i] ))  , y[i,] )}})

通过阵列的循环是一个很好的解决方案吗?

1 个答案:

答案 0 :(得分:0)

还是使用稀疏矩阵? :

require(Matrix)
j = c(matrix(1:(p*nmkt),p,p*nmkt,byrow=TRUE))
i = c(aperm( array(j,c(p,p,nmkt)), c(2,1,3)))    
system.time(for(r in 1:R){  res=    solve(sparseMatrix(i=i, j=j, x = c(x)), c(t(y)), tol = 1e-7)} )