[R] implementation of matrix logarithm (inverse of matrix exponential)
spencerg
spencer.graves at prodsyse.com
Sun Sep 27 03:58:01 CEST 2009
Sylvester's formula (http://en.wikipedia.org/wiki/Sylvester%27s_formula)
applies to a square matrix A = S L solve(S), where L = a diagonal matrix and S =
matrix of eigenvectors. Let "f" be an analytic function [for which f(A) is well
defined]. Then f(A) = S f(L) solve(S).
We can code this as follows:
sylvester <- function(x, f){
n <- nrow(x)
eig <- eigen(x)
vi <- solve(eig$vectors)
with(eig, (vectors * rep(f(values), each=n)) %*% vi)
}
logm <- function(x)sylvester(x, log)
Example:
A <- matrix(1:4, 2)
eA <- expm(A)
logm(eA)
With Chuck Berry's example, we get the following:
M <- matrix( c(0,1,0,0), 2 )
sylvester(M, log)
Error in solve.default(eig$vectors) :
system is computationally singular: reciprocal condition number = 1.00208e-292
This is a perfectly sensible answer in this case. We get the same result from "sylvester(M, exp)", though "expm(M)" works fine.
A better algorithm for this could be obtains by studying the code for "expm" in the Matrix package and the
references in the associated help page.
Hope this helps.
Spencer
Gabor Grothendieck wrote:
> Often one uses matrix logarithms on symmetric positive definite
> matrices so the assumption of being symmetric is sufficient in many
> cases.
>
> On Sat, Sep 26, 2009 at 7:28 PM, Charles C. Berry <cberry at tajo.ucsd.edu> wrote:
>
>> On Sat, 26 Sep 2009, Gabor Grothendieck wrote:
>>
>>
>>> OK. Try this:
>>>
>>>
>>>> library(Matrix)
>>>> M <- matrix(c(2, 1, 1, 2), 2); M
>>>>
>>> [,1] [,2]
>>> [1,] 2 1
>>> [2,] 1 2
>>>
>>>
>> Right. expm( M ) is diagonalizable.
>>
>> But for
>>
>> M <- matrix( c(0,1,0,0), 2 )
>>
>> you get the wrong result.
>>
>> Maybe I should have added that I do not see the machinery in R for dealing
>> with Jordan blocks.
>>
>> HTH,
>>
>> Chuck
>>
>>
>>
>>
>>>> # log of expm(M) is original matrix M
>>>> with(eigen(expm(M)), vectors %*% diag(log(values)) %*% t(vectors))
>>>>
>>> [,1] [,2]
>>> [1,] 2 1
>>> [2,] 1 2
>>>
>>>
>>> On Sat, Sep 26, 2009 at 6:24 PM, Charles C. Berry <cberry at tajo.ucsd.edu>
>>> wrote:
>>>
>>>> On Sat, 26 Sep 2009, Gabor Grothendieck wrote:
>>>>
>>>>
>>>>> Try:
>>>>>
>>>>> expm( - M)
>>>>>
>>>> Mimosa probably meant say 'the inverse function'.
>>>>
>>>> I do not see one in R.
>>>>
>>>> Chuck
>>>>
>>>>
>>>>> On Sat, Sep 26, 2009 at 5:06 PM, Mimosa Zeus <mimosa1879 at yahoo.fr>
>>>>> wrote:
>>>>>
>>>>>> Dear R users,
>>>>>>
>>>>>> Does anyone has implemented the inverse of the matrix exponential (expm
>>>>>> in the package Matrix)?
>>>>>>
>>>>>> In Matlab, there're logm and expm, there's only expm in R.
>>>>>> Cheers
>>>>>> Mimosa
>>>>>>
>>>>>>
>>>>>>
>>>>>> [[alternative HTML version deleted]]
>>>>>>
>>>>>>
>>>>>> ______________________________________________
>>>>>> R-help at 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 at 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.
>>>>>
>>>>>
>>>> Charles C. Berry (858) 534-2098
>>>> Dept of Family/Preventive
>>>> Medicine
>>>> E mailto:cberry at tajo.ucsd.edu UC San Diego
>>>> http://famprevmed.ucsd.edu/faculty/cberry/ La Jolla, San Diego
>>>> 92093-0901
>>>>
>>>>
>>>>
>>> ______________________________________________
>>> R-help at 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.
>>>
>>>
>> Charles C. Berry (858) 534-2098
>> Dept of Family/Preventive
>> Medicine
>> E mailto:cberry at tajo.ucsd.edu UC San Diego
>> http://famprevmed.ucsd.edu/faculty/cberry/ La Jolla, San Diego 92093-0901
>>
>>
>>
>
> ______________________________________________
> R-help at 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.
>
>
--
Spencer Graves, PE, PhD
President and Chief Operating Officer
Structure Inspection and Monitoring, Inc.
751 Emerson Ct.
San José, CA 95126
ph: 408-655-4567
More information about the R-help
mailing list