2012-10-16 158 views
6

我有兩個向量:如何在沒有循環的情況下乘以向量?

x = c(1,2,3) 
y = c(4,5,2) 

,我要乘的x每個元素在y每個元素,然後總括起來。所以我想要做的事情是沿線的:

1*(4 + 5 + 2) + 2*(4 + 5 + 2) + 3*(4 + 5 + 2) = 11 + 22 + 33 = 66 

有沒有辦法做到沒有循環?在此先感謝

+1

很多方法!你試過什麼了?你有沒有找到'?sum'? – Justin

回答

12

這是我想要的使用!

除了喬什
sum(x) * sum(y) 
# [1] 66 
+6

不公平!你用_math_! – joran

+0

這就是作弊!!!!!!! :)爲簡單化的方法+1。邏輯擊敗編程技巧。 –

+0

那麼我被標記爲遷移到math.stackexchange.com? –

5

嘗試:

sum(x*sum(y)) 
[1] 66 

矢量化運營整潔!

?mapply也是一個方便的功能,記住做這些類型任務時: 如:

mapply("*",x,y) 

...會做X [1] * Y [1],X [2] * Y [2]等...以產生

mapply("*",x,y) 
[1] 4 10 6 

概要的功能類似於sum也可以在一側上使用,如:

mapply("*",x,sum(y)) 
[1] 11 22 33 

這意味着做你的計算也將是一個長期的手道:

sum(mapply("*",x,sum(y))) 
[1] 66 
5

三個其他的想法和thelatemail的優秀想法:

sum(do.call("*", expand.grid(x, y))) 
sum(outer(x, y)) ## or equivalently: sum(x %o% y) 
sum(sapply(split(x, x), function(z) z * y)) 
+0

並且作爲第二個「總和」(外(x,y,「*」))的更明確的變體' – Henry

4

我們可以使用x %*% t(y)得到有我們想要的,然後只用sum在基質中添加一切融合在一起的產品矩陣。

sum(x %*% t(y)) 
#[1] 66 

而這同樣的想法的一個稍微更高效的版本(感謝加文)

sum(tcrossprod(x, y)) 
#[1] 66 
+1

另一個數學作弊者:P + 1 –

+0

+1'tcrossprod(x,y)'應該是輕微的更高效的'x%*%t(y)'版本。 –

相關問題