使用循环的矩阵乘法

时间:2017-12-12 09:06:35

标签: r loops matrix

我有链式格式的矩阵乘法问题。我只有一个输入矩阵A,将保存矩阵B< - 矩阵A.需要以下面的方式相乘

C = B * A
D = C * A
E = D * A

A是每个月所有乘法的参考矩阵。 这个乘法链一直持续到18个月。

矩阵A:

2   3
4   2

代码:

a = matrix( c(2, 3, 4, 2), nrow=2, ncol=2, byrow = TRUE) 
b <- a 
c <- b %*% a
d <- c %*% a
e <- d %*% a
f <- e %*% a
g <- f %*% a

每次A是参考矩阵,以便将来与结果相乘。这重复了18次。

我必须手动将上面的乘法运算18次,所以寻找一个循环。

预期产出:

  

c&lt; - b%*%a

     

C

     [,1] [,2]
[1,]   16   12
[2,]   16   16
  

d&lt; - c%*%a

     

d

     [,1] [,2]
[1,]   80   72
[2,]   96   80
  

e&lt; - d%*%a

     

ë

     [,1] [,2]
[1,]  448  384
[2,]  512  448
  

f&lt; - e%*%a

     

˚F

     [,1] [,2]
[1,] 2432 2112
[2,] 2816 2432

所以这应该重复18次。请帮忙。提前致谢。

在之前发布的问题中,逻辑是不同的。

1 个答案:

答案 0 :(得分:3)

你可以这样做:

Mpow <- function(A, n) {
  if (n==1) return(list(A))
  L <- list(A)
  P <- A
  for (i in 2:n) {
    P <- P %*% A
    L[[i]] <- P
  }
  return(L)
}

a = matrix( c(2, 3, 4, 2), nrow=2, ncol=2, byrow = TRUE) 
Mpow(a, 1)
Mpow(a, 2)
Mpow(a, 18)

您将获得矩阵的权力列表。问题中的矩阵fMpow(a,5)的最后一个元素 这是函数的简短变体:

Mpow <- function(A, n) {
  L <- list(A)
  if (n==1) return(L)
  P <- A
  for (i in 2:n) L[[i]] <- (P <- P %*% A)
  return(L)
}

无需定义新功能即可:

n <- 5
Reduce('%*%', rep(list(a), n), accumulate=TRUE)