有效地从乘法子矩阵中构造矩阵

时间:2015-12-16 11:42:59

标签: r matrix

我想构造一个矩阵(其中A是一个实矩阵,我是单位矩阵):

enter image description here

我不想使用for循环。我尝试过这样的事情:

sequence = 1:T
sapply(sequence, function(i) matrix(A%^%(i-1)))

但失败了。我想在图片中创建第一个矩阵列并继续以对角线方式复制计算矩阵,但我不知道如何实现这一点。

修改:对于我所造成的麻烦,我感到非常抱歉。以下是我在快速而肮脏的循环中寻找的内容

library("expm")

n<-5

A<-matrix(1, 2, 2)
output <- matrix(0, 5*2, 5*2)

for (i in 1:5) {
  for (j in i:1) {
    output[(2*(i-1)+1):(2*i),(2*(j-1)+1):(2*j)] = A %^% (i-j)
  }
}

2 个答案:

答案 0 :(得分:1)

我想出了别的东西:

library("expm")

n<-5
A<-matrix(1, 2, 2)

output <- matrix(0, 5*2, 5*2)
output2 <- matrix(0, 5*2, 5*2)

start.time <- Sys.time()
for(dummy in 1:2000){
  for (i in 1:5) {
    for (j in i:1) {
      output[(2*(i-1)+1):(2*i),(2*(j-1)+1):(2*j)] = A %^% (i-j)
    }
  }
}
end.time <- Sys.time()
time.taken <- end.time - start.time
time.taken

start.time <- Sys.time()


for(dummy in 1:2000){
  for (i in 1:5) {
    output2[(2*(i-1)+1):(2*i),1:2] = A %^% (i-1)
  }

  rowLength = dim(output2)[1]

  for (i in 2:5) {
    output2[(2*i-1):rowLength,(2*i-1):(2*i)] = output2[1:(rowLength-(2*(i-1))),1:2]
  }
}
end.time <- Sys.time()
time.taken <- end.time - start.time
time.taken

这(平均)速度稍微快一点,但我认为使用一些内置的功能魔法,结果会更好。也许有人可以帮忙吗?

答案 1 :(得分:0)

您是否一直关注https://stat.ethz.ch/R-manual/R-devel/library/base/html/lower.tri.html上记录的lower.tri(x, diag = TRUE)

我已经举例说明了如何应用它here

步骤如下:

A <- matrix(1:25, 5, 5)  # construct the initial matrix
B <- A * lower.tri(A)    # convert A to a lower triangular matrix of booleans (with TRUE below diagonal, FALSE from diagonal and up)
B <- B * A + diag(5)     # construct the final result
B