2015-12-16 123 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 

這是(上平均)稍快一些,但我認爲使用一些內置函數魔法的結果可能會更好。也許有人可以幫忙?