Fernando Sanchez
2010-Dec-19 21:27 UTC
[R-es] ampliar una matriz copiando una columna y desplazándola
Hola a todos, copiad en R el siguiente código: a<-1:10 b<-101:110 c<-201:210 d<-301:310 e<-401:410 matriz<-rbind(a,b) matriz<-rbind(matriz,c) matriz<-rbind(matriz,d) matriz<-rbind(matriz,e) matriz El resultado es esta matriz [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] a 1 2 3 4 5 6 7 8 9 10 b 101 102 103 104 105 106 107 108 109 110 c 201 202 203 204 205 206 207 208 209 210 d 301 302 303 304 305 306 307 308 309 310e 401 402 403 404 405 406 407 408 409 410 Me gustaría crear una columna 11 en la que en la fila "a" figurara lo que hay en la columna 10 en la fila "b" en la "b" lo que hay en la c y así sucesivamente ¿Se podría hacer sin emplear un bucle for? Mi matriz es más larga que la que os he puesto en el ejemplo pero el problema es el mismo. saludos y muchas gracias, Fernando [[alternative HTML version deleted]]
Oscar Perpiñan Lamigueiro
2010-Dec-19 22:20 UTC
[R-es] ampliar una matriz copiando una columna y desplazándola
Si no te entiendo mal, quieres construir una matriz de Hankel (http://en.wikipedia.org/wiki/Hankel_matrix) a partir de la décima columna. Si es así, te puede servir el siguiente código (no estoy seguro de la secuencia que quieres reproducir a partir del sexto elemento de la columna 10; he supuesto que seguirás con 510, etc. y de ahí el vector x). x=c(10, 110, 210, 310, 410, 510, 610, 710, 810) nrow=5 ncol=5 A=matrix(0, nrow=nrow, ncol=ncol) idx=col(A)+row(A)-1 x <- matriz[,10] M <- matrix(x[idx], nrow=nrow, ncol=ncol) Obtendrás lo siguiente: [,1] [,2] [,3] [,4] [,5] [1,] 10 110 210 310 410 [2,] 110 210 310 410 510 [3,] 210 310 410 510 610 [4,] 310 410 510 610 710 [5,] 410 510 610 710 810 Ah, y la matriz original puedes construirla con un sólo paso: matriz<-rbind(a, b, c, d, e) Saludos. Oscar- On Sun, 19 Dec 2010 21:27:23 +0000 (GMT) Fernando Sanchez <fernandsanche en yahoo.es> wrote:> Hola a todos, copiad en R el siguiente código: > a<-1:10 > b<-101:110 > c<-201:210 > d<-301:310 > e<-401:410 > matriz<-rbind(a,b) > matriz<-rbind(matriz,c) > matriz<-rbind(matriz,d) > matriz<-rbind(matriz,e) > matriz > > El resultado es esta matriz > > [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] > a 1 2 3 4 5 6 7 8 9 10 > b 101 102 103 104 105 106 107 108 109 110 > c 201 202 203 204 205 206 207 208 209 210 > d 301 302 303 304 305 306 307 308 309 310e 401 402 403 404 405 > 406 407 408 409 410 > > Me gustaría crear una columna 11 en la que en la fila "a" figurara lo que hay en > la columna 10 en la fila "b" en la "b" lo que hay en la c y así sucesivamente > ¿Se podría hacer sin emplear un bucle for? Mi matriz es más larga que la que os > he puesto en el ejemplo pero el problema es el mismo. > > saludos y muchas gracias, > > Fernando > > > > [[alternative HTML version deleted]] >-- Oscar Perpiñán Lamigueiro Dpto. de Ingeniería Eléctrica EUITI-UPM
Fernando Sanchez
2010-Dec-20 07:34 UTC
[R-es] ampliar una matriz copiando una columna y desplazándola
Hola Óscar, veo que funciona. Muchas gracias. Estoy madurando los conceptos quee hay detrás de tu código a ver si puedo traducirlo a mi problena. saludos, Fernando ------------------------------------------------------------------------------------------------------------------------- Si no te entiendo mal, quieres construir una matriz de Hankel (http://en.wikipedia.org/wiki/Hankel_matrix) a partir de la décima columna. Si es así, te puede servir el siguiente código (no estoy seguro de la secuencia que quieres reproducir a partir del sexto elemento de la columna 10; he supuesto que seguirás con 510, etc. y de ahí el vector x). x=c(10, 110, 210, 310, 410, 510, 610, 710, 810) nrow=5 ncol=5 A=matrix(0, nrow=nrow, ncol=ncol) idx=col(A)+row(A)-1 x <- matriz[,10] M <- matrix(x[idx], nrow=nrow, ncol=ncol) Obtendrás lo siguiente: [,1] [,2] [,3] [,4] [,5] [1,] 10 110 210 310 410 [2,] 110 210 310 410 510 [3,] 210 310 410 510 610 [4,] 310 410 510 610 710 [5,] 410 510 610 710 810 Ah, y la matriz original puedes construirla con un sólo paso: matriz<-rbind(a, b, c, d, e) Saludos. Oscar- On Sun, 19 Dec 2010 21:27:23 +0000 (GMT)> Hola a todos, copiad en R el siguiente código: > a<-1:10 > b<-101:110 > c<-201:210 > d<-301:310 > e<-401:410 > matriz<-rbind(a,b) > matriz<-rbind(matriz,c) > matriz<-rbind(matriz,d) > matriz<-rbind(matriz,e) > matriz > > El resultado es esta matriz > > [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] > a 1 2 3 4 5 6 7 8 9 10 > b 101 102 103 104 105 106 107 108 109 110 > c 201 202 203 204 205 206 207 208 209 210 > d 301 302 303 304 305 306 307 308 309 310e 401 402 403 404 405 > > 406 407 408 409 410 > > Me gustaría crear una columna 11 en la que en la fila "a" figurara lo que hay >en > > la columna 10 en la fila "b" en la "b" lo que hay en la c y así sucesivamente > ¿Se podría hacer sin emplear un bucle for? Mi matriz es más larga que la que os > > he puesto en el ejemplo pero el problema es el mismo. > > saludos y muchas gracias, > > Fernando > > > > [[alternative HTML version deleted]] >-- Oscar Perpiñán Lamigueiro Dpto. de Ingeniería Eléctrica EUITI-UPM [[alternative HTML version deleted]]