Gracias, Jorge. Y cual fue la solucion a la que llegaron? --JIV Sent from my phone. Please excuse my brevity and misspelling. On Aug 25, 2013, at 8:36 AM, Jorge Ayuso Rejas <jayusor@gmail.com> wrote: Esto lo hice yo en una práctica en la universidad, Definíamos un problema de optimización entera minimizando el error de redondeo y restringiendo a la suma de filas y columnas. El 23 de agosto de 2013 19:05, Jorge I Velez <jorgeivanvelez@gmail.com>escribió:> Buenas tardes a tod@s, > > Me gustaria redondear las entradas de una matriz m manteniendo la suma de > filas y columnas constantes (son valores fijos conocidos). En la > aplicacion que estoy trabajando (en la que por supuesto m tiene una > dimension mayor que en el ejemplo), no son permitidos numeros decimales y > por ello debe efectuarse el redondeo. > > La forma de m es: > > m <- matrix(c(3.546, 4.5345, 1.9195, > 12.332, 15.982, 21.686, > 4.122, 9.4835, 16.3945), ncol = 3, byrow = TRUE) > colnames(m) <- paste0('C', 1:3) > rownames(m) <- paste0('X', 1:3) > m > # C1 C2 C3 > # X1 3.546 4.5345 1.9195 > # X2 12.332 15.9820 21.6860 > # X3 4.122 9.4835 16.3945 > > Los totales (por filas y columna, todos fijos) son los siguientes > > (TotalColumna <- colSums(m)) > (TotalFila <- rowSums(m)) > > Si procedo haciendo > > m2 <- round(m, 0) > m2 > > es claro que los totales fila y columna no se mantienen > > colSums(m2) # columna > rowSums(m2) # fila > > Alguna idea de como efectuar el redondeo? Muchisimas gracias de antemano. > > Saludos, > Jorge Velez > > [[alternative HTML version deleted]] > > _______________________________________________ > R-help-es mailing list > R-help-es@r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es >-- Jorge Ayuso Rejas [[alternative HTML version deleted]]
Te paso un documento que puede servirte, Saludos. El 25/08/13 17:59, Jorge I Velez escribió:> Gracias, Jorge. Y cual fue la solucion a la que llegaron? --JIV > > Sent from my phone. Please excuse my brevity and misspelling. > > On Aug 25, 2013, at 8:36 AM, Jorge Ayuso Rejas <jayusor en gmail.com > <mailto:jayusor en gmail.com>> wrote: > >> Esto lo hice yo en una práctica en la universidad, >> Definíamos un problema de optimización entera minimizando el error de >> redondeo y restringiendo a la suma de filas y columnas. >> >> >> >> >> >> El 23 de agosto de 2013 19:05, Jorge I Velez >> <jorgeivanvelez en gmail.com <mailto:jorgeivanvelez en gmail.com>> escribió: >> >> Buenas tardes a tod en s, >> >> Me gustaria redondear las entradas de una matriz m manteniendo la >> suma de >> filas y columnas constantes (son valores fijos conocidos). En la >> aplicacion que estoy trabajando (en la que por supuesto m tiene una >> dimension mayor que en el ejemplo), no son permitidos numeros >> decimales y >> por ello debe efectuarse el redondeo. >> >> La forma de m es: >> >> m <- matrix(c(3.546, 4.5345, 1.9195, >> 12.332, 15.982, 21.686, >> 4.122, 9.4835, 16.3945), ncol = 3, byrow = TRUE) >> colnames(m) <- paste0('C', 1:3) >> rownames(m) <- paste0('X', 1:3) >> m >> # C1 C2 C3 >> # X1 3.546 4.5345 1.9195 >> # X2 12.332 15.9820 21.6860 >> # X3 4.122 9.4835 16.3945 >> >> Los totales (por filas y columna, todos fijos) son los siguientes >> >> (TotalColumna <- colSums(m)) >> (TotalFila <- rowSums(m)) >> >> Si procedo haciendo >> >> m2 <- round(m, 0) >> m2 >> >> es claro que los totales fila y columna no se mantienen >> >> colSums(m2) # columna >> rowSums(m2) # fila >> >> Alguna idea de como efectuar el redondeo? Muchisimas gracias de >> antemano. >> >> Saludos, >> Jorge Velez >> >> [[alternative HTML version deleted]] >> >> _______________________________________________ >> R-help-es mailing list >> R-help-es en r-project.org <mailto:R-help-es en r-project.org> >> https://stat.ethz.ch/mailman/listinfo/r-help-es >> >> >> >> >> -- >> Jorge Ayuso Rejas-- Jorge Ayuso Rejas ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: <https://stat.ethz.ch/pipermail/r-help-es/attachments/20130825/b1461c76/attachment-0001.html> ------------ próxima parte ------------ A non-text attachment was scrubbed... Name: Redondeo.pdf Type: application/pdf Size: 106804 bytes Desc: no disponible URL: <https://stat.ethz.ch/pipermail/r-help-es/attachments/20130825/b1461c76/attachment-0001.pdf>
Jorge, como lo comentó Jorge Ayuso se puede efectivamente ver tu problema como un problema de optimización. Aquí redacté un pequeña función seguramente mejorable que creo soluciona el problema. Utiliza la librería lpSolve y adopté las notaciones que aparecen en el ejemplo de la función lp. Un saludo. Olivier redondeo.matriz<-function(m) { require(lpSolve) n=dim(m)[1] M = m-floor(m) #parte decimal tc <- colSums(M) tf <- rowSums(M) M.obj <- ifelse(M < .5 , M-1, M) #parte decimal f.obj <- c(M.obj) #se procura ajustarse a la función round v = c(rep(c(rep(1,n),rep(0,n*n)),n-1),rep(1,n)) C=matrix(v,nrow=n,ncol=n*n,byrow=TRUE) #matriz coef para restriciones columnas F=matrix(C,nrow=n,ncol=n*n,byrow=TRUE) #matriz coef para restriciones filas I = diag(1,n*n) #solución toma valores entre 0 y 1 f.con <- rbind(C,F,I) f.rhs <- c(tc,tf,rep(1,n*n)) f.dir <- c(rep("=",2*n),rep("<=",n*n)) x = lp ("max", f.obj, f.con, f.dir, f.rhs)$sol #solución del problema de PL floor(m) + matrix(x,nrow=n,byrow=FALSE) } m <- matrix(c(3.546, 4.5345, 1.9195, 12.332, 15.982, 21.686, 4.122, 9.4835, 16.3945), ncol = 3, byrow = TRUE) m redondeo.matriz(m) -- ____________________________________ Olivier G. Nuñez Email: onunez en unex.es http://matematicas.unex.es/~onunez Tel : +34 663 03 69 09 Departamento de Matemáticas Universidad de Extremadura ____________________________________ El 25/08/2013, a las 17:59, Jorge I Velez escribió:> Gracias, Jorge. Y cual fue la solucion a la que llegaron? --JIV > > Sent from my phone. Please excuse my brevity and misspelling. > > On Aug 25, 2013, at 8:36 AM, Jorge Ayuso Rejas <jayusor en gmail.com> > wrote: > > Esto lo hice yo en una práctica en la universidad, > Definíamos un problema de optimización entera minimizando el error de > redondeo y restringiendo a la suma de filas y columnas. > > > > > > El 23 de agosto de 2013 19:05, Jorge I Velez > <jorgeivanvelez en gmail.com>escribió: > >> Buenas tardes a tod en s, >> >> Me gustaria redondear las entradas de una matriz m manteniendo la >> suma de >> filas y columnas constantes (son valores fijos conocidos). En la >> aplicacion que estoy trabajando (en la que por supuesto m tiene una >> dimension mayor que en el ejemplo), no son permitidos numeros >> decimales y >> por ello debe efectuarse el redondeo. >> >> La forma de m es: >> >> m <- matrix(c(3.546, 4.5345, 1.9195, >> 12.332, 15.982, 21.686, >> 4.122, 9.4835, 16.3945), ncol = 3, byrow = TRUE) >> colnames(m) <- paste0('C', 1:3) >> rownames(m) <- paste0('X', 1:3) >> m >> # C1 C2 C3 >> # X1 3.546 4.5345 1.9195 >> # X2 12.332 15.9820 21.6860 >> # X3 4.122 9.4835 16.3945 >> >> Los totales (por filas y columna, todos fijos) son los siguientes >> >> (TotalColumna <- colSums(m)) >> (TotalFila <- rowSums(m)) >> >> Si procedo haciendo >> >> m2 <- round(m, 0) >> m2 >> >> es claro que los totales fila y columna no se mantienen >> >> colSums(m2) # columna >> rowSums(m2) # fila >> >> Alguna idea de como efectuar el redondeo? Muchisimas gracias de >> antemano. >> >> Saludos, >> Jorge Velez >> >> [[alternative HTML version deleted]] >> >> _______________________________________________ >> R-help-es mailing list >> R-help-es en r-project.org >> https://stat.ethz.ch/mailman/listinfo/r-help-es >> > > > > -- > Jorge Ayuso Rejas > > [[alternative HTML version deleted]] > > _______________________________________________ > R-help-es mailing list > R-help-es en r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es
Muchisimas gracias, Olivier and Jorge. --JIV 2013/8/27 Olivier Nuñez <onunez@unex.es>> Jorge, > > como lo comentó Jorge Ayuso se puede efectivamente ver tu problema como un > problema de optimización. > Aquí redacté un pequeña función seguramente mejorable que creo soluciona > el problema. > Utiliza la librería lpSolve y adopté las notaciones que aparecen en el > ejemplo de la función lp. > Un saludo. Olivier > > > redondeo.matriz<-function(m) { > require(lpSolve) > n=dim(m)[1] > M = m-floor(m) #parte decimal > tc <- colSums(M) > tf <- rowSums(M) > M.obj <- ifelse(M < .5 , M-1, M) #parte decimal > f.obj <- c(M.obj) #se procura ajustarse a la función round > v = c(rep(c(rep(1,n),rep(0,n*n)),**n-1),rep(1,n)) > C=matrix(v,nrow=n,ncol=n*n,**byrow=TRUE) #matriz coef para restriciones > columnas > F=matrix(C,nrow=n,ncol=n*n,**byrow=TRUE) #matriz coef para restriciones > filas > I = diag(1,n*n) #solución toma valores entre 0 y 1 > f.con <- rbind(C,F,I) > f.rhs <- c(tc,tf,rep(1,n*n)) > f.dir <- c(rep("=",2*n),rep("<=",n*n)) > x = lp ("max", f.obj, f.con, f.dir, f.rhs)$sol #solución del problema de > PL > floor(m) + matrix(x,nrow=n,byrow=FALSE) > > } > > m <- matrix(c(3.546, 4.5345, 1.9195, > 12.332, 15.982, 21.686, > 4.122, 9.4835, 16.3945), ncol = 3, byrow = TRUE) > > > m > > redondeo.matriz(m) > > -- ______________________________**______ > > Olivier G. Nuñez > Email: onunez@unex.es > http://matematicas.unex.es/~**onunez <http://matematicas.unex.es/~onunez> > Tel : +34 663 03 69 09 > Departamento de Matemáticas > Universidad de Extremadura > > ______________________________**______ > > > > > > El 25/08/2013, a las 17:59, Jorge I Velez escribió: > > > Gracias, Jorge. Y cual fue la solucion a la que llegaron? --JIV >> >> Sent from my phone. Please excuse my brevity and misspelling. >> >> On Aug 25, 2013, at 8:36 AM, Jorge Ayuso Rejas <jayusor@gmail.com> wrote: >> >> Esto lo hice yo en una práctica en la universidad, >> Definíamos un problema de optimización entera minimizando el error de >> redondeo y restringiendo a la suma de filas y columnas. >> >> >> >> >> >> El 23 de agosto de 2013 19:05, Jorge I Velez <jorgeivanvelez@gmail.com>** >> escribió: >> >> Buenas tardes a tod@s, >>> >>> Me gustaria redondear las entradas de una matriz m manteniendo la suma de >>> filas y columnas constantes (son valores fijos conocidos). En la >>> aplicacion que estoy trabajando (en la que por supuesto m tiene una >>> dimension mayor que en el ejemplo), no son permitidos numeros decimales y >>> por ello debe efectuarse el redondeo. >>> >>> La forma de m es: >>> >>> m <- matrix(c(3.546, 4.5345, 1.9195, >>> 12.332, 15.982, 21.686, >>> 4.122, 9.4835, 16.3945), ncol = 3, byrow = TRUE) >>> colnames(m) <- paste0('C', 1:3) >>> rownames(m) <- paste0('X', 1:3) >>> m >>> # C1 C2 C3 >>> # X1 3.546 4.5345 1.9195 >>> # X2 12.332 15.9820 21.6860 >>> # X3 4.122 9.4835 16.3945 >>> >>> Los totales (por filas y columna, todos fijos) son los siguientes >>> >>> (TotalColumna <- colSums(m)) >>> (TotalFila <- rowSums(m)) >>> >>> Si procedo haciendo >>> >>> m2 <- round(m, 0) >>> m2 >>> >>> es claro que los totales fila y columna no se mantienen >>> >>> colSums(m2) # columna >>> rowSums(m2) # fila >>> >>> Alguna idea de como efectuar el redondeo? Muchisimas gracias de >>> antemano. >>> >>> Saludos, >>> Jorge Velez >>> >>> [[alternative HTML version deleted]] >>> >>> ______________________________**_________________ >>> R-help-es mailing list >>> R-help-es@r-project.org >>> https://stat.ethz.ch/mailman/**listinfo/r-help-es<https://stat.ethz.ch/mailman/listinfo/r-help-es> >>> >>> >> >> >> -- >> Jorge Ayuso Rejas >> >> [[alternative HTML version deleted]] >> >> ______________________________**_________________ >> R-help-es mailing list >> R-help-es@r-project.org >> https://stat.ethz.ch/mailman/**listinfo/r-help-es<https://stat.ethz.ch/mailman/listinfo/r-help-es> >> > >[[alternative HTML version deleted]]