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

时间:2019-09-13 22:45:06

标签: r loops

我需要计算这个

enter image description here

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

在R中对此最有效的计算是什么?

一种方法是double for循环,但这显然很慢。

2 个答案:

答案 0 :(得分:3)

一种快速的操作方法如下:

假设我们有这个向量:

x = c(0,1,2)

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

现在,我们使用expand.grid.unique custom function在向量中产生唯一的组合;换句话说,它类似于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

答案 1 :(得分:2)

请参见?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