Peter, I have indeed worked with Gregory-Newton and divided differences in my 
very first numerical analysis course a couple of decades ago! However, I am 
perplexed by the particular form of this matrix where the differences are 
stored along the diagonals.  I know that this is not the *same* as the 
Wronskian, but was just wondering whether it is an established matrix that is 
some kind of an *ian* like Hermitian, Jacobian, Hessian, Wronskian, Laplacian, 
...

Best,
Ravi.

-------------------------------------------------------
Ravi Varadhan, Ph.D.
Assistant Professor,
Division of Geriatric Medicine and Gerontology School of Medicine Johns Hopkins 
University

Ph. (410) 502-2619
email: rvarad...@jhmi.edu


-----Original Message-----
From: peter dalgaard [mailto:pda...@gmail.com] 
Sent: Wednesday, April 27, 2011 4:59 PM
To: Ravi Varadhan
Cc: R Help
Subject: Re: [R] matrix of higher order differences


On Apr 27, 2011, at 21:34 , Ravi Varadhan wrote:

> My apologies in advance for being a bit off-topic, but I could not quell my 
> curiosity. 
> 
> What might one do with a matrix of all order finite differences?  It seems 
> that such a matrix might be related to the Wronskian (its discrete analogue, 
> perhaps).
> 
> http://en.wikipedia.org/wiki/Wronskian

Not quite, I think. This is one function at different values of x, the 
Wronskian is about n different functions.

Tables of higher-order differences were used fundamentally for interpolation 
and error detection in tables of function values (remember those?), but rarely 
computed to the full extent - usually only until the effects of truncation set 
in and the differences start alternating in sign.

> 
> Ravi.
> -------------------------------------------------------
> Ravi Varadhan, Ph.D.
> Assistant Professor,
> Division of Geriatric Medicine and Gerontology School of Medicine Johns 
> Hopkins University
> 
> Ph. (410) 502-2619
> email: rvarad...@jhmi.edu
> 
> 
> -----Original Message-----
> From: r-help-boun...@r-project.org [mailto:r-help-boun...@r-project.org] On 
> Behalf Of Petr Savicky
> Sent: Wednesday, April 27, 2011 11:01 AM
> To: r-help@r-project.org
> Subject: Re: [R] matrix of higher order differences
> 
> On Wed, Apr 27, 2011 at 11:25:42AM +0000, Hans W Borchers wrote:
>> Jeroen Ooms <jeroenooms <at> gmail.com> writes:
>> 
>>> 
>>> Is there an easy way to turn a vector of length n into an n by n matrix, in
>>> which the diagonal equals the vector, the first off diagonal equals the
>>> first order differences, the second... etc. I.e. to do this more
>>> efficiently:
>>> 
>>> diffmatrix <- function(x){
>>>     n <- length(x);
>>>     M <- diag(x);
>>>     for(i in 1:(n-1)){
>>>             differences <- diff(x, dif=i);
>>>             for(j in 1:length(differences)){
>>>                     M[j,i+j] <- differences[j]
>>>             }
>>>     }
>>>     M[lower.tri(M)] <- t(M)[lower.tri(M)];
>>>     return(M);
>>> }
>>> 
>>> x <- c(1,2,3,5,7,11,13,17,19);
>>> diffmatrix(x);
>>> 
>> 
>> I do not know whether you will call the appended version more elegant,
>> but at least it is much faster -- up to ten times for length(x) = 1000,
>> i.e. less than 2 secs for generating and filling a 1000-by-1000 matrix.
>> I also considered col(), row() indexing:
>> 
>>    M[col(M) == row(M) + k] <- x
>> 
>> Surprisingly (for me), this makes it even slower than your version with
>> a double 'for' loop.
>> 
>> -- Hans Werner
>> 
>> # ----
>> diffmatrix <- function(x){
>>      n <- length(x)
>>      if (n == 1) return(x)
>> 
>>      M <- diag(x)
>>      for(i in 1:(n-1)){
>>              x <- diff(x)           # use 'diff' in a loop
>>              for(j in 1:(n-i)){     # length is known
>>                      M[j, i+j] <- x[j]  # and reuse x
>>              }
>>      }
>>      M[lower.tri(M)] <- t(M)[lower.tri(M)]
>>      return(M)
>> }
>> # ----
> 
> Hi.
> 
> The following avoids the inner loop and it was faster
> for x of length 100 and 1000.
> 
>  diffmatrix2 <- function(x){
>          n <- length(x)
>          if (n == 1) return(x)
>          A <- matrix(nrow=n+1, ncol=n)
>          for(i in 1:n){
>                  A[i, seq.int(along=x)] <- x
>                  x <- diff(x)
>          }
>          M <- matrix(A, nrow=n, ncol=n)
>          M[upper.tri(M)] <- t(M)[upper.tri(M)]
>          return(M)
>  }
> 
> Reorganizing an (n+1) x n matrix into an n x n matrix
> shifts i-th column by (i-1) downwards. In particular,
> the first row becomes the main diagonal. The initial
> part of each of the remaining rows becomes a diagonal
> starting at the first component of the original row.
> 
> Petr Savicky.
> 
> ______________________________________________
> 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.

-- 
Peter Dalgaard
Center for Statistics, Copenhagen Business School
Solbjerg Plads 3, 2000 Frederiksberg, Denmark
Phone: (+45)38153501
Email: pd....@cbs.dk  Priv: pda...@gmail.com

______________________________________________
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