【问题标题】:Combining different matrices in a for loop在 for 循环中组合不同的矩阵
【发布时间】:2012-04-10 12:59:25
【问题描述】:

我想在一个循环中创建不同的矩阵,然后组合(cbind 或 rbind)它们。但是以下代码不起作用。为什么不?以及如何解决?

dependent = matrix(c(30,184,6,106), 2, 2, byrow=T)
independent = c(160,166)
expected = numeric()
{for(i in 1:length(independent))
a = dependent*independent[i]/sum(independent)
expected = cbind(expected,a)}

这给出了:

expected
        [,1]     [,2]
[1,] 15.276074 93.69325
[2,]  3.055215 53.97546

这是仅使用 for 循环的最终迭代的结果。所以结果就像只使用了 166,但没有使用 160。

【问题讨论】:

标签: r binding for-loop


【解决方案1】:

几个cmets:

  1. 您的for 循环括号放错了位置。你有:

    R> {for(i in 1:3) 
    +   cat(i, "\n")
    +   cat(i, "\n")
    + }
    1 
    2 
    3 
    3 
    

    你应该有:

    R> for(i in 1:3) {
    +   cat(i, "\n")
    +   cat(i, "\n")
    + }
    1 
    1 
    2 
    2 
    3 
    3 
    

    当您构造for 循环并省略括号时,仅使用for 语句之后的第一行。

  2. 您可以通过保存sum(independent) 的结果来提高for 循环的效率,因为这不会随着每次迭代而改变,即

      for(i in 1:length(independent)){
          a = dependent*independent[i]
          expected = cbind(expected,a)
       }
       expected  = expected//sum(independent)
    
  3. 其实你可以向量化整个计算

    y = sapply(independent, '*', dependent)
    matrix(y, ncol=4,nrow=2)/sum(independent)
    

【讨论】:

    【解决方案2】:

    您可以完全放弃 for 循环并使用:

    X <- lapply(independent, function(x) (dependent*x)/sum(independent))
    do.call("cbind", X)
    

    编辑:我编辑了我的回复,因为顺序不正确。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 2016-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多