我有兩個向量:如何在沒有循環的情況下乘以向量?
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
有沒有辦法做到沒有循環?在此先感謝
我有兩個向量:如何在沒有循環的情況下乘以向量?
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
有沒有辦法做到沒有循環?在此先感謝
這是我想要的使用!
除了喬什sum(x) * sum(y)
# [1] 66
不公平!你用_math_! – joran
這就是作弊!!!!!!! :)爲簡單化的方法+1。邏輯擊敗編程技巧。 –
那麼我被標記爲遷移到math.stackexchange.com? –
嘗試:
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
三個其他的想法和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))
並且作爲第二個「總和」(外(x,y,「*」))的更明確的變體' – Henry
我們可以使用x %*% t(y)
得到有我們想要的,然後只用sum
在基質中添加一切融合在一起的產品矩陣。
sum(x %*% t(y))
#[1] 66
而這同樣的想法的一個稍微更高效的版本(感謝加文)
sum(tcrossprod(x, y))
#[1] 66
另一個數學作弊者:P + 1 –
+1'tcrossprod(x,y)'應該是輕微的更高效的'x%*%t(y)'版本。 –
很多方法!你試過什麼了?你有沒有找到'?sum'? – Justin