2015-04-06 7 views
0

Я оценки this formula (от Székely and Rizzo, 2013, страниц 1263), в которой a и b симметричны, nn матрицы матрицы с размерностью.Как векторизовать эту математическую формулу?

Как я могу векторизовать секцию с вложенным циклом 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.

+0

Не у всех есть доступ к вашей формуле позади платного доступа. – ExperimenteR

+0

@ExperimenteR Вот почему я написал его как можно более четко и педантично в цикле 'for'. Я бы написал это с помощью MathJax, но у нас его нет на этом сайте. – shadowtalker

+0

Googled для открытого доступа. У тех же авторов есть r-пакет с именем 'energy'. – ExperimenteR

ответ

3

Это может быть легко векторизованы

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) 
} 
+1

Могу я просто сделать 'b. <- matrix (.colSums (b, n, n), n, n) ", а затем" B1 <- mean (b.) - 2 * b. - 2 * t (b.) + 2 * b'? – shadowtalker

+0

Также обратите внимание, что я отредактировал OP после того, как вы указали, что я написал «означает», когда я имел в виду «суммы» – shadowtalker

+0

. Это лучше. – Khashaa

Смежные вопросы