双重求和计算,最有效的方法是什么?

5

我需要计算这个:

enter image description here

其中x是长度为n的向量,f是一个函数。

在R中,最有效的计算方法是什么?

一种方法是使用双重for循环,但这显然很慢。


你可以将其简化为 sum^n_{i = 1} f(x_i, x_n),因为 j \geq n 和 length(x) = n 意味着内部求和是多余的。 - Hugh
2个回答

3

以下是一种快速的方法:

假设我们有这个向量:

x = c(0,1,2)

例如,假设n=3,并且假设f是一个乘法函数:

现在,我们使用expand.grid.unique 自定义函数,它可以在向量内生成唯一的组合;换句话说,它类似于基础函数expand.grid,但可以产生唯一的组合:

expand.grid.unique <- function(x, y, include.equals=FALSE)
{
    x <- unique(x)

    y <- unique(y)

    g <- function(i)
    {
        z <- setdiff(y, x[seq_len(i-include.equals)])

        if(length(z)) cbind(x[i], z, deparse.level=0)
    }

    do.call(rbind, lapply(seq_along(x), g))
}

在我们的向量案例中,当我们运行expand.grid.unique(x,x)时,它会产生以下结果:
> expand.grid.unique(x,x)
     [,1] [,2]
[1,]    0    1
[2,]    0    2
[3,]    1    2

让我们将two_by_two赋值给它:

two_by_two <- expand.grid.unique(x,x)

由于我们假设函数是乘法,因此我们需要计算和积,即two_by_two的第一列和第二列的点积。为此,我们需要使用%*%运算符:

output <- two_by_two[,1] %*% two_by_two[,2]
> output
     [,1]
[1,]    2

2

See ?combn

x <- 0:2
combn(x, 2)

# unique combos
     [,1] [,2] [,3]
#[1,]    0    0    1
#[2,]    1    2    2

sum(combn(x, 2))
#[1] 6

combn() 函数可以创建所有唯一的组合。如果您想要对一个函数进行求和,可以在调用时添加一个 FUN 参数:

random_f <- function(x){x[1] + 2 * x[2]}

combn(x, 2, FUN = random_f)
#[1] 2 4 5

sum(combn(x, 2, FUN = random_f))
#[1] 11

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接