[R] elegant matrix creation

Robin Hankin r.hankin at noc.soton.ac.uk
Tue Jul 12 15:39:42 CEST 2005


Gabor


I cannot begin to tell you how much value you have added to my research
with your observation.

A real "eureka" moment for me.

[oh, and it  answered my question as well]


kia ora


Robin


On 12 Jul 2005, at 13:35, Gabor Grothendieck wrote:

> On 7/12/05, Robin Hankin <r.hankin at noc.soton.ac.uk> wrote:
>
>> Hi
>>
>> I want to write a little function that takes a vector of arbitrary
>> length "n" and returns a matrix of size n+1 by n+1.
>>
>> I can't easily describe it, but the following function that works for
>> n=3 should convey what I'm trying to do:
>>
>>
>> f <- function(x){
>>   matrix(c(
>>    1           ,   0      ,   0 , 0,
>> x[1]          ,   1      ,   0 , 0,
>> x[1]*x[2]     , x[2]     ,   1 , 0,
>> x[1]*x[2]*x[3], x[2]*x[3], x[3], 1
>> ),
>> 4,4,         byrow=T)
>> }
>>
>> f(c(10,7,2))
>>      [,1] [,2] [,3] [,4]
>> [1,]    1    0    0    0
>> [2,]   10    1    0    0
>> [3,]   70    7    1    0
>> [4,]  140   14    2    1
>>
>>>
>>>
>>
>>
>> As one goes down column "i", the entries get multiplied by successive
>> elements of x,  starting with x[i], after the first "1"
>>
>> As one goes along a row, one takes a product of the tail end of x,
>> until the zeroes kick in.
>>
>
> I have not checked this generally but at least for
> the 4x4 case its inverse is 0 except for 1s on the
> diagonal and -x on the subdiagonal.  We can use
> diff on a diagonal matrix to give a matrix with
> a diagonal and superdiagonal and then massage that
> into the required form, invert and round --
> leave off the rounding if the components of x
> are not known to be integer.
>
> round(solve(diag(4) - t(diff(diag(5))[,1:4])+diag(4) * c(0,x)))
>

--
Robin Hankin
Uncertainty Analyst
National Oceanography Centre, Southampton
European Way, Southampton SO14 3ZH, UK
  tel  023-8059-7743




More information about the R-help mailing list