Я оценки this formula (от Székely and Rizzo, 2013, страниц 1263), в которой a
и b
симметричны, n
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
@ExperimenteR Вот почему я написал его как можно более четко и педантично в цикле 'for'. Я бы написал это с помощью MathJax, но у нас его нет на этом сайте. – shadowtalker
Googled для открытого доступа. У тех же авторов есть r-пакет с именем 'energy'. – ExperimenteR