[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