if (FALSE) {
# prepare random sparse matrix
library(Matrix)
library(rmumps)
n=2000
a=Matrix(0, n, n)
set.seed(7)
ij=sample(1:(n*n), 15*n)
a[ij]=runif(ij)
diag(a)=0
diag(a)=-rowSums(a)
a[1,1]=a[1,1]-1
am=Rmumps$new(a)
b=as.double(a%*%(1:n)) # rhs for an exact solution vector 1:n
# following time includes symbolic analysis, LU factorization and system solving
system.time(x<-solve(am, b))
bb=2*b
# this second time should be much shorter
# as symbolic analysis and LU factorization are already done
system.time(xx<-solve(am, bb))
# compare to Matrix corresponding times
system.time(xm<-solve(a, b))
system.time(xxm<-solve(a, bb))
# compare to Matrix precision
range(x-1:n) # mumps
range(xm-1:n) # Matrix
# matrix inversion
system.time(aminv <- solve(am))
system.time(ainv <- solve(a)) # the same in Matrix
# symmetric matrix
asy=as(a+t(a), "symmetricMatrix")
bs=as.double(asy%*%(1:n)) # rhs for 1:n solution
au=asy
# Here, we keep only diagonal and upper values of asy matrix.
# It could be also diagonal and lower values.
au[row(au)>col(au)]=0
ams=Rmumps$new(au, sym=1)
system.time(xs<-solve(ams, bs)) # rmumps
system.time(xsm<-solve(asy, bs))# Matrix
# compare to Matrix precision
range(xs-1:n) # mumps
range(xsm-1:n) # Matrix
# clean up by hand to avoid possible interference between gc() and
# Rcpp object destructor after unloading this namespace
rm(am, ams)
gc()
}
Run the code above in your browser using DataLab