2017-08-11 83 views
0

我想計算e^(ax+b) over a=-1:1b=-1:1以獲得各種值X。我希望輸出形式爲5個元素的列表。列表中的每個元素都是3X3矩陣。嘗試將超過2個向量傳遞給函數R

我用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的默認值。當我在函數調用期間嘗試通過它時,它會失靈。例如。

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

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

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

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

我無法弄清楚爲什麼傳遞參數會在輸出中產生這種差異。

+1

你可能需要命名'x'說法。 R中的未命名參數按位置傳遞。你也可以重寫這個函數,所以'x'是第一個參數。 –

+0

我用這個代碼檢查了'sigm1(a = -1:1,b = -1:1,x = 1:3)';仍然不起作用 – kasa

回答

4

在這種情況下,您應該只將變量向量化爲x

sigm1 = Vectorize(function(a=-1:1,b=-1:1,x){ 
        outer(a,b,sigm,x)}, vectorize.args = "x" ,SIMPLIFY = FALSE) 

然後運行sigm1(-1:1,-1:1,1:3)會給出你想要的結果。

2

我們可以只使用lapply並且不需要Vectorize都:

lapply(x, function(x) outer(a, b, sigm, x = x)) 

,並提供:

[[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