Cordial saludo. Les agradecería que me ayudaran con una función eficiente para calcular potencias de una matriz. ¿Cuál biblioteca la tiene? Gracias de antemano César Escalante C. [[alternative HTML version deleted]]
Buenas noches César,
Si te refieres a tomar cada elemento de una matriz, digamos A, y elevarlos a
una potencia k, entonces escribir
A^k
en la consola del R es más que suficiente.
Sea k = 2. Si en vez de lo anterior lo que necesitas es B = A x A (porque
k=2), entonces podrías construir una función que lo realice. "A mano"
escribirías lo siguiente en la consola:
B <- A %*% A
B
El problema es que cuando k es por ejemplo 10, lo anterior es bastante
ineficiente.
A continuación te doy varios ejemplos de ambas situaciones. El uso de f1 o
f2 depende de tu aplicación. Si ninguna de las dos opciones es lo que
buscas, quizás un poco más de detalle podría ayudarnos a ayudarte. De qué
dimensión es la matriz A de tu aplicación y qué valores puede tomar k?
Una librería que podría ser de utilidad podría ser "Matrix", aunque no
la he
revisado detalladamente.
# Creando una matriz A
set.seed(123)
A <- matrix(rnorm(4), ncol = 2)
A
# Elevando cada elemento de A a la potencia k
f1 <- function(x,k) x^k
f1(A, 2) # A^2
f1(A, 5) # A^5
# Producto matricial de A por si misma k veces
f2 <- function(x, k){
r <- diag(dim(x)[2])
for(i in 1:k) r <- r %*% x
r
}
f2(A,2) # A x A
f2(A,3) # A x A x A
f2(A,5) # A x A x A x A x A
Saludos,
Jorge Ivan Velez
2009/11/12 Cesar Escalante <>
> Cordial saludo.
>
> Les agradecería que me ayudaran con una función eficiente para calcular
> potencias de una matriz. ¿Cuál biblioteca la tiene?
>
> Gracias de antemano
>
>
> César Escalante C.
>
> [[alternative HTML version deleted]]
>
>
> _______________________________________________
> R-help-es mailing list
> R-help-es@r-project.org
> https://stat.ethz.ch/mailman/listinfo/r-help-es
>
>
[[alternative HTML version deleted]]
Jorge, Kjetil, muchas gracias.
No sabía de la existencia de otras bibliotecas.
Al ejecutar el comando
install.packages("expm",
repos="http://R-Forge.R-project.org<http://r-forge.r-project.org/>
")
sale el siguiente mensaje:
Warning: unable to access index for repository
http://R-Forge.R-project.org/bin/windows/contrib/2.9<http://r-forge.r-project.org/bin/windows/contrib/2.9>
Warning message:
In getDependencies(pkgs, dependencies, available, lib) :
package ‘expm’ is not available
Jorge no estoy desarrollando una aplicación concreta. Estaba estudiando y
tuve esa necesidad. Ya había escrito una función, pero es mejor saber si
existe una escrita en una biblioteca especializada.
Miré Matrix y no encuentro la función.
Gracias de nuevo.
Saludos.
César Escalante C.
El 13 de noviembre de 2009 10:16, Jorge Ivan Velez
<jorgeivanvelez@gmail.com> escribió:
> Buenos dias Kjetil y César,
>
> Sólo para los archivos: si la eficiencia es importante en la aplicación,
> el utilizar la función matpow en la libreria expm de R-Forge es muchísimo
> mejor. Este es un ejemplo de una matriz A de orden 2x2 cuando k=2 y se
> realizan 100000 repeticiones:
>
> # install.packages("expm",
repos="http://R-Forge.R-project.org<http://r-forge.r-project.org/>
> ")
> require(expm)
>
> # matpow
> system.time(replicate(100000, A %^% 2))
> # user system elapsed
> # 0.71 0.02 0.72
>
> # f2
> system.time(replicate(100000, f2(A,2)))
> # user system elapsed
> # 8.92 0.00 8.96
>
> Saludos a ambos,
>
> Jorge Ivan Velez
>
> 2009/11/13 Kjetil Halvorsen <>
>
>> El paquete expm, no en CRAN, pero en R-forge, tiene una
funci''on
>> matpow
>>
>> Kjetil
>>
>> 2009/11/13 Jorge Ivan Velez <>:
>>
>> > Buenas noches César,
>> >
>> > Si te refieres a tomar cada elemento de una matriz, digamos A, y
>> elevarlos a
>> > una potencia k, entonces escribir
>> >
>> > A^k
>> >
>> > en la consola del R es más que suficiente.
>> >
>> > Sea k = 2. Si en vez de lo anterior lo que necesitas es B = A x A
>> (porque
>> > k=2), entonces podrías construir una función que lo realice.
"A mano"
>> > escribirías lo siguiente en la consola:
>> >
>> > B <- A %*% A
>> > B
>> >
>> > El problema es que cuando k es por ejemplo 10, lo anterior es
bastante
>> > ineficiente.
>> >
>> > A continuación te doy varios ejemplos de ambas situaciones. El uso
de f1
>> o
>> > f2 depende de tu aplicación. Si ninguna de las dos opciones es lo
que
>> > buscas, quizás un poco más de detalle podría ayudarnos a ayudarte.
De
>> qué
>> > dimensión es la matriz A de tu aplicación y qué valores puede
tomar k?
>> >
>> > Una librería que podría ser de utilidad podría ser
"Matrix", aunque no
>> la he
>> > revisado detalladamente.
>> >
>> > # Creando una matriz A
>> > set.seed(123)
>> > A <- matrix(rnorm(4), ncol = 2)
>> > A
>> >
>> > # Elevando cada elemento de A a la potencia k
>> > f1 <- function(x,k) x^k
>> > f1(A, 2) # A^2
>> > f1(A, 5) # A^5
>> >
>> > # Producto matricial de A por si misma k veces
>> > f2 <- function(x, k){
>> > r <- diag(dim(x)[2])
>> > for(i in 1:k) r <- r %*% x
>> > r
>> > }
>> > f2(A,2) # A x A
>> > f2(A,3) # A x A x A
>> > f2(A,5) # A x A x A x A x A
>> >
>> > Saludos,
>> >
>> > Jorge Ivan Velez
>> >
>> >
>> > 2009/11/12 Cesar Escalante <>
>> >
>> >> Cordial saludo.
>> >>
>> >> Les agradecería que me ayudaran con una función eficiente para
calcular
>> >> potencias de una matriz. ¿Cuál biblioteca la tiene?
>> >>
>> >> Gracias de antemano
>> >>
>> >>
>> >> César Escalante C.
>> >>
>> >> [[alternative HTML version deleted]]
>> >>
>> >>
>> >> _______________________________________________
>> >> R-help-es mailing list
>> >> R-help-es@r-project.org
>> >> https://stat.ethz.ch/mailman/listinfo/r-help-es
>> >>
>> >>
>> >
>> > [[alternative HTML version deleted]]
>> >
>> >
>> > _______________________________________________
>> > R-help-es mailing list
>> > R-help-es@r-project.org
>> > https://stat.ethz.ch/mailman/listinfo/r-help-es
>> >
>> >
>>
>>
>>
>> --
>> "... an entire human genome would fit on a music CD."
>>
>> --- www.thinkgene.com
>>
>
>
[[alternative HTML version deleted]]
Buenas tardes César,
Es sólo un warning. Qué pasa cuando escribes library(expm) despues de
install.packages(...)? Cuál es tu sessionInfo()?
Si no puedes utilizar matpow, entonces actualiza tu versión de R (veo que
tienes 2.9.2) y ejecuta de nuevo
install.packages("expm",
repos="http://R-Forge.R-project.org<http://r-forge.r-project.org/>
")
require(expm)
Seguramente una vez hagas lo anterior, todo funcionará. Si aún después de
hacer lo anterior no funciona, entonces ingresa a
http://r-forge.r-project.org/R/?group_id=107, descarga manualmente el
archivo .zip y luego utiliza Packages -> Install Packages from zip files...
en la consola del R.
Esta es mi sessionInfo():
R version 2.10.0 Patched (2009-10-26 r50212)
i386-pc-mingw32
locale:
[1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United
States.1252
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C
[5] LC_TIME=English_United States.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
loaded via a namespace (and not attached):
[1] tools_2.10.0
Espero sea de utilidad,
Jorge Ivan Velez
2009/11/13 Cesar Escalante <>
> Jorge, Kjetil, muchas gracias.
> No sabía de la existencia de otras bibliotecas.
>
> Al ejecutar el comando
> install.packages("expm",
repos="http://R-Forge.R-project.org<http://r-forge.r-project.org/>
> ")
>
> sale el siguiente mensaje:
>
> Warning: unable to access index for repository
>
http://R-Forge.R-project.org/bin/windows/contrib/2.9<http://r-forge.r-project.org/bin/windows/contrib/2.9>
> Warning message:
> In getDependencies(pkgs, dependencies, available, lib) :
> package ‘expm’ is not available
>
> Jorge no estoy desarrollando una aplicación concreta. Estaba estudiando y
> tuve esa necesidad. Ya había escrito una función, pero es mejor saber si
> existe una escrita en una biblioteca especializada.
>
> Miré Matrix y no encuentro la función.
>
> Gracias de nuevo.
>
> Saludos.
>
> César Escalante C.
>
>
>
> El 13 de noviembre de 2009 10:16, Jorge Ivan Velez <> escribió:
>
> Buenos dias Kjetil y César,
>>
>> Sólo para los archivos: si la eficiencia es importante en la
aplicación,
>> el utilizar la función matpow en la libreria expm de R-Forge es
muchísimo
>> mejor. Este es un ejemplo de una matriz A de orden 2x2 cuando k=2 y se
>> realizan 100000 repeticiones:
>>
>> # install.packages("expm",
repos="http://R-Forge.R-project.org<http://r-forge.r-project.org/>
>> ")
>> require(expm)
>>
>> # matpow
>> system.time(replicate(100000, A %^% 2))
>> # user system elapsed
>> # 0.71 0.02 0.72
>>
>> # f2
>> system.time(replicate(100000, f2(A,2)))
>> # user system elapsed
>> # 8.92 0.00 8.96
>>
>> Saludos a ambos,
>>
>> Jorge Ivan Velez
>>
>> 2009/11/13 Kjetil Halvorsen <>
>>
>>> El paquete expm, no en CRAN, pero en R-forge, tiene una
funci''on
>>> matpow
>>>
>>> Kjetil
>>>
>>> 2009/11/13 Jorge Ivan Velez <>:
>>>
>>> > Buenas noches César,
>>> >
>>> > Si te refieres a tomar cada elemento de una matriz, digamos A,
y
>>> elevarlos a
>>> > una potencia k, entonces escribir
>>> >
>>> > A^k
>>> >
>>> > en la consola del R es más que suficiente.
>>> >
>>> > Sea k = 2. Si en vez de lo anterior lo que necesitas es B = A
x A
>>> (porque
>>> > k=2), entonces podrías construir una función que lo realice.
"A mano"
>>> > escribirías lo siguiente en la consola:
>>> >
>>> > B <- A %*% A
>>> > B
>>> >
>>> > El problema es que cuando k es por ejemplo 10, lo anterior es
bastante
>>> > ineficiente.
>>> >
>>> > A continuación te doy varios ejemplos de ambas situaciones. El
uso de
>>> f1 o
>>> > f2 depende de tu aplicación. Si ninguna de las dos opciones es
lo que
>>> > buscas, quizás un poco más de detalle podría ayudarnos a
ayudarte. De
>>> qué
>>> > dimensión es la matriz A de tu aplicación y qué valores puede
tomar k?
>>> >
>>> > Una librería que podría ser de utilidad podría ser
"Matrix", aunque no
>>> la he
>>> > revisado detalladamente.
>>> >
>>> > # Creando una matriz A
>>> > set.seed(123)
>>> > A <- matrix(rnorm(4), ncol = 2)
>>> > A
>>> >
>>> > # Elevando cada elemento de A a la potencia k
>>> > f1 <- function(x,k) x^k
>>> > f1(A, 2) # A^2
>>> > f1(A, 5) # A^5
>>> >
>>> > # Producto matricial de A por si misma k veces
>>> > f2 <- function(x, k){
>>> > r <- diag(dim(x)[2])
>>> > for(i in 1:k) r <- r %*% x
>>> > r
>>> > }
>>> > f2(A,2) # A x A
>>> > f2(A,3) # A x A x A
>>> > f2(A,5) # A x A x A x A x A
>>> >
>>> > Saludos,
>>> >
>>> > Jorge Ivan Velez
>>> >
>>> >
>>> > 2009/11/12 Cesar Escalante <>
>>> >
>>> >> Cordial saludo.
>>> >>
>>> >> Les agradecería que me ayudaran con una función eficiente
para
>>> calcular
>>> >> potencias de una matriz. ¿Cuál biblioteca la tiene?
>>> >>
>>> >> Gracias de antemano
>>> >>
>>> >>
>>> >> César Escalante C.
>>> >>
>>> >> [[alternative HTML version deleted]]
>>> >>
>>> >>
>>> >> _______________________________________________
>>> >> R-help-es mailing list
>>> >> R-help-es@r-project.org
>>> >> https://stat.ethz.ch/mailman/listinfo/r-help-es
>>> >>
>>> >>
>>> >
>>> > [[alternative HTML version deleted]]
>>> >
>>> >
>>> > _______________________________________________
>>> > R-help-es mailing list
>>> > R-help-es@r-project.org
>>> > https://stat.ethz.ch/mailman/listinfo/r-help-es
>>> >
>>> >
>>>
>>>
>>>
>>> --
>>> "... an entire human genome would fit on a music CD."
>>>
>>> --- www.thinkgene.com
>>>
>>
>>
>
[[alternative HTML version deleted]]