【问题标题】:How to vectorize this code in R如何在 R 中向量化这段代码
【发布时间】:2015-06-04 19:50:15
【问题描述】:

起点:

m <- matrix(c(12,9,8,31), nrow=2)
(m.obs <- m.exp <- addmargins(m, FUN=sum, quiet=T))

我有以下代码:

m.exp[1,1] <- m.obs[1,3] / m.obs[3,3] * m.obs[3,1]
m.exp[1,2] <- m.obs[1,3] / m.obs[3,3] * m.obs[3,2]
m.exp[2,1] <- m.obs[2,3] / m.obs[3,3] * m.obs[3,1]
m.exp[2,2] <- m.obs[2,3] / m.obs[3,3] * m.obs[3,2]

这可以写成一个嵌套循环如下:

for (row in 1:2) {
  for (column in 1:2) {
    m.exp[row,column] <- m.obs[row,3] / m.obs[3,3] * m.obs[3,column]
  }
}

我的问题是这是否也可以以矢量化形式编写。有没有不同的方法可以矢量化这段代码?还是有其他方法可以简化它?

我的目标是找到不同的可能性来说明如何在 R 中使代码更快和/或更优雅。这个想法当然是拥有比这个玩具示例大得多的矩阵。

此示例的背景是根据chi-squared test 的观察频率计算预期频率矩阵。

【问题讨论】:

  • 请提供m.expm.obs 的示例值(例如使用dput)。
  • @JoshuaUlrich:我也添加了一些背景信息

标签: r optimization vectorization simplify


【解决方案1】:

试试这个

(m.obs[-3, 3]/ m.obs[3,3]) %*% t(m.obs[3, -3])

【讨论】:

  • +1,你能解释一下你是如何到达那里的吗?是否涉及一些一般原则?谢谢!
  • 将问题转化为矩阵代数。我很高兴能帮上忙。
【解决方案2】:

你可以通过写成来避免循环

m.exp[1:2, 1:2] <- m.obs[rep(1:2, 2), 3] *
    m.obs[3, rep(1:2, each = 2)] / m.obs[3,3]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多