vacio una transpuesta sustituir studio por operaciones matriz matrices entre data crear concatenar columnas r matrix linear-algebra

una - sustituir na por 0 en r



Potencia de matriz en R (5)

Al tratar de calcular el poder de una matriz en R, encontré que el paquete expm implementa el operador %^% .

Entonces x% ^% k calcula la potencia k-ésima 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 A% ^% 4!

¿Cómo se realiza la operación de potencia de la matriz?


A ^ 5 = (A ^ 4) * A

Supongo que la biblioteca muta la variable original, A, de modo que cada paso implica multiplicar el resultado hasta la matriz original, A. El resultado que obtienes parece estar bien, solo asignarlos a una nueva variable.


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 puedes estudiar mirando en su lugar la función llamada matpowfast .

Necesitas dos variables:

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

Puede 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 de paquete usa la variable inicial A como la variable intermedia mat .


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 suposición es que R está tratando de ser inteligente pasando por referencia en lugar de valores. Para lograr que esto funcione, debes 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

¿Cuál es la forma 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 de C / Fortran tenga efectos secundarios en el entorno global.


He solucionado ese error en las fuentes de R-forge (del paquete "expm"), svn rev. 53. -> página expm R-forge Por alguna razón, la página web aún muestra rev.52, por lo que es posible que lo siguiente no resuelva su problema (pero debe hacerlo en 24 horas):

install.packages("expm", repos="http://R-Forge.R-project.org")

De lo contrario, obtenga la versión de svn directamente e instálese usted mismo:

svn checkout svn://svn.r-forge.r-project.org/svnroot/expm

Gracias a "gd047" que me alertó sobre el problema por correo electrónico. Tenga en cuenta que R-forge también tiene sus propias instalaciones de seguimiento de errores.
Martint


Una solución muy rápida sin utilizar ningún paquete es usar recursividad: si su matriz es una

powA = function(n) { if (n==1) return (a) if (n==2) return (a%*%a) if (n>2) return ( a%*%powA(n-1)) }

HTH