# [R] elegant matrix creation

Gabor Grothendieck ggrothendieck at gmail.com
Tue Jul 12 14:35:42 CEST 2005

```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      ,   0 , 0,
> x*x     , x     ,   1 , 0,
> x*x*x, x*x, x, 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)))

```