2011-10-05 23 views

回答

6

我認爲你可能在尋找outer這不完全是你的代碼所做的,但它很接近。具體而言,outer將返回矩陣(即外部產品)或其前兩個參數的元素的每個組合。

您可能想要存儲結果,然後將較低的三角形作爲矢量提取。事情是這樣的,也許:

rs <- outer(1:4,-(5:7),"+") 
rs[lower.tri(rs,diag = TRUE)] 
[1] -4 -3 -2 -1 -4 -3 -2 -4 -3 
+0

謝謝!我如何定義一個自定義函數以在外部使用?你介意舉個例子嗎?我在嘗試這些時遇到了錯誤,而且我的錯誤消息是中文的,所以我猜測發佈它們會有一點幫助。 –

+1

@SpiritZhang:'emulatesum <-function(x,y)return(x + y)'作爲函數,然後是rs < - outer(1:4, - (5:7),「emulatesum」)'。順便說一句:我強烈建議在英文中使用R,特別是對於錯誤消息:當你使用英文搜索它們時,使用Google搜索它們會容易得多... –

+0

@NickSabbe:謝謝Nick!我在安裝R時沒注意語言。由於我在中國,我想這就是爲什麼R使中文成爲默認語言的原因。 –

0

它很容易與do.callexpand.grid做:

x <- seq(0,10, length.out=10) 
> y <- seq(-1,1, length.out=5) 
> d1 <- expand.grid(x=x, y=y) 
> do.call("*", d1) 
[1] 0.0000000 -1.1111111 -2.2222222 -3.3333333 -4.4444444 
[6] -5.5555556 -6.6666667 -7.7777778 -8.8888889 -10.0000000 
[11] 0.0000000 -0.5555556 -1.1111111 -1.6666667 -2.2222222 
[16] -2.7777778 -3.3333333 -3.8888889 -4.4444444 -5.0000000 
[21] 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 
[26] 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 
[31] 0.0000000 0.5555556 1.1111111 1.6666667 2.2222222 
[36] 2.7777778 3.3333333 3.8888889 4.4444444 5.0000000 
[41] 0.0000000 1.1111111 2.2222222 3.3333333 4.4444444 
[46] 5.5555556 6.6666667 7.7777778 8.8888889 10.0000000 
+0

太好了,但請注意,在這種情況下,只有矢量化函數才能與'do.call'一起使用。例如do.call(mean,d1)失敗。 – kohske

+0

所以也許它應該是'do.call(「mapply」,c(fun,d1))''。 – kohske

+0

有趣的想法。它似乎與do.call(expand.grid(。))''Vectorize'用'sapply'做了什麼。 –

1

一個例子

func <- function(x,y) {sqrt(x^2+y^2)} 
v1 <- c(1,3,5) 
v2 <- c(0,-4,-12) 
ret <- outer(v1,v2,"func") 

你再有

> ret 
    [,1]  [,2]  [,3] 
[1,] 1 4.123106 12.04159 
[2,] 3 5.000000 12.36932 
[3,] 5 6.403124 13.00000 

或如果你想要什麼你的for循環會產生

> as.vector(t(ret)) 
[1] 1.000000 4.123106 12.041595 3.000000 5.000000 12.369317 5.000000 
[8] 6.403124 13.000000