2016-12-02 104 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