我有两个向量:
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
有没有办法没有循环呢?提前致谢
答案 0 :(得分:12)
这就是我要用的东西!
sum(x) * sum(y)
# [1] 66
答案 1 :(得分:5)
尝试:
sum(x*sum(y))
[1] 66
矢量化运算符很整洁!
在执行这些类型的任务时, ?mapply
也是一个方便的功能:
E.g:
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
答案 2 :(得分:5)
除了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))
答案 3 :(得分:4)
我们可以使用x %*% t(y)
来获取包含我们所需产品的矩阵,然后使用sum
将矩阵中的所有内容添加到一起。
sum(x %*% t(y))
#[1] 66
这个想法的效率稍高一点(感谢Gavin)
sum(tcrossprod(x, y))
#[1] 66