2015-12-16 87 views
3

我希望构造像一个矩阵(其中A是一个真正的矩阵,I是单位矩阵):构建矩阵相乘出子矩阵有效

enter image description here

我不希望使用for循环。我试过的东西是:

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

但失败。我想创建图片中的第一个矩阵列,并继续复制计算矩阵diagonaly,但我不知道如何实现这一点。

编辑:我非常抱歉,我造成的麻烦。下面就是我在寻找一个快速和肮脏的for循环

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) 
    } 
} 
+0

快速和脏循环通常是要走的路... – user20650

+0

ps你应该在答案部分发布你的解答作为答案,而不是作为你的问题的编辑 – user20650

+0

问题是,我想运行循环从一个时间敏感的模拟研究中从上面 - 所以我必须尽可能快地编码。上述解决方案只是为了举例说明我正在尝试做什么。一方面,它的缺点是,A^i(对于i是一个任意的自然数)的计算一遍又一遍地完成。我在最近的回答中纠正了这个问题。但我认为,应用类似功能的过程可能会更快。 – user241879

回答

0

你去过看lower.tri(x, diag = TRUE)https://stat.ethz.ch/R-manual/R-devel/library/base/html/lower.tri.html记录?

我做的如何应用它的一个例子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 
+0

谢谢你的回答。我只是看着它,但我无法弄清楚如何设置矩阵的行依赖指数。此外,我试图用sapply来使用它,但是我确实得到了一个混乱的向量。 – user241879

+0

@ user241879我刚刚附加了应用函数的示例。 –

+0

@ user20650我提供的例子是使用方矩阵。你能给我一个例子,说明产出与预期的不同吗? –

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 

这是(上平均)稍快一些,但我认为使用一些内置函数魔法的结果可能会更好。也许有人可以帮忙?