1

我有两个标量值的x_i函数y_j。我有一个包含 n 个x_i值、X 和 n 个y_j值的向量,例如

myfunction <- function(x,y) min(x,y)
X <- 1:3
Y <- 2:4

我想用 $n$ 填充 $n$ 矩阵,其元素(i,j)myfunction(x_i, y_j). 有很多方法可以做到这一点R,我很好奇它们的相对表现。

例如,这似乎是 的任务outer,但它似乎会混淆是否将向量或标量传递给myfunction。首先考虑:

r outer(X, Y, paste)

给我每一对

     [,1]  [,2]  [,3] 
[1,] "1 2" "1 3" "1 4"
[2,] "2 2" "2 3" "2 4"
[3,] "3 2" "3 3" "3 4"

看起来挺好的。但

outer(X, Y, myfunction)

抛出错误:

Error: dims [product 9] do not match the length of object [1]

同时,其他可能的函数似乎与我对标量的预期一样,例如:

myfunction <- function(x,y) exp((x-y)^2)

效果很好

outer(X, Y, myfunction)


         [,1]      [,2]        [,3]
[1,] 2.718282 54.598150 8103.083928
[2,] 1.000000  2.718282   54.598150
[3,] 2.718282  1.000000    2.718282

在一些快速的数值实验中,这似乎比 略快expand.grid,并且函数调用更紧凑,但我似乎不明白为什么有些函数看起来像我预期的那样工作,而另一些则没有。

经典expand.grid解决方案还要求函数使用向量参数,这对于我的示例来说意味着非常不同的事情min; 同一问题的不同版本。有没有办法强制我的函数的参数必须是标量而不是向量这一事实?

4

1 回答 1

3

传递给外部的函数必须是矢量化的,

从源代码

   FUN <- match.fun(FUN)
        Y <- rep(Y, rep.int(length(X), length(Y)))
        if (length(X)) 
            X <- rep(X, times = ceiling(length(Y)/length(X)))
        robj <- FUN(X, Y, ...)
        dim(robj) <- c(dX, dY)

min将返回一个数字,你会想要pmin.

更一般地,您可以使用 Vectorize。

于 2012-10-26T06:09:48.357 回答