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
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@est-econ.uc3m.es> escribió:> > Hola a tod@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@r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es >-- Saludos, Carlos Ortega www.qualityexcellence.es [[alternative HTML version deleted]]
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)