【问题标题】:How to vectorize this mathematical formula?如何向量化这个数学公式?
【发布时间】:2015-04-06 13:50:44
【问题描述】:

我正在评估this formula(来自Székely and Rizzo, 2013,第1263 页),其中ab 是对称的n-by-n 矩阵。

如何使用嵌套的for 循环对该部分进行矢量化?我觉得可能有一些聪明的矩阵操作技巧可以在这里使用,也许与sweep 函数一起使用。

这是我现在拥有的:

u_squared <- function(a, b, n) {
  a. <- .colSums(a, n, n)
  b. <- .colSums(b, n, n)
  a.. <- sum(a.)
  b.. <- sum(b.)
  u1 <- 0
  u2 <- 0
  u3 <- 0
  for (i in 1:n) {
    for (j in 1:n) {
      u1 <- u1 + a[i, j] * b[i, j]
      u2 <- u2 + a[i, j] * (b.. - 2*b.[j] - 2*b.[i] + 2*b[i, j])
      u3 <- u3 + a[i, j] * (b.[i] - b[i, j])
    }
  }
  u1 <- u1 / (n * (n-1))
  u2 <- u2 / (n * (n-1) * (n-2) * (n-3))
  u3 <- u3 / (n * (n-1) * (n-2))
  return (u1 + u2 - 2 * u3)
}

例如,我知道u1 可以简单地计算为u1 &lt;- a * b,但我想展开整个公式只是为了演示基础数学。我正在寻找u2u3 的类似矢量化。

【问题讨论】:

  • 不是每个人都可以访问付费墙后面的公式。
  • @ExperimenteR 这就是为什么我在for 循环中尽可能清晰和迂腐地编写它的原因。我会用 MathJax 把它写出来,但我们在这个网站上没有。
  • 谷歌搜索开放访问。同一作者有一个名为 energy 的 r 包。
  • @ExperimenteR 我很清楚。我也没有找到这篇特定论文的开放获取版本。您介意分享链接以便我将其添加到我的帖子中吗?
  • @ExperimenteR 我添加了一个指向 Overleaf 文档的链接,其中包含论文中出现的公式

标签: r math matrix vectorization


【解决方案1】:

可以很容易地向量化

u_squared1 <- function(a, b, n){
  b. <- matrix(.colSums(b, n, n), n, n) 
  B1 <- b.. - 2 * b. - 2 * t(b.) + 2*b
  B2 <- b. - b
  u1 <- sum(a*b) / (n * (n-1))
  u2 <- sum(a*B1) / (n * (n-1) * (n-2) * (n-3))
  u3 <- sum(a*B2) / (n * (n-1) * (n-2))
  return (u1 + u2 - 2 * u3)
}

【讨论】:

  • 我可以先b. &lt;- matrix(.colSums(b, n, n), n, n) 然后B1 &lt;- mean(b.) - 2 * b. - 2 * t(b.) + 2*b吗?
  • 另请注意,在您指出我的意思是“sums”时我写了“means”之后,我编辑了 OP
  • @ssdecontrol 我批准了您的编辑,但您需要在函数范围内定义b.. &lt;- mean(b.)
  • 当然。我什至没有看到你将它包装在一个函数中,它只是引起了我的注意。无论哪种方式,它都有效。我需要学会更适应参数回收
猜你喜欢
  • 2023-04-07
  • 2018-06-24
  • 1970-01-01
  • 2019-08-27
  • 2021-09-02
  • 2013-03-12
  • 2020-01-10
  • 2019-01-30
  • 2018-07-16
相关资源
最近更新 更多