Matriz de potencia en R
Tratando de calcular la potencia de una matriz en R, encontré que el paquete expm
implementa el operador %^%.
Así que x %^% k calcula la k-ésima potencia de una matriz.
> A<-matrix(c(1,3,0,2,8,4,1,1,1),nrow=3)
> A %^% 5
[,1] [,2] [,3]
[1,] 6469 18038 2929
[2,] 21837 60902 9889
[3,] 10440 29116 4729
Pero, para mi sorpresa:
> A
[,1] [,2] [,3]
[1,] 691 1926 312
[2,] 2331 6502 1056
[3,] 1116 3108 505
De alguna manera la matriz inicial A ha cambiado a un %^% 4 !!!
¿Cómo se realiza la operación de energía de la matriz?
5 answers
He corregido ese error en las fuentes de R-forge (del paquete "expm" ), svn apo. 53. -- >expm R-forge page Por alguna razón, la página web todavía muestra rev. 52, por lo que lo siguiente aún no puede resolver su problema (pero debe dentro de 24 horas):
install.packages("expm", repos="http://R-Forge.R-project.org")
De lo contrario, obtenga la versión svn directamente e instálese usted mismo:
svn checkout svn://svn.r-forge.r-project.org/svnroot/expm
Gracias a "gd047" que me alertó del problema por correo electrónico.
Tenga en cuenta que R-forge también tiene sus propias instalaciones de seguimiento de errores.
Martint
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-20 07:48:50
Esta no es una respuesta adecuada, pero puede ser un buen lugar para tener esta discusión y entender el funcionamiento interno de R. Este tipo de error se ha deslizado antes en otro paquete que estaba usando.
Primero, tenga en cuenta que simplemente asignar la matriz a una nueva variable primero no ayuda:
> A <- B <-matrix(c(1,3,0,2,8,4,1,1,1),nrow=3)
> r1 <- A %^% 5
> A
[,1] [,2] [,3]
[1,] 691 1926 312
[2,] 2331 6502 1056
[3,] 1116 3108 505
> B
[,1] [,2] [,3]
[1,] 691 1926 312
[2,] 2331 6502 1056
[3,] 1116 3108 505
Mi conjetura es que R está tratando de ser inteligente pasando por referencia en lugar de valores. Para que esto funcione, necesitas hacer algo para diferenciar A de B:
`%m%` <- function(x, k) {
tmp <- x*1
res <- tmp%^%k
res
}
> B <-matrix(c(1,3,0,2,8,4,1,1,1),nrow=3)
> r2 <- B %m% 5
> B
[,1] [,2] [,3]
[1,] 1 2 1
[2,] 3 8 1
[3,] 0 4 1
¿Qué es el ¿manera explícita de hacer esto?
Finalmente, en el código C para el paquete, hay este comentario:
- NB: x será alterado! La persona que llama debe hacer una copia si es necesario
Pero no entiendo por qué R permite que el código C/Fortran tenga efectos secundarios en el entorno global.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-18 17:01:43
Aunque el código fuente no es visible en el paquete ya que está empaquetado en un .dll file
, creo que el algoritmo utilizado por el paquete es el algoritmo de exponenciación rápida, que puede estudiar mirando la función llamada matpowfast
en su lugar.
Necesitas dos variables:
-
result
, para almacenar la salida, -
mat
, como variable intermedia.
Para calcular A^6
, desde 6 = 110
(escritura binaria), al final, result = A^6
y mat = A^4
. Esto es lo mismo para A^5
.
Usted podría comprobar fácilmente si mat = A^8
cuando intenta calcular A^n
para cualquier 8<n<16
. Si es así, tienes tu explicación.
La función package utiliza la variable inicial A
como variable intermedia mat
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-18 17:04:24
Solución muy rápida sin usar ningún paquete está usando recursividad: si su matriz es un
powA = function(n)
{
if (n==1) return (a)
if (n==2) return (a%*%a)
if (n>2) return ( a%*%powA(n-1))
}
HTH
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-02 15:33:07
A^5 = (A^4) * A
Supongo que la biblioteca muta la variable original, A, de modo que cada paso implica multiplicar el resultado-hasta-entonces con la matriz original, A. El resultado que obtiene parece estar bien, solo asígnelos a una nueva variable.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-18 08:36:49