如何在没有循环的情况下乘以向量?

时间:2012-10-16 22:30:15

标签: r

我有两个向量:

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

有没有办法没有循环呢?提前致谢

4 个答案:

答案 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