在R中传递超过2个向量

时间:2017-08-11 18:04:47

标签: r

我想为e^(ax+b) over a=-1:1的各种值计算b=-1:1X。我希望表单中的输出包含5个元素的列表。列表中的每个元素都是3X3 Matrix。

我使用Outer和Vectorize实现了这一目标。

 sigm = function(a=0,b=0,x){
 return(exp(x*a+b))
 }

 sigm1 = Vectorize(function(a=-1:1,b=-1:1,x){

 outer(a,b,sigm,x)
 },SIMPLIFY = FALSE)

现在,sigm1(x=1:3)提供了所需的输出

 [[1]]
      [,1]      [,2]     [,3]
 [1,] 0.1353353 0.3678794 1.000000
 [2,] 0.3678794 1.0000000 2.718282
 [3,] 1.0000000 2.7182818 7.389056

[[2]]
       [,1]      [,2]       [,3]
[1,] 0.04978707 0.1353353  0.3678794
[2,] 0.36787944 1.0000000  2.7182818
[3,] 2.71828183 7.3890561 20.0855369

[[3]]
       [,1]        [,2]       [,3]
[1,] 0.01831564  0.04978707  0.1353353
[2,] 0.36787944  1.00000000  2.7182818
[3,] 7.38905610 20.08553692 54.5981500

此代码段的唯一缺点是我使用的是默认值a=-1:1b=-1:1。当我在函数调用期间尝试传递相同内容时,它会变得混乱。 E.g。

sigm1(-1:1,-1:1,1:3)

[[1]]
      [,1]
[1,] 0.1353353

[[2]]
 [,1]
[1,]    1

[[3]]
     [,1]
[1,] 54.59815

我无法弄清楚为什么传递参数会使输出产生差异。

1 个答案:

答案 0 :(得分:1)

您可以使用sapply创建矢量化功能

sigm = function(a, b, x){
    return(lapply(x, function(xx) sapply(b, function(bb)
        sapply(a, function(aa) exp(xx*aa+bb)))))
}
sigm(a = -1:1, b = -1:1, x = 1:3)
#[[1]]
#          [,1]      [,2]     [,3]
#[1,] 0.1353353 0.3678794 1.000000
#[2,] 0.3678794 1.0000000 2.718282
#[3,] 1.0000000 2.7182818 7.389056

#[[2]]
#           [,1]      [,2]       [,3]
#[1,] 0.04978707 0.1353353  0.3678794
#[2,] 0.36787944 1.0000000  2.7182818
#[3,] 2.71828183 7.3890561 20.0855369

#[[3]]
#           [,1]        [,2]       [,3]
#[1,] 0.01831564  0.04978707  0.1353353
#[2,] 0.36787944  1.00000000  2.7182818
#[3,] 7.38905610 20.08553692 54.5981500