[R-es] Extraer elementos diagonales de submatrices

Jose Luis Brita jlbrita en gmail.com
Jue Oct 29 20:30:39 CET 2015


Hola a todos,

Como la idea de Javier recorro las diferentes submatrices pero moviendo las
columnas y filas seleccionadas.

El código es,

## input
m <- structure(c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
                 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
                 3, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 0, 0, 0, 0,
                 0, 0, 0, 5, 5, 5), .Dim = c(10L, 5L))
m


# Extracción
r <- dim(m)[1]       # Filas
k <- dim(m)[2]       # Columnas
# Inicialización
inicio <- 1
fin    <- k
resul <- c()
para <- 0
fila <- inicio:fin
columna <- 1:k
while(para == 0){
  A1 <- m[fila,columna]
  A1
  diagonal <- diag(A1)
  resul <- c(resul,diagonal[diagonal!=0])  # Acumula los valores, distintos
de cero, de las sucesivas diagonales
  resul
  # Tomar una nueva matriz
  indice <- which(diagonal == 0)
  indice
  if ( length(indice) > 0){
    inicio <- indice[1]
    fin    <- min(inicio + k-1,r)
  }else {
    inicio <- fin + 1
    fin    <- min(inicio + k-1,r)
  }

  # Caso particular de llegar al fin de la matriz kxr

  if(fin >r){
    fila <- inicio:(r-fin)
    columna <- 1:length(fila)
  } else {fila <- inicio:fin}

  if (inicio >r ) para <- 1
  inicio
  fin
}

 # Valores de la diagonales
resul


Un saludo

El 29 de octubre de 2015, 16:00, Olivier Nuñez <onunez en unex.es> escribió:

> Bueno, habia un pequeño bug. Aproveché para simplificar el codigo:
>
> require(data.table)
> temp=data.table(m)
> temp[,row:=1:nrow(m)]
> D=melt(temp,id.vars="row",variable.name = "col")
> D[,col:=as.numeric(factor(col))]
> D[,dd:=(ncol(m)-col)+row] #determina la diagonal
> DD=subset(D,dd>=ncol(m))
> setkey(D,dd,row)
> res=DD[,.(saltos=dd-1+min(which(value==0),ncol(m)+1)),by=dd]
> diags=ncol(m);i=1
> dmax=max(DD$dd)
> while(res[dd==diags[i],saltos]<dmax) {
>         diags=c(diags,res[dd==diags[i],saltos])
>         i=i+1
>         }
> DD[dd %in% diags & !value==0, .(output=value),by=dd]
>
>
>     dd output
>  1:  5      1
>  2:  5      2
>  3:  5      3
>  4:  8      1
>  5:  8      2
>  6:  8      3
>  7:  8      4
>  8:  8      5
>  9: 13      1
> 10: 13      2
>
>
> Un saludo. Olivier
>
> ----- Mensaje original -----
> De: "Olivier Nuñez" <onunez en unex.es>
> Para: "Javier Rubén Marcuzzi" <javier.ruben.marcuzzi en gmail.com>
> CC: "R-help-es" <r-help-es en r-project.org>
> Enviados: Jueves, 29 de Octubre 2015 14:52:47
> Asunto: Re: [R-es] Extraer elementos diagonales de submatrices
>
> Jorge,
>
> si creas un índice ("dd" en mi código) para las diagonales (las "cohortes"
> en un diagrama de Lexis),
> se puede elaborar un script más o menos elegante para hallar tu output:
>
> require(data.table)
> temp=data.table(m)
> temp[,row:=1:nrow(m)]
> D=melt(temp,id.vars="row",variable.name = "col")
> D[,col:=as.numeric(factor(col))]
> D[,dd:=(ncol(m)-col)+row] #índice de la diagonal
> DD=subset(DD,dd>=ncol(m))
> setkey(D,dd,row)
> DD[,suma:=cumsum(abs(value)),by=dd]
> DD[,l:=length(unique(suma)),by=dd]
> dmax=max(DD$dd)
> res=DD[,.(saltos=unique(dd+l)),by=dd]
> diags=ncol(m);i=1
> while(res[dd==diags[i],saltos]<dmax) {
>         diags=c(diags,res[dd==diags[i],saltos])
>         i=i+1
>         }
> DD[dd %in% diags & !value==0, .(output=value),by=dd]
>
>     dd output
>  1:  5      1
>  2:  5      2
>  3:  5      3
>  4:  8      1
>  5:  8      2
>  6:  8      3
>  7:  8      4
>  8:  8      5
>  9: 13      1
> 10: 13      2
>
> Un saludo. Olivier
>
> ----- Mensaje original -----
> De: "Javier Rubén Marcuzzi" <javier.ruben.marcuzzi en gmail.com>
> Para: "Jorge I Velez" <jorgeivanvelez en gmail.com>
> CC: "R-help-es" <r-help-es en r-project.org>
> Enviados: Jueves, 29 de Octubre 2015 12:05:52
> Asunto: Re: [R-es] Extraer elementos diagonales de submatrices
>
> El código que me olvide pegar
>
> input
> m <- structure(c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
>                  2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
>                  3, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 0, 0, 0, 0,
>                  0, 0, 0, 5, 5, 5), .Dim = c(10L, 5L))
> m
>
> ## output
> output <- c(1:3, 1:5, 1:2)
> output
>
> nfilas <- nrow(m)
> while(nfilas > 0) {
>   diagonal <- diag(m)
>   elementosDeseadosDiagonal <- diagonal[diagonal>0]
>   GuardoElementosDeseadosDiagonal <- rbind(elementosDeseadosDiagonal)
>   PuntoDeCorte <- length(elementosDeseadosDiagonal)
>   print(paste("Corte ", PuntoDeCorte,sep=""))
>   while(PuntoDeCorte > 0)
>   {
>     if(PuntoDeCorte == 0) break;
>     print((m))
>     m <- m[-1,]
>     PuntoDeCorte <- PuntoDeCorte-1
>   }
>
>   nfilas <- nfilas-1;
>   print(paste("n filas ", nfilas, sep = ""))
>   print(elementosDeseadosDiagonal)
>   print(GuardoElementosDeseadosDiagonal)
> }
> GuardoElementosDeseadosDiagonal
>
> Javier Rubén Marcuzzi
> Técnico en Industrias Lácteas
> Veterinario
>
>
>
> De: Javier Rubén Marcuzzi
> Enviado: miércoles, 28 de octubre de 2015 17:22
> Para: Jorge I Velez
> CC: R-help-es
> Asunto: RE: [R-es] Extraer elementos diagonales de submatrices
>
>
> Bien, estoy pensando, diagonal, elementos diagonal mayor que 0, cantidad
> de elementos en diagonal mayor que cero, borrar esa cantidad de filas de la
> matriz, todo esto dentro de un bucle, lógicamente guardo (rbind cantidad de
> elementos en diagonal mayor que cero) .
>
> Javier Rubén Marcuzzi
> Técnico en Industrias Lácteas
> Veterinario
>
>
>
> De: Jorge I Velez
> Enviado: miércoles, 28 de octubre de 2015 16:40
> Para: Javier Rubén Marcuzzi
> CC: R-help-es
> Asunto: Re: [R-es] Extraer elementos diagonales de submatrices
>
>
> Estimado Javier,
>
> Gracias por tu mensaje.
>
> No, lo unico que requiero es la lista de números (i1, 2, 3, 1, 2, 3, 4, 5,
> 1, 2).
>
> Saludos cordiales,
> Jorge.-
>
>
>
>
> 2015-10-28 14:35 GMT-05:00 Javier Rubén Marcuzzi <
> javier.ruben.marcuzzi en gmail.com>:
> Estimado Jorge I Velez
>
> No comprendo un punto, dices que deseas construir sub matrices y extraer
> elementos de sub matrices, en el ejemplo en output no hay sub matrices
> (tres matrices como resultado) sino una cadena de números. ¿Cómo necesitas
> el resultado?, ¿Cómo se ve en el ejemplo?, ¿Cómo matrices de matrices?
>
> Ejemplo
> 123
> 12345
> 12
>
> O en una forma
> 1231234512
>
> ¿Hay que dejar algo (índice) como para que accedas a algo reconocido o
> especificado, ej, segundo valor de la segunda sub matriz (2,2), ¿o con
> tener la lista de números le es útil?
>
> Javier Rubén Marcuzzi
> Técnico en Industrias Lácteas
> Veterinario
>
>
>
> De: Jorge I Velez
> Enviado: miércoles, 28 de octubre de 2015 12:15
> Para: R-help-es
> Asunto: [R-es] Extraer elementos diagonales de submatrices
>
>
> Buenos dias a todos,
>
> Quisiera extraer algunas entradas de una matrix "m" teniendo en cuenta
> algunas restricciones.  El siguiente ejemplo ilustra la situacion:
>
> ## input
> m <- structure(c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
> 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
> 3, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 0, 0, 0, 0,
> 0, 0, 0, 5, 5, 5), .Dim = c(10L, 5L))
> m
>
> ## output
> output <- c(1:3, 1:5, 1:2)
> output
>
> Si el numero de filas es r y el numero de columnas k, la idea es construir
> submatrices de dimension k x k y extraer los elementos diagonales NO
> ceros.  Ahora, en caso de encontrar un cero, debe desplazarse a la
> siguiente fila, y construir una nueva matriz k x k.  Graficamente esto
> seria:
>
>
> Observe que en este caso, r = 10 y k = 5.  En la primera submatriz, la
> diagonal tiene los valores 1, 2, 3, 0, 0, de los cuales SOLO deben
> seleccionarse 1, 2 y 3 (en lila).  El primer cero se encuentra en la
> posicion [1, 4], asi que la siguiente submatriz debe construirse COMENZANDO
> en la fila 4, columna 1.
>
> A partir de esta segunda submatriz se obtienen los elements 1, 2, 3, 4 y
> 5, que corresponden a su diagonal (en azul celeste).  La posicion del
> ultimo elemento de esta diagonal es [8, 5], asi que la siguiente submatriz
> debe comenzar en la fila 9.  A partir de esta submatriz se obtienen los
> valores 1 y 2 (en naranja).  El resultado final de todo este proceso es el
> vector
>
> # [1] 1 2 3 1 2 3 4 5 1 2
>
> Agradezco a todos el tiempo que les tomo leer este mensaje, y por supuesto
> por cualquier sugerencia que me permita obtener este vector.
>
> Saludos cordiales,
> 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
>
> _______________________________________________
> R-help-es mailing list
> R-help-es en r-project.org
> https://stat.ethz.ch/mailman/listinfo/r-help-es
>
> _______________________________________________
> R-help-es mailing list
> R-help-es en r-project.org
> https://stat.ethz.ch/mailman/listinfo/r-help-es
>



-- 
Jose Luis

	[[alternative HTML version deleted]]



Más información sobre la lista de distribución R-help-es