【发布时间】:2015-04-06 13:50:44
【问题描述】:
我正在评估this formula(来自Székely and Rizzo, 2013,第1263 页),其中a 和b 是对称的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 <- a * b,但我想展开整个公式只是为了演示基础数学。我正在寻找u2 和u3 的类似矢量化。
【问题讨论】:
-
不是每个人都可以访问付费墙后面的公式。
-
@ExperimenteR 这就是为什么我在
for循环中尽可能清晰和迂腐地编写它的原因。我会用 MathJax 把它写出来,但我们在这个网站上没有。 -
谷歌搜索开放访问。同一作者有一个名为
energy的 r 包。 -
@ExperimenteR 我很清楚。我也没有找到这篇特定论文的开放获取版本。您介意分享链接以便我将其添加到我的帖子中吗?
-
@ExperimenteR 我添加了一个指向 Overleaf 文档的链接,其中包含论文中出现的公式
标签: r math matrix vectorization