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?

Author: George Dontas, 2010-07-18

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

 28
Author: Martin Mächler,
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.

 8
Author: Eduardo Leoni,
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:

  1. result, para almacenar la salida,
  2. 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.

 2
Author: Wok,
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

 2
Author: DKK,
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.

 0
Author: Michiel,
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