# [R] Fwd: functions and matrices

David Winsemius dwinsemius at comcast.net
Tue Jul 2 03:56:33 CEST 2013

```With permission I offer this exchange. Rolf and I have different notions of what u %*% v should mean, but the arbiter is obviously the original poster:

Begin forwarded message:

> From: David Winsemius <dwinsemius at comcast.net>
> Subject: Re: [R] functions and matrices
> Date: July 1, 2013 6:21:09 PM PDT
> To: Rolf Turner <rolf.turner at xtra.co.nz>
>
>
> On Jul 1, 2013, at 5:09 PM, Rolf Turner wrote:
>
>> On 02/07/13 11:37, David Winsemius wrote:
>>> On Jul 1, 2013, at 3:32 PM, Rolf Turner wrote:
>>>
>>>> Basically R does things *numerically* and what you want to do really
>>>> amounts to symbolic manipulation.  Of course R could be cajoled into
>>>> doing it --- see fortune("Yoda") --- but probably only with a great deal of
>>>> effort and code-writing.
>>>>
>>>> OTOH you could quite easily write a function that would calculate
>>>> det(u%*%v)(x) for any given numerical value of x:
>>>>
>>>> foo <- function(a,b,x){
>>>>   a1 <- apply(a,c(1,2),function(m,x){m[[1]](x)},x=x)
>>>>   b1 <- apply(b,c(1,2),function(m,x){m[[1]](x)},x=x)
>>>>   det(a1%*%b1)
>>>> }
>>>>
>>>> Then doing
>>>>
>>>>   foo(u,v,2)
>>> I would have thought that (u %*% v) would be:
>>>
>>>      u[1,1]( v[1,1](x) ) + u[1,2]( v[2,1](x) )   u[1,1]( v[1,2](x) ) + u[1,2]( v[2,2](x) )
>>>      u[2,1]( v[1,1](x) ) + u[2,2]( v[2,1](x) )   u[2,1]( v[2,1](x) ) + u[2,2]( v[2,2](x) )
>>>
>>> (Crossing my fingers that I got the row and column conventions correct for matrix multiplication.)
>>>
>> <SNIP>
>>
>> Not quite sure what you're getting at here.  It looks to me that you are
>> calculating the *composition* of the functions rather than their *product*.
>
> Exactly. That is how I understood successive application of functions embedded in matrices . The symbol used in my differential topology course lo those 40 years ago was an open circle, but I assumed the OP wanted something along those lines to perform a composite mapping:
>
> compose <- function(u, v, x) matrix( c(
>       u[1,1][[1]]( v[1,1][[1]](x) ) + u[1,2][[1]]( v[2,1][[1]](x) ) ,
>       u[1,1][[1]]( v[1,2][[1]](x) ) + u[1,2][[1]]( v[2,2][[1]](x) ),
>       u[2,1][[1]]( v[1,1][[1]](x) ) + u[2,2][[1]]( v[2,1][[1]](x) ),
>       u[2,1][[1]]( v[2,1][[1]](x) ) + u[2,2][[1]]( v[2,2][[1]](x) ) ), 2,2,byrow=TRUE)
>
> compose(u,v,2)
>     [,1]    [,2]
> [1,]   75    1332
> [2,] 5427 1680128
>
> (Noting that I may have reversed the roles of u and v.)
>
>>
>> I.e. you are taking the (i,j)th entry of "u%*%v" (evaluated at x) to be the
>> sum over k of
>>
>>       u[i,k](v[k,j](x))
>>
>> This is not what I understood the OP to want.  I assumed he wanted the
>> product of the function values rather than the composition of the functions,
>> i.e. that he wanted the (i,j)th entry to be the sum over k of
>>
>>       u[i,k](x) * v[k,j](x)
>>
>> which is what my function provides.  This seems to me to be the most
>> "reasonable" interpretation, but I could be wrong.
>>
>> BTW --- you cannot actually do u[i,k](x).  E.g.
>>
>>   u[1,2](2)
>>
>> gives "Error: attempt to apply non-function".  One needs to do u[1,2][[1]](2)
>> (which gives 4, as it should).
>
> Yes. I was playing fast and loose with notation. I didn't think the code would really run as offered.I was a bit surprise that this worked, but I suppose you bear credit (and blame?) for pushing my program closer to completion.
>
>> v[1,1][[1]]( u[1,1][[1]]( 2 ))
> [1] 11
>
> Any problem with me copying this to the list?
>
>
>>
>>   cheers,
>>
>>       Rolf
>
> Best;
>
>
> David Winsemius
> Alameda, CA, USA
>

David Winsemius
Alameda, CA, USA

```