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

有没有办法在没有循环的情况下做到这一点?提前致谢

4

4 回答 4

12

这就是我要用的!

sum(x) * sum(y)
# [1] 66
于 2012-10-16T22:38:45.193 回答
5

尝试:

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
于 2012-10-16T22:37:48.567 回答
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))
于 2012-10-16T22:40:11.290 回答
4

我们可以使用x %*% t(y)得到一个包含我们想要的产品的矩阵,然后sum将矩阵中的所有内容加在一起。

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

以及同样想法的稍微高效的版本(感谢 Gavin)

sum(tcrossprod(x, y))
#[1] 66
于 2012-10-16T23:18:28.230 回答