[R-es] vectorizaciones

J. Miguel Marin jmmarin en est-econ.uc3m.es
Mar Dic 17 10:17:11 CET 2013


Hola Carlos,

muchas gracias, funciona :D

Aunque las matrices P1a y P2a debo sacarlas de la función porque la 
función se aplica a cualquier matriz externa a la función.

Siempre me queda la duda de que las funciones tengan acceso a matrices 
o dataframes externos y que no se les pasa como argumentos, pero parece 
que no hay problema. Siempre me queda la duda si no es mejor manejar, 
en este caso, asignaciones globales con "<<-" pero está siempre 
desaconsejado....

A ver si hay suerte y realmente la vectorización aumenta la velocidad :D

Y saludos y felices fiestas a tod en s

> Hola,
>
> De esta manera sí funciona:
>
> #-----------------------------------------------
>
> #...................
>
> vec1a <- as.vector(1:3)
>
> n1a <- 3
>
> n2a <- 3
>
> #P1a <- matrix(rnorm(30),nrow=3)
>
> #P2a <- matrix(rnorm(30),nrow=3)
>
> Ka <- 10
> n.val <- 30
>
> # En forma de funcion
>
> producto <- function(n1a,n2a,Ka,vec1a,n.val){
>
> # A eliminar una vez compruebes que la vectorización funciona
> set.seed(123)
>
> P1a <- matrix(rnorm(n.val),nrow=3)
> P1a <- matrix(rnorm(n.val),nrow=3)
>
>  LLa = numeric(2*Ka)
>
>  for (i in 1:n1a){
>
>    for (j in 1:n2a){
>
>      LLa = LLa - vec1a%*%matrix(abs(P1a[i,]-P2a[j,]), nrow=length(vec1a),
> ncol=2*Ka, byrow=TRUE)
>    }
>
>  }
>
>  return(sum(LLa))
>
> }
>
>
> producto(n1a,n2a,Ka,vec1a,n.val)
>
>
> vproducto <- Vectorize(producto)
> sum(vproducto(3,3,10,as.vector(1:3),30))
>
> vproducto <- Vectorize(producto, c("n1a","n2a","Ka","vec1a","n.val"))
> sum(vproducto(3,3,10,as.vector(1:3),30))
>
>
> #-----------------------------------------------
>
> Saludos,
> Carlos Ortega
> www.qualityexcellence.es
>
>
>
> El 16 de diciembre de 2013, 17:38, J. Miguel Marin <jmmarin en est-econ.uc3m.es
>> escribió:
>
>>
>> Hola a tod en s,
>>
>> tengo que hacer una operación con matrices que lleva un doble bucle. He
>> intentado vectorizarlo pero sin mucho éxito con la función "Vectorize".
>> ¿sabríais de alguna manera de evitar los bucles o de que funcionase
>> Vectorize?
>> Adjunto un ejemplo
>>
>> #...................
>>
>> vec1a <- as.vector(1:3)
>>
>> n1a <- 3
>>
>> n2a <- 3
>>
>> P1a <- matrix(rnorm(30),nrow=3)
>>
>> P2a <- matrix(rnorm(30),nrow=3)
>>
>> Ka <- 10
>>
>> # En forma de funcion
>>
>> producto <- function(n1a,n2a,Ka,vec1a,P1a,P2a){
>>
>> LLa = numeric(2*Ka)
>>
>> for (i in 1:n1a){
>>
>>   for (j in 1:n2a){
>>
>>      LLa = LLa - vec1a%*%matrix(abs(P1a[i,]-P2a[j,]), nrow=length(vec1a),
>> ncol=2*Ka, byrow=TRUE)
>>
>>           }
>>
>> }
>>
>> return(sum(LLa))
>>
>> }
>>
>>
>> producto(n1a,n2a,Ka,vec1a,P1a,P2a)
>>
>>
>> vproducto <- Vectorize(producto)
>>
>> vproducto(n1a,n2a,Ka,vec1a,P1a,P2a)
>>
>> # Error en P1a[i, ] : número incorreto de dimensiones
>>
>>
>> #...................
>>
>> Y saludos
>>
>> mm~
>>
>> _______________________________
>>
>>        J. Miguel Marin
>>
>> http://www.est.uc3m.es/jmmarin
>>
>>    Dep. de Estadistica
>> Universidad Carlos III de Madrid
>>
>> _______________________________________________
>> R-help-es mailing list
>> R-help-es en r-project.org
>> https://stat.ethz.ch/mailman/listinfo/r-help-es
>>
>
>
>
> --
> Saludos,
> Carlos Ortega
> www.qualityexcellence.es
>




mm~

_______________________________

        J. Miguel Marin

http://www.est.uc3m.es/jmmarin

    Dep. of Statistics
University Carlos III of Madrid
     European Union (EU)



Más información sobre la lista de distribución R-help-es