[R-es] Rodondeo de una matriz
Olivier Nuñez
onunez en unex.es
Lun Ago 26 17:49:31 CEST 2013
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
Más información sobre la lista de distribución R-help-es