我有两个向量:
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
尝试:
sum(x*sum(y))
[1] 66
矢量化运算符很整洁!
?mapply
在执行这些类型的任务时要记住一个方便的功能:例如:
mapply("*",x,y)
...会做 x[1] * y[1], x[2] * y[2] etc... 来产生
mapply("*",x,y)
[1] 4 10 6
像这样的汇总函数sum
也可以在一侧使用,例如:
mapply("*",x,sum(y))
[1] 11 22 33
这意味着进行计算的长期方法也将是:
sum(mapply("*",x,sum(y)))
[1] 66
除了 Josh 和 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 %*% t(y)
得到一个包含我们想要的产品的矩阵,然后sum
将矩阵中的所有内容加在一起。
sum(x %*% t(y))
#[1] 66
以及同样想法的稍微高效的版本(感谢 Gavin)
sum(tcrossprod(x, y))
#[1] 66