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]]