# [R] Applying a function to a matrix using indexes as arguments

David Winsemius dwinsemius at comcast.net
Thu Dec 17 02:37:10 CET 2015

```> On Dec 16, 2015, at 5:34 PM, David Winsemius <dwinsemius at comcast.net> wrote:
>
>
>> On Dec 16, 2015, at 4:18 PM, Matteo Richiardi <matteo.richiardi at gmail.com> wrote:
>>
>> I have to evolve each element of a matrix W
>>
>> W <- matrix(0,2,3)
>>
>> according to some function which uses the indices of the matrix [i,j] as
>> arguments:
>> w.fun = function(i,j) {
>> return A[i]*B[j]/(C[i,j])
>> }
>>
>> where
>> A<-c(100,100)
>> B<-c(200,200,200)
>> C <- matrix( rnorm(6,mean=0,sd=1), 2, 3)
>>
>> How can I do it, without recurring to a loop? Also, in my application I
>> need to pass the function another argument.
>
> mapply( function( i,j,fac) {fac*A[i]*B[j]/C[i,j]},
>         i=row(W),
>         j=col(W),
>         MoreArgs=list(fac=10) )
> [1]  -86207.97  325768.16 -135764.41 -913036.95 -142509.39
> [6]  243715.67
>
>
> N.B. all of the *apply functions are really loops.

Furthermore, you can neatly populate the W matrix with the `[<-` function:

W[] <- mapply( function( i,j,fac) {fac*A[i]*B[j]/C[i,j]},
i=row(W), j=col(W),MoreArgs=list(fac=10) )

> W
[,1]      [,2]      [,3]
[1,] -86207.97 -135764.4 -142509.4
[2,] 325768.16 -913037.0  243715.7

>

> --
> David.
>>
>> Thanks a lot for your suggestions.
>> Matteo
>>
>> 	[[alternative HTML version deleted]]
>>
>> ______________________________________________
>> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> and provide commented, minimal, self-contained, reproducible code.
>
> David Winsemius
> Alameda, CA, USA
>
> ______________________________________________
> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help