2016-12-02 107 views
0

我想,以填補我創建的空矩陣具有循環:[R填幾個空矩陣與循環

首先,我創建了我的空matrizes,工作正常:

for(q in (15:30)){ 
assign(paste0("P",q), matrix(, nrow = q, ncol = q+1))} 

但現在當我想與我的公式來填充這些矩陣,我得到一個錯誤的尺寸:

for(c in (1:q+1)){ 
    for(i in (1:q)){assign(paste0("P",q)[i,c], 
((((((q-c) + 1 -(q-c+1- i))/q)^.69)/(((((q-c) + 1 - (q-c+1-i))/q)^.69+(((1 - ((q-c) + 1 -(q-c+1-i))/q))^.69))^(1/.69))) - (((((q-c)-(q-c+1-i))/q)^.69)/(((((q-c) - (q-c+1-i))/q)^.69+(((1 - ((q-c)-(q-c+1-i))/q))^.69))^(1/.69)))))}}} 

不過當我使用這個循環爲它的工作原理例如,單個矩陣:

t <- 20 
c <- 1 
i <- 1 
for(c in (1:t+1)){ 
    for(i in (1:t)){P20[i,c]<-((((((t-c) + 1 -(t-c+1-i))/t)^.69)/ 
             (((((t-c) + 1 - (t-c+1-i))/t)^.69+(((1 - ((t-c) + 1 -(t-c+1-i))/t))^.69))^(1/.69))) - 
            (((((t-c)-(t-c+1-i))/t)^.69)/(((((t-c) - (t-c+1-i))/t)^.69+(((1 - ((t-c)-(t-c+1-i))/t))^.69))^(1/.69))))}} 

該公式是根據積累前景理論給出概率權重,如果任何人有興趣。

你們有什麼想法讓我更優雅嗎?我應該更好地編寫一個用戶定義的函數嗎?

+0

你一定要一個'for'循環,就可以做到這一點沒有 – jamieRowen

+0

我非常樂意做到這一點沒有循環 – Max

回答

1

如果你很高興與你得到的矩陣與你指定你可以做類似的相同名稱的列表是:

l = lapply(15:30, function(q){ 
    t = q 
    matrix(apply(expand.grid(1:q,1:(q+1)),1, 
     function(x){ 
      i = x[1] 
      c = x[2] 
      ((((((t-c) + 1 -(t-c+1-i))/t)^.69)/ 
       (((((t-c) + 1 - (t-c+1-i))/t)^.69+(((1 - ((t-c) + 1 -(t-c+1-i))/t))^.69))^(1/.69))) - 
       (((((t-c)-(t-c+1-i))/t)^.69)/(((((t-c) - (t-c+1-i))/t)^.69+(((1 - ((t-c)-(t-c+1-i))/t))^.69))^(1/.69)))) 


     }),nrow = q, ncol = q+1, byrow = TRUE) 
}) 
names(l) = paste0("P",15:30) 

我已經使用位像t=qi=x[1]; c=x[2]這樣我可以只複製粘貼你的公式爲概率。

我們在這裏做的是使用lapply來遍歷您的問題中給定的行號,然後我們使用expand.grid給出合成向量中所有單元格的指示對。對於這些指標,我們應用了一個函數,該函數給出了行i,列c根據您的公式計算了概率。然後將這些值轉換爲矩陣,以便結果具有適當的結構。

你最終矩陣的一個名爲「P15」,「P16」,成分列表l ...

+0

謝謝@jamieRowen您的幫助,特別是您的詳細解釋。但是現在,如果我想進一步使用矩陣,我必須將列表「l」取消列表。 – Max

+0

@Max,根本沒有。如果你想訪問一個單獨的矩陣,你可以做'$ P15'。您也可以使用'attach(l)'將所有列表值組件帶入全局環境。我建議在決定這是否是一個好主意之前,先仔細閱讀附加的危險性。 'unlist'會將你的矩陣堆積成一個巨大的矢量,我懷疑這不是你想要的。 – jamieRowen

+0

好的。所以我需要進一步修改我的矩陣。我應該將它保存在列表中,然後進行修改嗎? – Max