You could save the space required to store the inverse of A by repeating 
solve(A,column)
for each column of an identity matrix the size of A, and store just the 
relevant element
of the result.  E.g.,

> diag(solve(A))
[1] 0.39576620 0.12064108 0.20705171 0.10067892 0.03191425 0.05857497 
0.10749426 0.03868911 0.08550176
> sapply(seq_len(nrow(A)), function(i)solve(A, seq_len(nrow(A))==i)[i]) 
[1] 0.39576620 0.12064108 0.20705171 0.10067892 0.03191425 0.05857497 
0.10749426 0.03868911 0.08550176

It may take more time that you would like.

Bill Dunlap
Spotfire, TIBCO Software
wdunlap tibco.com


> -----Original Message-----
> From: r-help-boun...@r-project.org [mailto:r-help-boun...@r-project.org] On 
> Behalf
> Of Camarda, Carlo Giovanni
> Sent: Monday, April 22, 2013 1:51 AM
> To: Greg Snow
> Cc: r-h...@stat.math.ethz.ch
> Subject: Re: [R] extracting the diagonal of an inverse matrix
> 
> Dear Greg,
> 
> thanks a lot for your prompt reply. I was aware of the link and the 
> associated papers.
> In my previous mail I was wondering whether there was already an R-routine 
> for coping
> with this issue.
> 
> I add below a testable example which reproduces my problem.
> 
> Thanks again,
> Giancarlo
> 
> ## dimensions (my actual dimensions are much larger and I use sparse matrices)
> m <- 3
> n <- 3
> ## building A
> ## diagonal part
> d <- 1:(m*n)
> D <- diag(d)
> ## additional ~dense part (:penalty term)
> P1 <- diff(diag(m), diff=2)
> P2 <- diff(diag(n), diff=2)
> P1a <- kronecker(diag(n), t(P1)%*%P1)
> P2a <- kronecker(t(P2)%*%P2, diag(m))
> P <- 1000 * P1a + 1000 * P2a
> ## final matrix A
> A <- D + P
> ## solving A
> B <- solve(A)
> ## what I just actually need
> diag(B)
> 
> 
> ________________________________________
> From: Greg Snow [538...@gmail.com]
> Sent: Saturday, April 20, 2013 12:16 AM
> To: Camarda, Carlo Giovanni
> Cc: r-h...@stat.math.ethz.ch
> Subject: Re: [R] extracting the diagonal of an inverse matrix
> 
> This link 
> http://math.stackexchange.com/questions/18488/diagonal-of-an-inverse-of-a-
> sparse-matrix might help.  It is about sparse matrices, but the general idea 
> should be able
> to be extended to non-sparse matrices as well.
> 
> 
> On Fri, Apr 19, 2013 at 8:13 AM, Camarda, Carlo Giovanni
> <cama...@demogr.mpg.de<mailto:cama...@demogr.mpg.de>> wrote:
> Dear R-users,
> 
> I would like to know whether there is a way to extract a diagonal of an 
> inverse matrix
> without computing the inverse of the matrix itself. The size of my matrices 
> are really
> huge and, also using sparse matrix, computing the inverse leads to storage 
> problems and
> low speed.
> 
> In other words, given a square matrix A, I aim to know diag(B), where 
> B=solve(A),
> without computing solve(A).
> 
> Accidentally (I do not know whether it helps), I could write the matrix A as 
> follows:
> A <- D + P
> where D is a diagonal matrix.
> 
> I read there are methods around, but, before implementing one of them by 
> myself, could
> you please inform whether there is already an R-routine for this issue?
> 
> Thanks in advance for the help you could provide,
> Carlo Giovanni Camarda
> ----------
> This mail has been sent through the MPI for Demographic ...{{dropped:19}}
> 
> ______________________________________________
> R-help@r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to