2

I'm trying to create a function that will give me the value of a matrix once it has been raised to a power. This is what I've done so far:

A <- matrix(c(1,2,3,4,0,1,2,3,0,0,1,2,0,0,0,1),nrow=4,ncol=4)

power <- function(A,n){
+ if(n == 0){
+ return(diag(4))
+ }else{
+ return(A%*%A^(n-1))
+ }
+ }

OUTCOME:

> power(A,4)
[,1] [,2] [,3] [,4]
[1,]    1    0    0    0
[2,]   10    1    0    0
[3,]   46   10    1    0 
[4,]  146   46   10    1

This is giving a different value from what my calculator gets and I'm trying to figure what I'm doing wrong. Any help is appreciated!

3 Answers3

3

We could use %^% from library(expm)

library(expm)
A%*%(A%^%3)

Using this in a function

power <- function(A,n){
   if(n == 0){
     return(diag(4))
   }else{
 return(A%*%(A%^%(n-1)))
 }
}

power(A,4)
#     [,1] [,2] [,3] [,4]
#[1,]    1    0    0    0
#[2,]    8    1    0    0
#[3,]   36    8    1    0
#[4,]  120   36    8    1

According to the description in ?matpow

Compute the k-th power of a matrix. Whereas ‘x^k’ computes element wise powers, ‘x %^% k’ corresponds to k - 1 matrix multiplications, ‘x %% x %% ... %*% x’.


Or a base R option is Reduce with %*% (but this would be slow compared to %^%.

Reduce(`%*%`,replicate(4, A, simplify=FALSE))

In a function,

power1 <- function(A,n){
   if(n == 0){
    return(diag(4))
   }else{
    Reduce(`%*%`,replicate(n, A, simplify=FALSE))
   }
}

power1(A,4)
#     [,1] [,2] [,3] [,4]
#[1,]    1    0    0    0
#[2,]    8    1    0    0
#[3,]   36    8    1    0
#[4,]  120   36    8    1
akrun
  • 874,273
  • 37
  • 540
  • 662
1

You have a problem with the way you are computing your matrix product. I use a while loop inside your power() function instead. It simply multiples the input matrix against itself n times and then returns the result. Here is a base R solution which is a continuation of the direction in which you were already going.

A <- matrix(c(1,2,3,4,0,1,2,3,0,0,1,2,0,0,0,1),nrow=4,ncol=4)

power <- function(A,n){
    B <- diag(nrow(A))
    if (n == 0) {
    return(diag(nrow(A)))
    } else {
        while (n > 0) {
            B <- A%*%B
            n <- n - 1
        }
        return(B)
    }
}

> power(A, 4)
     [,1] [,2] [,3] [,4]
[1,]    1    0    0    0
[2,]    8    1    0    0
[3,]   36    8    1    0
[4,]  120   36    8    1
Tim Biegeleisen
  • 502,043
  • 27
  • 286
  • 360
0

I assume you want to make the muliplication of the matrix.You have to first make the multiply the matrix and then try to multiply them using the same powers as you want ,so you can do two things

  1. Write code to multiply the matrix .
  2. Loop the code to multiply.